Pydantic Model의 응용

@SharkniA · January 26, 2024 · 3 min read

문제

기존에는 프론트와 주고 받을 데이터 모델을 정의하는데에 dataclass를 사용하고 있었다. 그러다가 FastAPI로 넘어오면서 Pydantic model을 도입했다.

dataclass로는 해결할 수 없는 문제가 있었다. 프론트엔드 개발에서는 주로 카멜케이스를 사용하기 때문에, 파이썬에서는 주로 스네이크 케이스를 사용하는데 (네이밍 규칙(naming conventions)), 프론트로 나갈 변수 명을 카멜케이스로 통일 하기 위해 어쩔 수 없이 백엔드의 코드 컨벤션을 해치면서 Response로 나갈 모델의 속성만 Camel 케이스로 선언하고 있었다.

하지만 난 이런게 너무 싫다.

해결

Pydantic Model을 이를 해결하기 위한 옵션이 있다.

alias_generator

필드에 대한 별칭을 자동으로 생성하는 함수를 지정한다. 주로 모델 필드 이름을 snake 케이스에서 camel케이스로 매핑할 때 사용된다.

populatorbyname

이 옵션을 True로 설정하면 Pydantic은 별칭 대신 모델 필드의 원래 이름을 사용하여 인스턴스를 생성하고 할당한다. 이는 필드의 별칭과 원래 이름을 혼용하여 사용할 수 있게 한다. 기본적으로는 False로 되어있어 만약 이 설정을 수정하지 않는다면 속성을 snake case로 정의했어도 인스턴스 생성시 변수를 camelCase로 넣어줘야 하는 불상사가 일어난다.

이 설정을 True로 해두면 모델 인스턴스가 직렬화, 역직렬화 되는 과정에서만 별칭을 이용하게 된다.

두 옵션을 엮어서..

이 두 옵션을 엮어서 Request로 받을 경우, Response로 내려갈 경우에만 별칭을 사용하고, 별칭은 camelCase에 따라 생성되도록 설정을 할 수 있다.

그리고 이 설정값을 넣은 BastDtoModel 클래스를 생성해서 앞으로 우리가 데이터 통신에 사용할 PydanticModel은 모두 이 클래스를 상속받아 구현하기로 했다.

base_dto_model.py
from pydantic import BaseModel


def to_camel(string: str) -> str:
    components = string.split('_')
    return components[0] + ''.join(x.title() for x in components[1:])


class BaseDtoModel(BaseModel):
    class Config:
        alias_generator = to_camel
        populate_by_name = True

aliasgenerator에는 tocamel 메소드를 정의해주었다. tocamel 메소드는 snakecase로 작성된 문자열을 camelCase로 변환해주는 함수이다.

@SharkniA
만 6살 백엔드 개발자
© SharkniA, Built with Gatsby.