FastAPI에서 Pydantic V2 마이그레이션 대응하기

문제 상황

사내 API 서버에 FastAPI 0.95를 사용 중인데, 최근 의존성 업데이트 후 일부 validator가 동작하지 않는 문제가 발생했다. 확인해보니 Pydantic V2 베타 버전이 설치되면서 생긴 이슈였다.

Pydantic V2의 주요 변경사항

Pydantic V2는 Rust로 재작성되어 성능이 크게 개선되었지만, Breaking Change가 많았다.

  • @validator@field_validator로 변경
  • Config 클래스 대신 model_config 딕셔너리 사용
  • parse_obj()model_validate()
  • dict()model_dump()

임시 해결

당장 전체 마이그레이션은 어려워 requirements.txt에 버전을 명시했다.

fastapi==0.95.2
pydantic==1.10.8

V2 대응 준비

기존 코드 중 V2에서 문제될 부분을 미리 체크해두었다.

# V1 (현재)
class UserCreate(BaseModel):
    email: str
    
    @validator('email')
    def validate_email(cls, v):
        if '@' not in v:
            raise ValueError('invalid email')
        return v

# V2 (향후)
class UserCreate(BaseModel):
    email: str
    
    @field_validator('email')
    @classmethod
    def validate_email(cls, v):
        if '@' not in v:
            raise ValueError('invalid email')
        return v

FastAPI 공식적으로 Pydantic V2를 지원하는 버전이 나올 때까지는 V1을 유지하기로 했다. 다만 새로 작성하는 코드는 최대한 V2 스타일과 호환되도록 작성하는 것이 좋겠다는 판단이다.