← 모든 글

Pydantic v1 → v2 마이그레이션 한 주

"한 시간이면 된다" 던 마이그레이션이 한 주가 됐다 — 무엇이 바뀌었나.

Pydantic v2 가 나온 지 한참 됐는데도 우리 코드는 v1 에 머물러 있었다. “deprecated 경고” 가 매 빌드마다 5줄씩 떠서 한 번 정리하기로.

한 시간이면 된다고 생각한 이유

bump-pydantic 자동 변환 도구가 있다. 대부분의 변경은 syntax 수준 — class Config:model_config: ConfigDict 같은.

실제로 한 주 걸린 이유

  1. validatorfield_validator: 자동 변환되지만, 기존 v1 validator 에서 다른 필드를 참조하던 곳 (values: dict 인자) 은 field_validator 에서 info: ValidationInfo 로 바뀐다. 자동 변환이 syntax 만 바꿔놓고 동작은 깨졌다.
  2. json_encoders: v2 에서 사라졌다. custom datetime serialize 가 다 멈췄다. @field_serializer 로 다시 작성.
  3. Optional[X] = None 인데 None 이 안 들어가: v2 에서는 Optional[X] 만 적으면 default 가 없다. Optional[X] = None 또는 X | None = None 명시 필요. v1 에선 그냥 됐다.
  4. .dict().model_dump(): 코드 베이스 80곳. IDE 일괄 치환은 됐지만, .dict(exclude_unset=True) 같은 인자명도 일부 바뀌어 잘 안 됐다.

효과

런타임 검증이 3~10배 빨라졌다 (Rust 코어). 안 그래도 ETL 의 검증 단계가 핫 패스였는데 체감이 났다.

다음에는 다르게 할 한 가지

major version 마이그레이션은 자동 도구를 믿지 말고 직접 변경 로그 한 번 읽기. “deprecation 만 정리하면 되겠지” 는 함정. 행동이 바뀐 곳을 미리 알아야 테스트가 잘 잡힌다.


🛒 이 글과 어울리는 추천 상품

위 링크는 쿠팡파트너스 활동의 일환이며, 일정액의 수수료를 제공받을 수 있습니다.