GPT 응답
Django REST Framework Serializer Validation#
Django REST Framework (DRF)의 Serializer는 데이터 직렬화 및 역직렬화 과정을 처리하며, 입력 데이터를 검증하는 강력한 메커니즘을 제공합니다. 이 문서에서는 DRF Serializer의 Validation에 대해 설명하고, 유효성 검사를 수행하는 방법과 주요 메서드에 대해 다룹니다.
Validation의 주요 개념#
Serializer의 Validation은 입력 데이터를 처리하기 전에 데이터가 유효한지 확인하는 단계입니다. Validation은 일반적으로 다음과 같은 세 가지 수준에서 수행됩니다.
- 필드 수준 검증: 각 개별 필드에 대해 정의된 조건을 검증합니다.
- 객체 수준 검증: 입력된 데이터 전체에 대해 추가적인 검증 로직을 실행합니다.
- 정의된 제약 조건 검증: 모델 또는 특정 요구사항에 따라 자동으로 적용되는 검증입니다.
Validation 구현 방법#
1. 필드 수준 검증#
필드 수준 검증은 Serializer의 validate_<field_name>
메서드를 사용하여 특정 필드에 대한 유효성 검사를 정의합니다.
from rest_framework import serializers
class ExampleSerializer(serializers.Serializer):
name = serializers.CharField(max_length=100)
age = serializers.IntegerField()
def validate_age(self, value):
if value < 0:
raise serializers.ValidationError("Age must be a positive number.")
return value
동작 원리:
- validate_<field_name>
메서드는 해당 필드의 값에 대해 호출됩니다.
- 유효하지 않은 값에 대해 serializers.ValidationError
를 발생시킵니다.
2. 객체 수준 검증#
객체 수준 검증은 Serializer의 validate
메서드를 사용하여 여러 필드를 조합한 검증을 수행합니다.
class ExampleSerializer(serializers.Serializer):
start_date = serializers.DateField()
end_date = serializers.DateField()
def validate(self, data):
if data['start_date'] > data['end_date']:
raise serializers.ValidationError("Start date must be before end date.")
return data
동작 원리:
- validate
메서드는 모든 필드 데이터를 포함하는 딕셔너리를 입력으로 받습니다.
- 여러 필드 간의 상호 의존성을 검증할 때 유용합니다.
3. validators
옵션#
Serializer 필드에 validators
인자를 사용하여 사용자 정의 검증기를 추가할 수 있습니다.
from rest_framework.validators import ValidationError
def multiple_of_ten(value):
if value % 10 != 0:
raise ValidationError("This field must be a multiple of ten.")
class ExampleSerializer(serializers.Serializer):
score = serializers.IntegerField(validators=[multiple_of_ten])
ValidationError#
유효성 검사 실패 시 serializers.ValidationError
예외가 발생합니다. 이 예외는 일반적으로 클라이언트로 반환되는 응답에 포함될 수 있는 직렬화된 에러 메시지를 제공합니다.
예:
{
"age": ["Age must be a positive number."],
"non_field_errors": ["Start date must be before end date."]
}
참고 사항#
- DRF Serializer는 Django 모델 필드의 기본 검증 로직을 자동으로 상속받습니다.
- 데이터 입력 시 적절한 에러 메시지를 사용자에게 제공하여 유효성 검증 실패의 이유를 명확히 전달하는 것이 중요합니다.
- 복잡한 검증 로직은 객체 수준 검증으로 구현하는 것이 유지보수에 유리합니다.
예제: 전체적인 Validation 활용#
class UserSerializer(serializers.Serializer):
username = serializers.CharField(max_length=150)
email = serializers.EmailField()
password = serializers.CharField(write_only=True)
def validate_username(self, value):
if "admin" in value.lower():
raise serializers.ValidationError("Username cannot contain 'admin'.")
return value
def validate(self, data):
if len(data['password']) < 8:
raise serializers.ValidationError({"password": "Password must be at least 8 characters long."})
return data
공식 문서#
더 자세한 내용은 DRF 공식 문서를 참조하세요: Django REST Framework Serializer Validation