728x90
반응형

 티스토리 

 

Pydantic 데이터 유효성 검사와 설정 구문 분석

Pydantic은 데이터 유효성 검사와 설정 구문 분석을 간편하게 수행할 수 있게 해주는 Python 라이브러리입니다. 주로 데이터 모델을 정의하고, 입력 데이터의 유효성을 검사하며, JSON 형태의 데이터를 Python 객체로 변환하는 데 사용됩니다. 다음은 Pydantic의 주요 특징과 사용법에 대한 간략한 설명입니다:

1. 주요 특

  선언적 모델 정의:

Pydantic을 사용하면 간단한 Python 클래스를 정의하여 데이터 모델을 선언할 수 있습니다.
자동 유효성 검사:

Pydantic은 모델의 필드에 대한 유효성 검사를 자동으로 수행합니다. 이는 데이터를 모델에 할당할 때 자동으로 유효성을 확인하여 오류를 방지합니다.
기본값 및 타입 변환:

필드에 기본값을 설정하거나, 자동으로 타입 변환을 수행할 수 있습니다.
설정 파싱:

Pydantic 모델은 설정 파일과 같은 데이터를 파싱하고 사용하기 용이합니다.
JSON 시리얼라이제이션 및 디시리얼라이제이션:

Pydantic 모델은 JSON 데이터로 쉽게 변환할 수 있으며, 그 반대로도 가능합니다.
ORM과 호환:

Pydantic 모델은 SQLAlchemy, Django ORM 등과 함께 사용할 수 있어 데이터베이스 모델과의 통합이 용이합니다.

2. 코드리뷰

 

데이터 모델 설정 코드 : 

from pydantic import BaseModel

class User(BaseModel):
    id: int
    username: str
    email: str

모델 인스턴스 생성 및 유효성 검사:

user_data = {"id": 1, "username": "john_doe", "email": "john@example.com"}
user = User(**user_data)

자동 유효성 검사 및 타입 변환:

invalid_user_data = {"id": "not_an_integer", "username": "john_doe", "email": "john@example.com"}
invalid_user = User(**invalid_user_data)  # 유효성 검사 오류 발생

Pydantic을 사용하여 데이터 모델링 및 유효성 검사를 할 때, 정상적인 경우와 유효성 검사 오류가 발생하는 경우에 대한 간단한 예제를 제공합니다.

정상적인 경우:

from pydantic import BaseModel, Email

class User(BaseModel):
    id: int
    username: str
    email: Email

# 정상적인 사용자 데이터
user_data = {"id": 1, "username": "john_doe", "email": "john@example.com"}
user = User(**user_data)

print(user.dict())
# 출력: {'id': 1, 'username': 'john_doe', 'email': 'john@example.com'}

유효성 검사 오류가 발생하는 경우:

# 잘못된 사용자 데이터 (id가 문자열)
invalid_user_data = {"id": "not_an_integer", "username": "john_doe", "email": "john@example.com"}

try:
    invalid_user = User(**invalid_user_data)
except ValueError as e:
    print(f"유효성 검사 오류: {e}")
    # 출력: 유효성 검사 오류: 1 validation error for User
    # id
    #   value is not a valid integer (type=type_error.integer)

위의 두 예제에서 볼 수 있듯이, Pydantic은 모델 정의에 따라 데이터를 검사하고 타입 변환을 수행합니다. 정상적인 경우에는 모델을 성공적으로 생성하고, 유효성 검사 오류가 있는 경우에는 ValueError 예외가 발생합니다.

User(**invalid_user_data)에서 ** 구문은  Python의 "unpacking" 또는 "dictionary unpacking" 구문입니다. 이는 딕셔너리의 키-값 쌍을 함수의 인수로 전달할 때 사용됩니다.

여기서 **invalid_user_data는 딕셔너리 invalid_user_data의 키-값 쌍을 풀어서 인수로 전달하는 역할을 합니다. 즉, User(**invalid_user_data)는 다음과 같이 해석됩니다.

User(id="not_an_integer", username="john_doe", email="john@example.com")

이것은 Pydantic 모델 User를 만들고자 하는데, 유효성 검사 오류가 발생하는 데이터를 인스턴스화하려는 시도를 나타냅니다. Pydantic은 이러한 경우에 유효성 검사 오류를 감지하고 해당 오류를 발생시킵니다.

즉, User(**invalid_user_data)는 User 클래스의 인스턴스를 생성하려는 시도를 나타내며, 이때 invalid_user_data 딕셔너리의 내용을 해당 인스턴스의 초기 값으로 전달하게 됩니다.

만약 **를 사용하지 않으면, 딕셔너리를 하나의 인수로 전달하게 됩니다. 그러면 Pydantic이 예상하는 형식과 일치하지 않아 유효성 검사 오류가 발생할 수 있습니다.

실제로는 User 클래스의 id 필드에 딕셔너리가 전체적으로 할당되기 때문에 Pydantic이 원하는 형식과 다릅니다. **를 사용하면 딕셔너리의 키-값을 개별적으로 전달하게 되어 Pydantic이 이를 제대로 처리할 수 있습니다.

따라서 User(**invalid_user_data)는 딕셔너리를 언패킹하여 User 클래스에 전달하는 것을 의미합니다. 이는 Pydantic이 모델의 필드에 정의된 형식에 따라 각각의 값을 검증하고 할당하게끔 해줍니다.

마무리

- 이번 포스팅은 pydantic에 대해 알아봤습니다.

 

궁금한 사항은 댓글을 통해서 남겨 주시면 답변 드리겠습니다.
감사합니다.

 

 

728x90
반응형

+ Recent posts