✅ Django DRF에서 Serializer 유효성 검사, 내부 구조까지 완전 정복!
Django REST Framework(DRF)를 사용할 때, Serializer는 단순히 데이터를 포장하는 도구가 아닙니다. 내부적으로 매우 강력한 유효성 검사 시스템을 갖추고 있어요. 이 글에서는 APIView와 Serializer의 역할을 분리해서 이해하고, 유효성 검사가 어떻게 "자동으로" 동작하는지 쉽게 풀어드립니다.
🔍 1. APIView는 검사 도구가 아니다!
class ShortURLCreateAPIView(APIView):
def post(self, request):
serializer = ShortURLCreateSerializer(data=request.data)
if serializer.is_valid():
...
- APIView는 단지 요청을 받아 처리할 수 있는 틀(View)입니다.
- 진짜 유효성 검사는 Serializer 클래스에서 수행됩니다.
✅ 2. Serializer 안에 유효성 검사가 있다!
class ShortURLCreateSerializer(serializers.Serializer):
original_url = serializers.URLField(required=True)
- URLField는 값이 비어 있거나 URL이 아니면 자동으로 검사에서 실패합니다.
- is_valid()를 호출하면 DRF가 내부적으로 original_url 필드를 검사합니다.
즉, 필드만 정의해도 유효성 검사는 자동으로 실행되는 구조입니다.
🧠 3. 내부 작동 방식 (쉽게 설명)
- 사용자가 요청한 데이터를 Serializer(data=request.data)로 감쌉니다.
- .is_valid() 호출 시 DRF는 다음을 수행:
- 각 필드에 대해 .run_validation()을 실행
- 내부적으로 타입, 형식, 필수 여부 등을 자동 검사
- 에러가 있으면 .errors에 이유가 담김
- 검사 통과 시 .save()를 통해 DB 저장 가능
💡 4. 커스텀 유효성 검사도 가능해요
class ShortURLCreateSerializer(serializers.Serializer):
original_url = serializers.URLField()
def validate_original_url(self, value):
if "google" in value:
raise serializers.ValidationError("구글 주소는 허용되지 않습니다.")
return value
- validate_필드명() 메서드를 정의하면 해당 필드에 대해 추가적인 검사 가능!
- 전체 필드 종합 검사는 validate() 오버라이드로 구현합니다.
🧩 5. 내부 구조 코드 예시 (참고용)
def is_valid(self, raise_exception=False):
self._validated_data = {}
self._errors = {}
for field_name, field in self.fields.items():
value = self.initial_data.get(field_name, None)
validated = field.run_validation(value) # <- 여기서 유효성 검사 실행
self._validated_data[field_name] = validated
📌 결론 정리
질문 답변
유효성 검사는 어디서 하나요? | ✅ Serializer 클래스에서 합니다 |
왜 자동으로 검사되나요? | 각 필드에 검사 규칙이 정의되어 있어서 DRF가 알아서 실행함 |
내가 검사 코드를 써야 하나요? | ❌ 대부분 기본 필드만 정의하면 자동으로 작동함 |
더 복잡한 조건은 어떻게 검사하죠? | validate_필드명() 또는 validate()를 오버라이드하세요 |
🔚 다음으로 이어서 보면 좋은 주제
- .save()의 동작 원리
- ModelSerializer vs Serializer 차이
- partial=True의 의미와 사용 예시
필요하신 경우 언제든지 이어서 설명드릴게요 😊
'기술블로그-Django편' 카테고리의 다른 글
🤖 Pseudo Code란? (가짜 코드) (0) | 2025.05.15 |
---|---|
🔄 클래스/함수 이름 변경 시 꼭 써야 할 리팩토링 기능 (Refactor → Rename) (0) | 2025.05.15 |
📌 @staticmethod는(데코레이터(decorator)) 무엇인가요? (0) | 2025.05.15 |
📌 Django에서 DRF 사용 시 Serializer가 꼭 필요한 이유 (0) | 2025.05.15 |
📌 Django REST Framework(DRF)란? (0) | 2025.05.15 |