✅ Django DRF에서 Serializer 유효성 검사, 내부 구조까지 완전 정복!

2025. 5. 15. 13:26·기술블로그-Django편

✅ 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. 내부 작동 방식 (쉽게 설명)

  1. 사용자가 요청한 데이터를 Serializer(data=request.data)로 감쌉니다.
  2. .is_valid() 호출 시 DRF는 다음을 수행:
    • 각 필드에 대해 .run_validation()을 실행
    • 내부적으로 타입, 형식, 필수 여부 등을 자동 검사
  3. 에러가 있으면 .errors에 이유가 담김
  4. 검사 통과 시 .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
'기술블로그-Django편' 카테고리의 다른 글
  • 🤖 Pseudo Code란? (가짜 코드)
  • 🔄 클래스/함수 이름 변경 시 꼭 써야 할 리팩토링 기능 (Refactor → Rename)
  • 📌 @staticmethod는(데코레이터(decorator)) 무엇인가요?
  • 📌 Django에서 DRF 사용 시 Serializer가 꼭 필요한 이유
Chansman
Chansman
안녕하세요! 코딩을 시작한 지 얼마 되지 않은 초보 개발자 찬스맨입니다. 이 블로그는 제 학습 기록을 남기고, 다양한 코딩 실습을 통해 성장하는 과정을 공유하려고 합니다. 초보자의 눈높이에 맞춘 실습과 팁, 그리고 개발하면서 겪은 어려움과 해결 과정을 솔직하게 풀어내려 합니다. 함께 성장하는 개발자 커뮤니티가 되기를 바랍니다.
  • Chansman
    찬스맨의 프로그래밍 스토리
    Chansman
  • 전체
    오늘
    어제
    • 분류 전체보기 (717) N
      • Python (32)
      • 프로젝트 (55) N
      • 과제 (25)
      • Database (40)
      • 멘토링 (11)
      • 특강 (37)
      • 기술블로그 (41) N
      • 기술블로그-Fastapi편 (33)
      • 기술블로그-Django편 (153)
      • 기술블로그-Flask편 (36)
      • AI 분석 (5) N
      • HTML & CSS (31)
      • JavaScript (17)
      • AWS_Cloud (21)
      • 웹스크래핑과 데이터 수집 (14)
      • Flask (42)
      • Django (77)
      • Fastapi (16)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
Chansman
✅ Django DRF에서 Serializer 유효성 검사, 내부 구조까지 완전 정복!
상단으로

티스토리툴바