- Django Form은 HTML 입력 데이터를 검증하는 도구입니다.
- DRF Serializer는 JSON API 데이터를 검증하고 변환하는 도구입니다.
- 두 도구 모두
is_valid(), 검증된 데이터, 에러 처리 흐름이 매우 비슷합니다.- ModelForm과 ModelSerializer도 모델 기반 자동 필드 생성과 저장 구조가 닮아 있습니다.
Django Form과 DRF Serializer의 유사성
Django를 사용할 때 우리를 가장 든든하게 (때로는 머리 아프게) 지켜주는 두 문지기, Django Form과 DRF(Django REST Framework) Serializer에 대해 그 유사성을 정리해보았습니다.
두 친구는 활동하는 무대(웹 페이지 vs API)만 다를 뿐, "외부의 데이터를 안전하게 검증해서 내부로 들여보내고, 내부의 데이터를 예쁘게 포장해서 외부로 내보낸다"라는 본질적인 역할과 구조가 소름 돋을 정도로 닮았습니다.

1. 한눈에 보는 역할 비교
쉽게 비유하자면 이들은 백화점 입구의 '보안요원 겸 안내원'입니다.
- Django Form: 주로 HTML 웹 페이지 세상에서 일합니다. 사용자가 브라우저 창에서 입력한 데이터(Form Data)가 올바른지 검사하고, 오류가 있으면 화면에 "다시 입력하세요"라고 친절하게 그려줍니다.
- DRF Serializer: 주로 JSON을 주고받는 API 세상에서 일합니다. 모바일 앱이나 프론트엔드(React, Vue 등)가 보낸 JSON 데이터를 파이썬 객체로 바꾸고, 반대로 데이터베이스의 데이터를 JSON으로 예쁘게 포장(직렬화)해 줍니다.
| 기능 | Django Form (웹 페이지 중심) | DRF Serializer (API 중심) |
|---|---|---|
| 들어올 때 (Input) | HTML Form -> 파이썬 딕셔너리 (cleaned_data) |
JSON 문자열 -> 파이썬 딕셔너리 (validated_data) |
| 데이터 검증 | is_valid() 호출 |
is_valid() 호출 |
| 나갈 때 (Output) | 파이썬 객체 -> HTML 태그 (<input>) 로 렌더링 |
파이썬 객체 -> JSON 문자열로 변환 (직렬화) |
2. 왜 이렇게 닮았을까? 구조적 유사성 3가지
DRF를 만든 개발자들도 Django Form의 구조가 너무 훌륭해서, 그걸 거의 그대로 벤치마킹해 Serializer를 만들었습니다. 그래서 코드 구조와 사용법이 이란성 쌍둥이처럼 닮아 있죠.
① 필드 정의 방식이 똑같다
어떤 데이터가 들어와야 하는지 형식을 지정하는 방식이 완전히 판박이입니다.
- Django Form:
from django import forms
class UserForm(forms.Form):
username = forms.CharField(max_length=100)
email = forms.EmailField()
age = forms.IntegerField()
- DRF Serializer:
from rest_framework import serializers
class UserSerializer(serializers.Serializer):
username = serializers.CharField(max_length=100)
email = serializers.EmailField()
age = serializers.IntegerField()
forms가serializers로 바뀐 것 말고는 필드를 선언하는 논리가 완전히 똑같습니다.
② 검증(Validation)과 데이터 접근 방식이 똑같다
데이터가 안전한지 검사하고, 검증된 데이터에 접근하는 메서드 흐름이 일치합니다.
- 유효성 검사: 두 방식 모두 데이터를 집어넣은 뒤
if form.is_valid():또는if serializer.is_valid():를 호출합니다. - 통과된 데이터 접근: 검증을 마친 깨끗한 데이터는 Form의 경우
form.cleaned_data, Serializer의 경우serializer.validated_data라는 딕셔너리에 담깁니다. 이름만 살짝 다를 뿐 기능은 같습니다. - 에러 확인: 검증에 실패하면
form.errors나serializer.errors를 통해 무엇이 잘못되었는지 딕셔너리 형태로 에러 메시지를 제공합니다.
③ Model과의 연동 (ModelForm vs ModelSerializer)
Django의 핵심은 DB(Model)와 연동하는 것이죠. 두 도구 모두 모델을 기반으로 필드를 자동으로 만들어주는 '치트키' 클래스를 가지고 있습니다.
- Django ModelForm:
class MyModelForm(forms.ModelForm):
class Meta:
model = MyModel
fields = ['title', 'content']
- DRF ModelSerializer:
class MyModelSerializer(serializers.ModelSerializer):
class Meta:
model = MyModel
fields = ['title', 'content']
내부
Meta클래스를 사용해서 어떤 모델을 기반으로, 어떤 필드를 쓸지 지정하는 문법까지 소름 돋게 똑같습니다. 이 덕분에save()메서드를 호출하면 DB에 데이터가 알아서 생성(create)되거나 수정(update)되는 것까지 동일합니다.
글을 마치며
- Django Form은 HTML과 파이썬 사이의 통역사 역할을 하면서 데이터 검증을 해주는 친구이고,
- DRF Serializer는 JSON과 파이썬 사이의 통역사 역할을 하면서 데이터 검증을 해주는 친구입니다.
과거에 Django Form을 다뤄보셨다면 DRF Serializer는 "아, HTML 대신 JSON을 만지는 Form이구나!"라고 생각하시면 90% 이상 맞습니다. 반대로 Serializer를 먼저 접하셨다면 Form 역시 쉽게 이해할 수 있습니다.
그러나, 백엔드 엔지니어들은 이 두개의 도구가 상당히 비슷하면서도 Serializer 에 대해서는 편안함을 느끼면서도 Serializer의 근본이 되었던 Form에 대해서는 불편함을 느끼는 분들이 많을 것 이라고 생각합니다. 저 역시 그러합니다.
왜 그런 기분이 드는지, 그 이유를 곰곰히 생각해 본 적이 있으신가요? 다음 회에서는 Django Form, serializer와 닮았지만 사용할 수록 마음속이 불편한 이유에 대해서 한번 이야기해보고자 합니다.
이 번 글이 도움이 되었다면 좋아요! 를 눌러주시고 다음 글도 기대해 주세요.
댓글이 없습니다.