Backend/FastAPI

SQLAlchemy

지미닝 2024. 3. 18. 20:30

원래 글: https://velog.io/@stopmin/SQLAlchemy

✏️ 정리 계기

저번에 CRUD,TODO 클론코딩하고 쓴 게시물에 보면 계속 import sqlalchemy하던데 저게 정확히 무슨 기능을 하는지 궁금했다.
그런데 당장에 정리하기에는 좀 버거움이 있고, 내용이 상당히 많은지라 따로 정리하면 좋을 것 같아서 이렇게 따로 정리하길 다짐했고 더 늦기 전에 지금 해둬야겠다고 생각했다!

🤔 ORM이 무엇인가?

이번 내용이 방대하게 느껴졌던 이유는 먼저 ORM이 무엇인지에 관해 알아야 했기 때문이다.

ORM(Object Relational Mapping)이라 함은, 객체-관계 매핑이다.

객체 관계 mapping?

데이터베이스 내의 리소스(테이블)들을 객체화하여, 각 DBMS(MySQL, MSSQL 등)들에 대해서 CRUD 등을 공통된 접근기법으로 사용할 수 있다.

  • 객체와 관계형 데이터베이스의 데이터를 자동으로 매핑(연결)해주는 것을 말한다.
    • 객체 지향 프로그래밍은 클래스를 사용하고, 관계형 데이터베이스는 테이블을 사용한다.
    • 객체 모델과 관계형 모델 간에 불일치가 존재한다.
    • ORM을 통해 객체 간의 관계를 바탕으로 SQL을 자동으로 생성하여 불일치를 해결한다.
  • 데이터베이스 데이터 <—매핑—> Object 필드
    • 객체를 통해 간접적으로 데이터베이스 데이터를 다룬다.
      Persistant API라고도 할 수 있다.
    • Ex) JPA, Hibernate

즉, 이 친구를 잘 다룰 줄 안다면 Database를 생성, 수정, 삭제를 할 수 있게 된다.

DBSM

데이터베이스 관리 시스템(DBMS: Database Management System)

  • 데이터베이스에 적재된 데이터 작업을 수행한다.
  • 데이터베이스를 보호하고 보안을 제공한다.
  • 데이터베이스 관리 시스템의 기능은 크게 구성(정의), 조작, 제어 기능으로 나눌 수 있다.

🧐 그래서 왜 ORM을 사용하는가?

  1. DBMS에 대한 종속성이 사라진다.
    ORM에 대한 이해만으로 웬만한 CRUD를 다룰 수 있다.
    (Object에 집중함으로 극단적으로 DBMS를 교체하는 거대한 작업에도 비교적 적은 리스크와 시간이 소요된다.)

  2. 객체를 통하여 대부분의 데이터를 접근 및 수정을 진행하므로, 코드 가독성이 좋다.
    각종 객체에 대한 코드를 별도로 작성하기 때문에 코드의 가독성을 올려준다.
    SQL의 절차적이고 순차적인 접근이 아닌 객체 지향적인 접근으로 인해 생산성이 증가한다.

  3. 데이터 구조 변경시, 객체에 대한 변경만 이루어지면 되므로, 유지보수성이 좋다.
    ORM은 독립적으로 작성되어있고, 해당 객체들을 재활용 할 수 있다.

단점은 무엇인가?

  • 완벽한 ORM 으로만 서비스를 구현하기가 어렵다.
    • 사용하기는 편하지만 설계는 매우 신중하게 해야한다.
    • 프로젝트의 복잡성이 커질경우 난이도 또한 올라갈 수 있다.
    • 잘못 구현된 경우에 속도 저하 및 심각할 경우 일관성이 무너지는 문제점이 생길 수 있다.
    • 일부 자주 사용되는 대형 쿼리는 속도를 위해 SP를 쓰는등 별도의 튜닝이 필요한 경우가 있다.
    • DBMS의 고유 기능을 이용하기 어렵다. (하지만 이건 단점으로만 볼 수 없다 : 특정 DBMS의 고유기능을 이용하면 이식성이 저하된다.)
  • 프로시저가 많은 시스템에선 ORM의 객체 지향적인 장점을 활용하기 어렵다.
    • 이미 프로시저가 많은 시스템에선 다시 객체로 바꿔야하며, 그 과정에서 생산성 저하나 리스크가 많이 발생할 수 있다.

프로시저?

데이터베이스에 대한 일련의 작업을 정리한 절차를 관계형 데이터베이스 관리 시스템에 저장한 것으로 영구저장모듈(Persistent Storage Module)이라고도 불린다.
보통 저장 프로시저를 프로시저라고 부르며, 일련의 쿼리를 마치 하나의 함수처럼 실행하기 위한 쿼리의 집합이다.

🤔 SQLchemy는 결국 무엇인가?

  • ORM을 사용하면 개발자가 SQL 대신 python 코드로 생성, 읽기, 수정 및 삭제 할 수 있다.

  • 개발자는 SQL문 쓰거나 프로시저를 작성하는 대신에 데이터베이스를 사용하여 편한 프로그래밍 언어를 사용할 수 있다.

  • ORM을 사용하여 이론적으로 다양한 관계형 데이터베이스 간에 응용 프로그램을 바꿀 수 있다.

  • 그렇지만 연습으로는, 실제로 사용되는 것과 동일한 데이터베이스를 로컬에서 개발하는 것이 가장 좋다.

  • 파이썬 ORM 라이브러리 -> 파이썬 코드에서 데이터베이스와 연결하기 위해 사용할 수 있는 라이브러리

  • SQLAlchemy은 잘 알려진 데이터베이스 툴킷이며 ORM 구현은 파이썬으로 작성되었다.

  • SQLAlchemySQL문을 작성할 필요없이 데이터베이스에 독립적인 코드를 작성하고 실행하기 위한 일반화 된 인터페이스를 제공한다.

✏️ 아쉬운 점과 앞으로 해나가야할 것

  1. SQL query를 써보진 못해서 이것도 나중에 써보고 SQLchemy랑 비교해서 어떤지 느껴보고 싶다.
    개념 획득에 집중해서 그런지 직접 비교해보고 싶은 마음도 들었다.
  2. 공식 문서를 많이 참고해서 공부하자!!
    다른 사람들의 글도 좋지만 앞으로는 공식 문서의 글을 보고 직접 해석하면서 예쁘게 정리하는 방법도 익힐 필요가 있다고 느꼈다. 화이팅!!😊

참고 페이지

취미와 밥줄사이
gmlwjd9405님의 깃허브 블로그
김치 카스테라
프로시저
sugenius77

'Backend > FastAPI' 카테고리의 다른 글

AID backend project 추가 정리  (1) 2024.03.18
DockerCompose & MongoDB  (4) 2024.03.18
[FastAPI] CloneCoding (CRUD, ToDO-list)  (2) 2024.03.18
Pytest & Github action & Docker  (0) 2024.03.18
Pyenv & Pipenv 실습  (0) 2024.03.18