Django Rest Framework (DRF)에서 serializer 소개 Part 1

발행: (2026년 2월 3일 오후 04:48 GMT+9)
10 min read
원문: Dev.to

I’m happy to translate the article for you, but I’ll need the text you’d like translated. Could you please paste the content (or the portion you want translated) here? I’ll keep the source line and all formatting exactly as you specified.

Serializer란 무엇인가?

DRF에서 Serializer는 데이터베이스와 인터넷 사이의 다리와 같습니다.

  • Django 모델은 데이터를 Python 객체로 저장합니다.
  • 그 데이터를 프론트엔드 애플리케이션(예: React 또는 모바일 앱)으로 보내고 싶을 때, Python 객체를 그대로 보낼 수 없습니다. 모두가 이해할 수 있는 형식, 보통 JSON 형태로 보내야 합니다.

Serializer는 세 가지 주요 작업을 수행합니다:

  1. Serialization(직렬화): 복잡한 Python 객체(모델)를 Python 사전 형태로 변환하여 JSON으로 쉽게 렌더링할 수 있게 합니다.
  2. Deserialization(역직렬화): 사용자로부터 들어온 JSON 데이터를 다시 복잡한 Python 객체로 변환합니다.
  3. Validation(검증): 들어오는 데이터가 올바른지 확인하고, 데이터베이스에 저장하기 전에 검증합니다.

Serialization and Deserialization

왜 우리가 그것이 필요할까요?

표준 Django 애플리케이션에서는 모델을 사용해 데이터를 다룹니다. 간단한 예시를 살펴보겠습니다. 우리는 상점을 만들고 싶으므로 ProductModel을 정의합니다.

(models.py 파일에 이 코드를 추가하세요)

from django.db import models

class ProductModel(models.Model):
    name = models.CharField(max_length=150)
    description = models.TextField()
    price = models.DecimalField(max_digits=10, decimal_places=2)
    stock = models.IntegerField()
    is_active = models.BooleanField(default=True)

    def __str__(self):
        return self.name

ProductModel 인스턴스를 웹 브라우저에 직접 보내면 오류가 발생합니다. 브라우저는 “Python 클래스”를 이해하지 못하고 “JSON”을 이해합니다.

우리는 번역기가 필요합니다. 그 번역기가 바로 Serializer입니다.

첫 번째 Serializer 만들기

DRF에는 ModelSerializer, HyperlinkedModelSerializer, ListSerializer와 같은 여러 종류의 serializer가 있습니다. 이들이 어떻게 동작하는지 제대로 이해하려면 기본 Serializer 클래스부터 시작해 보겠습니다.

앱(예: demo)에 serializers.py 파일을 만들고, 모델을 그대로 반영하는 serializer를 정의합니다:

# demo/serializers.py
from rest_framework import serializers 

class ProductSerializer(serializers.Serializer):
    name = serializers.CharField(max_length=150)
    description = serializers.CharField()
    price = serializers.DecimalField(max_digits=10, decimal_places=2)
    stock = serializers.IntegerField()
    is_active = serializers.BooleanField()

Note: 모델의 필드를 그대로 반복해서 작성해야 했습니다. 이 중복은 Part 2에서 해결할 예정이지만, 현재는 이 명시적인 방식이 정확히 어떤 일이 일어나는지 이해하는 데 도움이 됩니다.

직렬화를 실제로 보기

DRF를 배우는 가장 좋은 방법은 웹 브라우저가 아니라 Python Shell을 이용하는 것입니다. 이를 통해 데이터 변환 과정을 단계별로 확인할 수 있습니다.

  1. 터미널을 열고 쉘을 실행합니다 (Django와 DRF가 설치된 가상 환경이 활성화되어 있어야 합니다):

    python manage.py shell
  2. 모델과 직렬화기를 임포트합니다:

    from demo.models import ProductModel
    from demo.serializers import ProductSerializer

단계 1: 더미 데이터 생성

표준 Django 코드를 사용해 데이터베이스에 제품을 생성합니다:

product = ProductModel.objects.create(
    name='Logitech MX Master',
    description='Ergonomic Logitech Mouse',
    price=110.99,
    stock=72,
    is_active=True
)

단계 2: 데이터 직렬화

제품 객체를 직렬화기에 전달합니다:

serializer = ProductSerializer(product)

변환된 데이터를 확인하려면 .data 속성에 접근합니다:

print(serializer.data)

출력:

{
   "name": "Logitech MX Master",
   "description": "Ergonomic Logitech Mouse",
   "price": "110.99",
   "stock": 72,
   "is_active": true
}

성공! 직렬화기가 Python 객체를 Python 사전(dict)으로 변환했습니다. 이 사전은 이제 쉽게 JSON으로 변환되어 API를 통해 전송될 수 있습니다.

역직렬화 (역방향 프로세스)

이제 역방향 상황을 살펴보겠습니다. 사용자가 API를 통해 새 제품을 생성하고자 할 때, JSON 객체를 전송합니다.

다음이 들어오는 데이터라고 가정합니다:

data = {
    "name": "Mechanical Keyboard",
    "description": "Backlit mechanical keyboard",
    "price": "24.99",
    "stock": 10,
    "is_active": True
}

data 인자를 사용해 원시 데이터를 직렬화기에 전달합니다:

serializer = ProductSerializer(data=data)

흔한 실수: 검증하기 전에 .data에 접근하기.

# 이렇게 하지 마세요
print(serializer.data)

다음과 같은 오류가 발생합니다:

AssertionError: When a serializer is passed a `data` keyword argument you must call `.is_valid()` before accessing `.data`.

올바른 역직렬화 흐름

if serializer.is_valid():
    product_instance = serializer.save()   # ProductModel 인스턴스를 생성합니다
    print("Created:", product_instance)
else:
    print("Validation errors:", serializer.errors)
  • serializer.is_valid()는 검증 로직을 실행합니다.
  • 데이터가 검증을 통과하면 serializer.save()가 모델 인스턴스를 생성(또는 업데이트)합니다.
  • 검증에 실패하면 serializer.errors에 오류 메시지 사전이 들어 있습니다.

요약

  • 직렬화기는 Django 모델(파이썬 객체)과 JSON‑호환 데이터 사이를 변환합니다.
  • 직렬화, 역직렬화, 검증을 모두 처리합니다.
  • 기본 Serializer 클래스로 시작하면 각 단계를 명확히 볼 수 있으며, 이후 ModelSerializer가 중복을 어떻게 없애는지 확인하게 됩니다.

직렬화된 .data 표현에 접근하기

# Example usage in the Django shell
serializer = ProductSerializer(data=product_data)
if serializer.is_valid():
    print(serializer.validated_data)
else:
    print(serializer.errors)

DRF는 데이터베이스를 보호합니다. 데이터가 유효함을 확인하기 전까지는 데이터를 건드릴 수 없습니다. 먼저 is_valid()반드시 호출해야 합니다. is_valid() 메서드를 호출하지 않으면 Python은 AssertionError를 발생시킵니다.

우리 데이터가 요구 사항에 부합하므로(예: price는 소수점, stock은 정수, is_active는 불리언), is_valid()True를 반환합니다.

데이터 저장

데이터가 유효해졌으니 이제 데이터베이스에 저장하고 싶습니다. 보통은 serializer.save()를 호출합니다.

하지만 지금 바로 serializer.save()를 실행하면 실패합니다.

왜일까요? 기본 Serializer 클래스는 어떻게 ProductModel을 생성해야 하는지 모릅니다. 우리는 그것을 알려줘야 합니다.

create() 메서드 구현

serializers.py를 편집하고 create() 메서드를 추가하세요:

class ProductSerializer(serializers.Serializer):
    name = serializers.CharField(max_length=150)
    description = serializers.CharField()
    price = serializers.DecimalField(max_digits=10, decimal_places=2)
    stock = serializers.IntegerField()
    is_active = serializers.BooleanField()

    # 데이터를 저장하려면 이 메서드를 구현해야 합니다
    def create(self, validated_data):
        # 검증된 데이터를 풀어 모델 인스턴스를 생성합니다
        return ProductModel.objects.create(**validated_data)

이제 쉘에서 다음을 실행합니다:

serializer.save()

그러면 데이터베이스에 **“Mechanical Keyboard”**가 성공적으로 생성됩니다.

마무리

우리는 다음을 수행할 수 있는 직렬 변환기를 성공적으로 만들었습니다:

  • 읽기: Django 모델을 읽어 사전으로 변환합니다.
  • 쓰기: 사전을 받아 검증하고 Django 모델로 변환합니다.

하지만 뭔가 귀찮은 점을 눈치채셨나요?
우리는 많은 코드를 반복했습니다. 모델에 name, price, stock을 입력하고, 직렬 변환기에서도 다시 입력했습니다. 수십 개의 모델이 있는 실제 프로젝트에서는 이것이 DRY(Do not Repeat Yourself) 원칙을 위반하는 것입니다.

Part 2에서는 **ModelSerializer**를 소개합니다. 이 강력한 단축키는 모든 보일러플레이트 코드를 자동으로 작성해 줍니다.

참고 문헌

Back to Blog

관련 글

더 보기 »

가사 검색기의 음악

Overview 이 애플리케이션은 사용자가 밴드/아티스트 이름과 곡 제목을 제공하여 노래 가사를 검색할 수 있게 합니다. 그래픽 인터페이스는 St... 로 구축되었습니다.

파이썬 배우기: 현장

TL;DR 나는 Python이 이렇게 고통스럽고 즐거울 줄은 몰랐다. 나의 학습 여정 나는 지난 3개월 동안 Python을 배우고 있었고 …