> * 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 태그 (``) 로 렌더링 | 파이썬 객체 -> JSON 문자열로 변환 (직렬화) |
***
## 2\. 왜 이렇게 닮았을까? 구조적 유사성 3가지
DRF를 만든 개발자들도 Django Form의 구조가 너무 훌륭해서, 그걸 거의 그대로 벤치마킹해 Serializer를 만들었습니다. 그래서 코드 구조와 사용법이 이란성 쌍둥이처럼 닮아 있죠.
### ① 필드 정의 방식이 똑같다
어떤 데이터가 들어와야 하는지 형식을 지정하는 방식이 완전히 판박이입니다.
* **Django Form:**
```python
from django import forms
class UserForm(forms.Form):
username = forms.CharField(max_length=100)
email = forms.EmailField()
age = forms.IntegerField()
```
* **DRF Serializer:**
```python
from rest_framework import serializers
class UserSerializer(serializers.Serializer):
username = serializers.CharField(max_length=100)
email = serializers.EmailField()
age = serializers.IntegerField()
```
> `forms`가 `serializers`로 바뀐 것 말고는 필드를 선언하는 논리가 완전히 똑같습니다.
### ② 검증(Validation)과 데이터 접근 방식이 똑같다
데이터가 안전한지 검사하고, 검증된 데이터에 접근하는 메서드 흐름이 일치합니다.
1. **유효성 검사:** 두 방식 모두 데이터를 집어넣은 뒤 `if form.is_valid():` 또는 `if serializer.is_valid():`를 호출합니다.
2. **통과된 데이터 접근:** 검증을 마친 깨끗한 데이터는 Form의 경우 `form.cleaned_data`, Serializer의 경우 `serializer.validated_data`라는 딕셔너리에 담깁니다. 이름만 살짝 다를 뿐 기능은 같습니다.
3. **에러 확인:** 검증에 실패하면 `form.errors`나 `serializer.errors`를 통해 무엇이 잘못되었는지 딕셔너리 형태로 에러 메시지를 제공합니다.
### ③ Model과의 연동 (ModelForm vs ModelSerializer)
Django의 핵심은 DB(Model)와 연동하는 것이죠. 두 도구 모두 모델을 기반으로 필드를 자동으로 만들어주는 '치트키' 클래스를 가지고 있습니다.
* **Django ModelForm:**
```python
class MyModelForm(forms.ModelForm):
class Meta:
model = MyModel
fields = ['title', 'content']
```
* **DRF ModelSerializer:**
```python
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와 닮았지만 사용할 수록 마음속이 불편한 이유에 대해서 한번 이야기해보고자 합니다.
이 번 글이 도움이 되었다면 좋아요! 를 눌러주시고 다음 글도 기대해 주세요.