← 모든 글

Pydantic 으로 운영 데이터를 검증하기 시작했다

타입 힌트는 정적 검증만 해준다. 운영에서 들어오는 데이터는 결국 런타임에 깨졌다 — Pydantic 으로 바꾼 후의 한 달.

def parse(payload: dict) -> Article: 라고 적어놓고 잘 돌아간다고 믿었다.

실제로 한 달에 두세 번씩 KeyErrorTypeError 가 났다. 외부 RSS / API 응답 스키마는 예고 없이 바뀐다. 타입 힌트는 위안일 뿐, 런타임에 도와주지 않는다.

Pydantic 으로 옮기는 데 걸린 시간

워크플로우 4개를 옮기는 데 하루. 모델 정의는 단순했다.

from pydantic import BaseModel, HttpUrl, Field

class Article(BaseModel):
    title: str
    link: HttpUrl
    summary: str = ''
    tags: list[str] = Field(default_factory=list)
    published_at: datetime

기존 dict 처리 코드를 Article.model_validate(payload) 한 줄로 대체하고, ValidationError 만 catch.

즉시 잡힌 사건

배포한 그 주에 RSS 한 곳이 pubDate 대신 published_parsed 로 키를 바꿨다. 예전 같으면 parse() 가 어디서 죽었는지 한참 디버그했을 텐데, ValidationError 로그가 정확히 “field required: published_at” 을 알려줬다. 10분 안에 매핑 함수 한 줄 고쳐서 끝.

한 달 후 받은 선물

model_dump() / model_dump_json() 으로 일관된 직렬화. 더 이상 “이 필드가 datetime 인지 str 인지” 추측 안 함. n8n 의 Code node 로 데이터를 넘길 때도 항상 같은 모양.

다음에는 다르게 할 한 가지

외부에서 들어오는 데이터는 첫 줄에서 모델로 변환한다. dict 채로 함수 사이를 떠돌게 두지 않는다. 그 한 번의 검증이 이후 모든 함수의 타입 가드 역할을 한다.


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

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