[Django] Serializer란?

2025. 7. 7. 17:45·개발/Django
반응형

장고의 Serializer는 Django REST Framework에 존재하는 클래스이다.

Serializer는 크게 다음의 두 가지 역할을 한다.

  1. 모델 인스턴스를 python 기본 자료형 또는 JSON으로 변환 (직렬화)
  2. 클라이언트로부터 받은 JSON이나 python 자료형 데이터를 검증(Validation)하고 모델 인스턴스로 변환하고 저장 (역직렬화)

먼저 Serializer는 왜 필요할까?

1. Serializer가 필요한 이유

  • 웹 API에서 데이터는 JSON 형태로 주고받는다.
  • Django의 QuearySet이나 모델 인스턴스는 바로 JSON으로 직렬화(serialize)되지 않는다.
  • 반대로, 클라이언트가 보낸 JSON을 곧바로 모델 인스턴스에 넣을 수도 없다.
  • 따라서 Serializer를 통해 "모델 ↔ JSON(또는 python 자료형)" 간의 변환과 검증을 한 번에 처리할 수 있다.

여기서 "직렬화(serialization)"란 파이썬 객체(모델 인스턴스)를 JSON으로 바로 내보낼 수 있는 기본 자료형(딕셔너리 등) 으로 바꾸는 과정을 말한다. 

  • Serializer나 ModelSerializer를 호출하면 내부적으로 모델 인스턴스의 필드 값을 모아 파이썬의 dict 형태로 변환한다.
  • 이 dict를 다시 JSON으로 변환(렌더링)하는 건 DRF의 JSONRenderer가 담당한다.

이와 반대로 클라이언트가 보낸 JSON을 읽어서(JSONParser) 파이썬 dict로 만들고, Serializer의 .is_valid()를 통해 검증한 뒤 모델 인스턴스로 바꾸는 과정을 "역직렬화(deserialization)"라고 한다.

 

정리하자면: 

  • 직렬화 = 모델 인스턴스 → 파이썬 기본 타입(dict 등) → JSON
  • 역직렬화 = JSON → 파이썬 기본 타입(dict 등) → 모델 인스턴스
  • 즉, "Serializer(data).data가 dict형태의 모델 인스턴스를 내놓는 것"이 바로 직렬화 과정의 핵심이라 할 수 있다.

예시)

  • 모델 정의(models.py)
from django.db import models

class Post(models.Model):
    title      = models.CharField(max_length=100)
    content    = models.TextField()
    created_at = models.DateTimeField(auto_now_add=True)

    def __str__(self):
        return self.title
        
#title: 글 제목
#content: 본문
#created_at: 생성 시각(읽기 전용)
  • Serializer 정의(serializers.py)
from rest_framework import serializers
from .models import Post

class PostSerializer(serializers.ModelSerializer):
    class Meta:
        model  = Post
        fields = ['id', 'title', 'content', 'created_at']
        read_only_fields = ['id', 'created_at']

#fields 로 직렬화/역직렬화에 사용할 필드를 지정
#read_only_fields 에 넣으면 클라이언트 입력에서는 무시(예: created_at)
  • 뷰 작성(views.py)
from rest_framework import viewsets
from .models import Post
from .serializers import PostSerializer

class PostViewSet(viewsets.ModelViewSet):
    queryset         = Post.objects.all().order_by('-created_at')
    serializer_class = PostSerializer

#ModelViewSet 하나로 CRUD(리스트·조회·생성·수정·삭제) 기능 전부 제공
  • URL 라우팅 (urls.py)
from django.urls import include, path
from rest_framework.routers import DefaultRouter
from .views import PostViewSet

router = DefaultRouter()
router.register(r'posts', PostViewSet)

urlpatterns = [
    path('api/', include(router.urls)),
]

#/api/posts/ → 전체 리스트 조회(GET) · 새 글 생성(POST)

#/api/posts/{id}/ → 개별 조회(GET) · 수정(PUT/PATCH) · 삭제(DELETE)
  • 결과
# 새 글 생성
POST /api/posts/
Content-Type: application/json

{
  "title": "첫 번째 글",
  "content": "Serializer가 정말 편리하네요!"
}

# 결과
HTTP/1.1 201 Created
{
  "id": 1,
  "title": "첫 번째 글",
  "content": "Serializer가 정말 편리하네요!",
  "created_at": "2025-07-07T08:00:00Z"
}

# 전체 글 목록 조회
GET /api/posts/

# 결과
HTTP/1.1 200 OK
[
  {
    "id": 1,
    "title": "첫 번째 글",
    "content": "Serializer가 정말 편리하네요!",
    "created_at": "2025-07-07T08:00:00Z"
  },
  // ...
]

 

2. Serializer의 종류

  • Serializer 클래스
    • 일반적인 필드(CharField, IntegerField 등)를 직접 정의해서 사용
    • 모델과 무관하게 자유롭게 검증 로직을 바꾸고 싶을 때
  • ModelSerializer 클래스
    • Meta 내부에 model과 fields를 선언하면 모델 필드에 맞춰 자동으로 생성한다.
    • CRUD에 필요한 create(), update() 메서드도 기본 구현되어 있어서 편리하다.
from rest_framework import serializers
from .models import Post

class PostSerializer(serializers.ModelSerializer):
    class Meta:
        model = Post
        fields = ['id', 'title', 'content', 'created_at']
        # → 이 부분이 "어떤 필드를 직렬화할지" 설정하는 곳입니다.
  • 위처럼 설정하면
    • 읽을 때 : Post 인스턴스 → {"id": 1, "title": "...", "content": "...", "created_at": "..."}
    • 쓸 때 : {"title": "...", "content": "..."} → .is_valid() 검증 → .save() 호출 → 새 Post 인스턴스 생성

 

3. 주요 속성과 메서드

  • fields
    • 출력, 입력에 사용할 모델 필드를 나열한다.
    • _all_로 쓰면 모델 필드를 전부 포함시킬 수 있다.
  • read_only_fields, write_only_fields
    • 예를 들어 created_at는 읽기 전용(read-only)으로만 제공하고 싶다면 read_only_fields = ['created_at']처럼 설정할 수 있다.
  • 검증(validation)
# Serializer 전체 데이터 검증 
def validate(self, attrs):
    # attrs는 모든 필드값이 dict 형태로 들어온 것
    if attrs['start'] > attrs['end']:
        raise serializers.ValidationError("시작 시간이 종료 시간보다 빨라야 합니다.")
    return attrs
#필드별 검증 
def validate_title(self, value):
    if '금지어' in value:
        raise serializers.ValidationError("제목에 금지어가 포함되어 있습니다.")
    return value
    
#create(), update()의 경우
#ModelSerializer는 기본적으로 validated_data를 모델에 넘겨서 인스턴스를 생성·수정해 준다.
#특별한 로직이 필요하다면 오버라이드해서 커스터마이징할 수 있다.

 

4. 결론

  • Serializer는 Django Form의 API 버전이라고 생각하면 이해가 쉽다.
  • 입력 데이터를 안전하게 검증하고, 모델 인스턴스와 JSON / 파이썬 자료형 간 변환을 매끄럽게 연결해 주는 역할임을 기억하자.
반응형

'개발 > Django' 카테고리의 다른 글

[Django] Django란?  (2) 2025.08.17
'개발/Django' 카테고리의 다른 글
  • [Django] Django란?
danieLee
danieLee
개발일지
  • danieLee
    Code log
    danieLee
  • 전체
    오늘
    어제
    • 분류 전체보기 (77)
      • 개발 (76)
        • C++ (3)
        • java (6)
        • JavaScript (9)
        • python (0)
        • AWS (2)
        • Docker (6)
        • git (0)
        • 백엔드 (4)
        • Spring (7)
        • Django (2)
        • AI (3)
        • 코테 준비 (13)
        • 알고리즘 (6)
        • SKALA 4기 (13)
  • 블로그 메뉴

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

  • 공지사항

  • 인기 글

  • 태그

    서버
    개념
    개발
    알고리즘
    프로그래머스
    코테
    skala
    파이썬
    java
    js
    JavaScript
    백엔드
    개발자
    프론트
    vue.js
    spring
    API
    Ai
    대학생
    4기
  • 최근 댓글

  • 최근 글

  • 반응형
  • hELLO· Designed By정상우.v4.10.1
danieLee
[Django] Serializer란?
상단으로

티스토리툴바