SQLAlchemy 아키텍처 — 백엔드 학습 초보자의 메모
Source: Dev.to
위에 제공된 텍스트 외에 번역할 내용이 없습니다. 번역이 필요한 전체 텍스트를 제공해 주시면 한국어로 번역해 드리겠습니다.
SQLAlchemy가 무엇인지 (간단히)
SQLAlchemy는 관계형 데이터베이스와 작업하기 위해 사용되는 파이썬 라이브러리입니다.
처음에 저는 ORM이 “SQL이 필요 없는” 것이라고 생각했습니다. SQLAlchemy는 그 생각이 틀렸음을 증명했습니다.
SQLAlchemy를 사용하면:
- SQL은 여전히 중요합니다
- 테이블과 관계는 여전히 중요합니다
- 파이썬 객체는 선택 사항이며, 필수는 아닙니다
데이터베이스를 숨기지는 않으며, 신중하게 노출합니다.
“데이터베이스 추상화”의 진짜 문제
Many tools try to make databases feel invisible:
- No SQL
- No schema thinking
- No joins or constraints visible
This feels comfortable but breaks reality.
Relational databases are powerful because they are strict:
- Schemas exist for a reason
- Relations are explicit
- SQL has rules
Objects want flexibility. Databases demand accuracy. This conflict always exists.
SQLAlchemy does not try to escape this conflict.
SQLAlchemy의 핵심 철학
SQLAlchemy는 개발자를 데이터베이스로부터 보호하려 하지 않습니다.
그 사상:
- 관계를 이해해야 합니다
- SQL을 직접 확인해야 합니다
- 자동화는 반복을 줄여야지 사고를 줄이는 것이 아닙니다
그래서 SQLAlchemy는 자신을 툴킷이라고 부르며, 프레임워크라고 부르지 않습니다.
추상화가 누출되도록 허용합니다:
- 무슨 일이 일어나고 있는지 볼 수 있습니다
- 동작을 제어할 수 있습니다
- 강제되거나 숨겨진 것이 없습니다
Core vs ORM (이해하는 데 시간이 걸렸다)
Core
Core는 기본입니다. 다음을 처리합니다:
- 데이터베이스 드라이버 통신
- SQL 구성
- 테이블 및 컬럼 정의
- 연결 및 실행
중요한 점:
- Core는 ORM 없이도 작동합니다
- Core는 SQL에 가깝게 유지됩니다
- Core는 언제든지 사용할 수 있습니다
이것은 SQLAlchemy가 ORM과 동일하다는 제 혼란을 해소했습니다.
ORM
ORM은 Core 위에 구축됩니다. 다음을 추가합니다:
- Python 클래스를 테이블에 매핑
- 식별자 추적
- 변경 추적 및 영속성
핵심 아이디어:
- ORM은 선택 사항입니다
- ORM은 Core에 대한 접근을 차단하지 않습니다
- 언제든지 Core로 내려갈 수 있습니다
이러한 분리는 솔직하게 느껴집니다.
Cost of This Design
Because everything is layered:
- Many function calls happen
- Python function calls are slow
SQLAlchemy reduces this by:
- Optimizing hot paths
- Inlining logic
- Using C extensions where needed
The design stays clean instead of being rewritten in low‑level code.
DBAPI만으로는 충분하지 않은 이유
DBAPI는 단지 느슨한 사양일 뿐입니다. 드라이버마다 동작이 다릅니다:
- 유니코드 처리 방식이 다름
- 바이너리 처리 방식이 다름
- 파라미터 스타일이 다름
- 마지막 삽입된 ID를 가져오는 방법이 다름
이러한 불일치는 위험합니다. SQLAlchemy는 이러한 차이를 표준화하기 위해 존재합니다.
엔진, 연결, 결과 (정신 모델)
SQLAlchemy는 원시 데이터베이스 접근을 명확한 계층으로 래핑합니다.
- Engine – 진입점. 어떤 데이터베이스와 드라이버를 사용할지 알고 있습니다.
- Connection – 실제 데이터베이스 연결 하나를 나타냅니다.
- Result – 반환된 행과 메타데이터를 깔끔하게 래핑합니다.
직접적인 DBAPI 사용이 사라집니다.
Dialect (핵심 개념)
Dialect는 다음을 정의합니다:
- 데이터베이스에 대한 SQL 형식
- 드라이버별 동작
- 형 변환
- 파라미터 포맷팅
각 Dialect가 목표로 하는 것은:
- 하나의 데이터베이스
- 하나의 드라이버
이는 SQLAlchemy가 여러 데이터베이스를 깔끔하게 지원하는 방식을 설명합니다.
ExecutionContext
쿼리가 실행될 때마다:
- 짧은 수명의 실행 객체가 생성됩니다
- 런타임 세부 정보가 여기서 처리됩니다
- SQL, 매개변수 및 결과가 연결됩니다
방언은 규칙을 정의하고, ExecutionContext는 런타임에 이를 적용합니다.
많은 데이터베이스를 지원하는 드라이버 처리
일부 드라이버는 여러 데이터베이스와 통신합니다. SQLAlchemy는 이를 다음과 같이 처리합니다:
- 공통 동작을 공유함
- 필요한 경우에만 데이터베이스‑별 로직을 추가함
중복 없음. 추측 없음.
최종 이해
내가 배운 가장 중요한 점:
관계형 데이터베이스는 본질적으로 엄격합니다. SQLAlchemy는 그 사실을 부정하지 않습니다.
그 대신에, SQLAlchemy는:
- 규칙을 명확히 보여줍니다
- 반복 작업을 자동화합니다
- 개발자에게 제어권을 유지시켜 줍니다
- 순수 SQL에서 ORM까지 부드럽게 확장됩니다
이 설계는 마법이 아니라 현실적인 접근이라고 느껴집니다.