일반적인 데이터 흐름
클라이언트 요청 → Pydantic 모델(검증) → 비즈니스 로직 → SQLAlchemy 모델(저장) → 데이터베이스
데이터베이스 → SQLAlchemy 모델(조회) → 비즈니스 로직 → Pydantic 모델(API응답 형식으로 직렬화) → 클라이언트 응답
파일 분리 목적
: 데이터베이스 스키마가 변경(SQLAlchemy에서 처리)되더라도 API는 안정적으로 유지(Pydantic에서 처리)될 수 있고,
API 요구사항이 변경되더라도 데이터베이스 구조는 보존
🔵 SQLAlchemy 모델(models.py)과 Pydantic 모델(schemas.py)의 차이점
- 목적의 차이
- SQLAlchemy 모델(models.py)
- 데이터베이스 테이블 구조 정의와 ORM 매핑이 주 목적
- 데이터베이스와 직접 상호작용
- Pydantic 모델(schemas.py)
- API 요청/응답 데이터의 검증 및 직렬화/역직렬화가 주 목적
- 주로 HTTP 요청과 응답 사이에서 데이터를 처리
- SQLAlchemy 모델(models.py)
- 역할의 차이
- SQLAlchemy: 데이터베이스 읽기/쓰기 작업 수행, 스키마 마이그레이션, 관계 정의 등 데이터베이스 관련 작업을 처리
- Pydantic: 입력 데이터 검증, 출력 데이터 포맷팅, 문서화(OpenAPI/Swagger) 등 API 관련 작업을 처리
- 사용 시점
- SQLAlchemy: 데이터베이스와 상호작용할 때 사용
- Pydantic: API 요청을 받거나 응답을 보낼 때 사용
왜 두 가지 모델이 모두 필요한가?
FastAPI와 같은 현대적인 웹 프레임워크에서는 이 두 가지 모델을 분리하는 것이 일반적인 패턴이다.
- 관심사 분리: 데이터베이스 로직과 API 로직을 분리
- 보안: Pydantic 모델을 통해 API에 노출할 필드와 데이터베이스에 저장할 필드를 분리
- 유연성: 데이터베이스 스키마와 API 스키마를 독립적으로 진화시킬 수 있음
- 성능: 각 계층에 최적화된 라이브러리 사용 가능