Django REST Framework (Serializer)
Django는 웹 페이지(HTML)를 생성하는 데 특화된 프레임워크입니다. 하지만 현대 웹 환경은 다양한 클라이언트(웹, 모바일, 앱)에서 데이터를 소비하므로, 서버는 데이터를 API 형태로 제공하는 것이 효과적입니다. Django REST Framework(DRF)는 이러한 요구에 맞춰, 장고를 사용하여 RESTful API를 쉽게 구축하도록 지원합니다. DRF의 핵심 기능 중 하나는 Serializer로, 파이썬 객체를 JSON과 같은 형식으로 직렬화하여 클라이언트에게 데이터를 제공하고, 클라이언트로부터 받은 데이터를 파이썬 객체로 역직렬화합니다.
이 글에서는 DRF Serializer의 역할과 중요성을 퓨어 장고 Form과 비교하며 알아보고, 쿼리셋과의 관계 및 직렬화가 필요한 이유를 상세히 살펴보겠습니다.
1. Serializer: 데이터 처리의 핵심 도구
DRF의 Serializer는 다음과 같은 세 가지 주요 역할을 수행합니다.
- 데이터 직렬화 (Serialization): 쿼리셋, 모델 인스턴스, 딕셔너리 등 파이썬 객체를 JSON, XML과 같이 웹에서 사용하기 적합한 형식으로 변환합니다. 이는 백엔드에서 데이터를 가져와 프론트엔드가 사용할 수 있도록 가공하는 과정입니다.
- 데이터 역직렬화 (Deserialization): JSON, XML 등 클라이언트로부터 받은 데이터를 파이썬 객체로 변환합니다. 이는 클라이언트에서 받은 데이터를 백엔드에서 처리하기 용이하게 만들어줍니다.
- 데이터 유효성 검사 (Validation): 입력된 데이터가 미리 정의된 규칙(필수 항목, 데이터 타입 등)을 충족하는지 확인합니다. 유효성 검사를 통과하지 못한 데이터는 에러를 발생시켜 데이터 무결성을 유지합니다.
즉, Serializer는 데이터를 주고받을 때 가공 및 검증을 담당하는 핵심적인 도구입니다.
2. Serializer vs. 퓨어 장고 Form: API 개발에 적합한 이유
퓨어 장고의 Form과 DRF의 Serializer는 모두 데이터 처리 및 유효성 검증 기능을 제공하지만, 목적과 활용 방식에 차이가 있습니다. Form은 주로 HTML Form 데이터를 처리하고 HTML 페이지를 렌더링하는 데 특화되어 있습니다. 반면, Serializer는 API를 통해 데이터를 주고받는 데 최적화되어 있습니다.
| 특징 | 퓨어 장고 Form | DRF Serializer |
|---|---|---|
| 주요 목적 | 웹 페이지 HTML Form 데이터 처리 및 렌더링 | 웹 API 데이터 직렬화/역직렬화 및 검증 |
| 처리 대상 | HTML Form 데이터 | JSON, XML 등 다양한 형식의 데이터 |
| 유효성 검사 | HTML Form 데이터 기반 유효성 검사 | 다양한 형식의 데이터에 대한 유효성 검사 |
| API 활용도 | API에서 직접 사용하기 어려움 | API에서 핵심적인 역할 수행 |
| 프론트엔드 연동 | HTML Form 렌더링에 의존적 | 다양한 프론트엔드와 유연하게 연동 |
예시:
Form은 HTML 렌더링을 위한 필드와 위젯을 포함하고 있으며, 특정 HTML 구조에 종속적입니다. 반면, Serializer는 데이터 구조를 추상화하고 JSON, XML 등 다양한 데이터 형식을 지원하여 API 개발에 더욱 유연하게 적용할 수 있습니다. 즉, Serializer는 데이터 자체에 집중하며 프론트엔드 기술에 독립적으로 동작합니다.
3. 쿼리셋과 직렬화: 데이터 전송의 핵심
장고 모델에서 데이터를 가져올 때 사용하는 쿼리셋은 파이썬 객체이며, 데이터베이스에서 데이터를 가져오는 과정을 추상화한 지연 평가(Lazy Evaluation) 특징을 가지고 있습니다. 이러한 쿼리셋을 클라이언트에 직접 전송할 수는 없습니다. 클라이언트가 데이터를 이해할 수 있는 JSON과 같은 형식으로 변환해야 합니다.
- 쿼리셋: 파이썬 객체 (지연 평가, SQL 쿼리 추상화)
- JSON: 웹 표준 데이터 형식 (클라이언트에서 쉽게 처리 가능)
Serializer는 이러한 쿼리셋을 효율적으로 JSON으로 변환합니다. DRF는 ModelSerializer, Serializer 등 다양한 Serializer 클래스를 제공하며, 필요에 따라 커스터마이징하여 사용할 수 있습니다.
- ModelSerializer: 모델 기반으로 필드를 자동 생성 (간편)
- Serializer: 모든 필드를 수동으로 정의 (유연)
또한, Serializer는 데이터를 직렬화할 때 모델 필드와 Serializer 필드를 매핑하여 불필요한 데이터 노출을 방지하고, 데이터 유효성 검사를 통해 클라이언트에서 잘못된 데이터를 전송하는 경우 오류를 발생시켜 데이터의 무결성을 유지합니다.
예시 코드:
# models.py
class Book(models.Model):
title = models.CharField(max_length=200)
author = models.CharField(max_length=100)
publisher = models.CharField(max_length=100)
# serializers.py
from rest_framework import serializers
from .models import Book
class BookSerializer(serializers.ModelSerializer):
class Meta:
model = Book
fields = ['title', 'author'] # 특정 필드만 직렬화
class BookSerializer2(serializers.Serializer):
title = serializers.CharField(max_length=200)
author = serializers.CharField(max_length=100)
- 위 예시에서 BookSerializer는 ModelSerializer를 사용하여 모델의 특정 필드 (title, author)만 직렬화합니다. BookSerializer2는 Serializer를 사용하여 모든 필드를 직접 정의합니다.
4. DRF의 RESTful API 지원과 장고의 확장
DRF는 장고의 웹 특화적인 한계를 극복하고, RESTful API를 쉽게 만들 수 있도록 지원합니다. RESTful API는 자원(Resource)을 중심으로 설계되며, HTTP 메서드(GET, POST, PUT, DELETE 등)를 사용하여 자원을 조작합니다. DRF는 이러한 RESTful 원칙을 따르도록 API를 설계하고, 다양한 클라이언트(웹, 모바일, 앱)에서 데이터를 효율적으로 주고받을 수 있도록 합니다. DRF의 이러한 기능은 장고를 단순한 웹 프레임워크에서 API 백엔드로 확장시켜줍니다.
5. 결론
DRF Serializer는 웹 API 개발에서 데이터를 처리하고 유효성을 검사하는 핵심 도구입니다. Serializer를 통해 쿼리셋을 JSON으로 직렬화하여 클라이언트에게 데이터를 제공하고, 클라이언트로부터 받은 데이터를 파이썬 객체로 역직렬화할 수 있습니다. DRF는 Serializer를 통해 장고의 한계를 극복하고 RESTful API 개발을 지원합니다. Serializer에 대한 이해는 DRF를 활용한 API 개발에 필수적입니다.
'Python > Django' 카테고리의 다른 글
| Django Serialize 심화 (0) | 2025.01.23 |
|---|---|
| Django User정보 넣기 (0) | 2025.01.22 |
| Django 에서 commit (0) | 2025.01.20 |
| 웹보안을 위해 쿠키, 세션, 해시 그리고 JWT (Django 관점) (1) | 2025.01.17 |
| DRF학습전 API, RESTful API 미리보기 (1) | 2025.01.16 |