파이썬 Pydantic으로 데이터 검증과 설정 관리 쉽게 이해하기
Pydantic의 기본 개념
Pydantic은 파이썬에서 데이터 타입을 검사하고, 값이 올바른지 확인하는 역할을 하는 라이브러리입니다. 타입 힌트(예: int, str)를 코드에 적어두면 실행 중에 그 타입대로 값이 들어왔는지 자동으로 검사해주고, 잘못된 값이면 친절하게 오류를 보여줍니다.
BaseModel을 활용한 객체 생성
Pydantic의 핵심인 BaseModel을 상속받아 클래스를 만듭니다. 예를 들어 영화 정보를 담는 Movie 클래스를 만들면 속성마다 타입과 기본값을 지정할 수 있습니다. 데이터를 넣을 때 타입이 다르면 에러가 발생해 버그를 쉽게 잡을 수 있습니다.
from pydantic import BaseModel
from typing import List, Optional, Union
from datetime import datetime
class Movie(BaseModel):
mid: int
genre: str
rate: Union[int, float]
tag: Optional[str] = None
date: Optional[datetime] = None
some_variable_list: List[int] = []
타입 검증의 효과
값을 넣을 때 미리 정의한 타입과 다르면 즉시 오류 메시지가 나옵니다. 예를 들어 rate 자리에 숫자 대신 "1.5aa" 같은 이상한 값을 넣으면, Pydantic이 직접 잡아줍니다. 덕분에 데이터의 신뢰성이 보장됩니다.
Field로 데이터 범위와 조건 지정
Field를 활용하면 조건을 세밀하게 조정할 수 있습니다. 길이가 2~7 글자인 이름, 나이가 2살 이상 130살 이하 등 직접 제한을 걸 수 있어요. 조건을 벗어난 값을 입력하면 딱 맞는 설명의 에러가 뜹니다.
from pydantic import BaseModel, Field
class User(BaseModel):
uid: int
name: str = Field(min_length=2, max_length=7)
age: int = Field(gt=1, le=130)
환경설정 관리: BaseSettings
Pydantic의 BaseSettings를 사용하면 환경 변수나 .env 파일에서 설정값을 읽어와서 관리할 수 있습니다. 예를 들어 DB 접속 정보(host, port 등)를 미리 파일에 써두고, 앱이 실행될 때 자동으로 읽어오게 할 수 있죠.
from pydantic import BaseSettings, Field
class DBConfig(BaseSettings):
host: str = Field(default='127.0.0.1', env='db_host')
port: int = Field(default=3306, env='db_port')
class Config:
env_file = '.env_ex'
값의 유효성 검사: validator
validator 데코레이터로 값을 세부적으로 검사할 수 있습니다. 예를 들어 port 값이 3306 또는 8080만 허용되도록 할 수 있고, 조건을 만족하지 않으면 직접 만든 오류 메시지를 뿌릴 수 있습니다.
from pydantic import validator
class DBConfig(BaseSettings):
host: str = Field(default='127.0.0.1', env='db_host')
port: int = Field(default=3306, env='db_port')
class Config:
env_file = '.env_ex'
@validator("port")
def check_port(cls, port_input):
if port_input not in [3306, 8080]:
raise ValueError("port error")
return port_input
여러 모델을 조합한 응용
BaseModel과 BaseSettings를 합쳐서 프로젝트 정보와 DB 설정을 한 번에 관리할 수 있습니다. Validator로 입력값 검증도 동시에 수행하며, 값을 딕셔너리나 파일 등 다양한 방법으로 넘길 수 있어 확장성이 좋습니다.
FastAPI와의 연계 활용
FastAPI에서는 Pydantic이 필수적으로 활용됩니다. 입력 데이터와 반환 데이터 모델을 직접 지정해서, 사용자가 API에 요청할 때나 응답을 받을 때 타입이 잘못되어도 쉽게 에러를 잡을 수 있습니다.
from fastapi import FastAPI
from pydantic import BaseModel
app = FastAPI()
class DataInput(BaseModel):
name: str
class PredictOutput(BaseModel):
prob: float
prediction: int
@app.post("/pydantic", response_model=PredictOutput)
def pydantic_post(data_request: DataInput):
return {"prob": 0.1, "prediction": 0}
Pydantic의 장점 정리
Pydantic은 타입 체크, 데이터 제약 조건, 에러 메시지 제공, 환경 설정 관리 등 개발 과정에서 꼭 필요한 기능을 쉽고 강력하게 제공합니다. 덕분에 코드가 견고해지고, 실수도 대폭 줄일 수 있습니다. FastAPI와 같이 쓰면 더욱 강력합니다.
출처 및 참고 : 꿈 많은 사람의 이야기