반응형
장고의 Serializer는 Django REST Framework에 존재하는 클래스이다.
Serializer는 크게 다음의 두 가지 역할을 한다.
- 모델 인스턴스를 python 기본 자료형 또는 JSON으로 변환 (직렬화)
- 클라이언트로부터 받은 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 |
|---|