Gemini를 통해 학습한 DRF 내용 정리 노트
DRF (Django REST Framework) 는 Django 위에서 RESTful API를 쉽고 빠르게 구축할 수 있도록 도와주는 오픈소스 라이브러리이다.
| 장점 | 설명 |
|---|---|
| 웹 브라우저블 API | 개발자가 만든 API를 브라우저에 직접 접속해서 테스트 가능하도록 기본 웹 UI 제공 |
| 직렬화 (Serialization) | 복잡한 데이터(Django 모델 등)를 JSON, XML 등으로 쉽게 변환. 반대로 클라이언트에서 온 JSON 데이터를 파이썬 데이터로 검증·변환 |
| 인증 및 권한 관리 | JWT, OAuth, 세션 기반 인증 등 다양한 인증 방식과 사용자별 접근 권한 설정 가능 |
Django 모델(DB 데이터)은 파이썬 객체라서 프론트엔드가 알아듣지 못한다.
Serializer는 다음 역할을 한다:
클라이언트의 요청(GET, POST, PUT, DELETE)을 받아 실제로 어떻게 처리할지 결정하는 곳.
ViewSet을 사용하게 되면 각 요청(GET, POST 등)에 맞는 URL을 일일이 지정하기 귀찮아진다.
Router는 ViewSet과 연결되어 필요한 URL 패턴을 자동으로 생성해 준다.
사용자가 프론트엔드에서 게시글 목록을 요청했을 때:
1) 클라이언트(웹/앱) 요청
→ GET /articles/
2) Router / URLs
→ 해당 URL을 처리할 View로 요청 전달
3) View
→ DB에서 게시글 데이터(QuerySet) 가져와 Serializer에게 넘김
4) Serializer
→ 파이썬 형태의 데이터를 JSON 형태로 변환
5) View
→ 변환된 JSON 데이터를 클라이언트에게 Response로 응답
articles = Article.objects.all()
print(articles)
결과:
<QuerySet [<Article: Article object (1)>, <Article: Article object (2)>]>
__str__ 메서드를 사용했을 때# models.py
class Article(models.Model):
title = models.CharField(max_length=100)
content = models.TextField()
# 데이터를 출력할 때 제목(title)으로 보이게 해쥼
def __str__(self):
return self.title
결과:
<QuerySet [<Article: 첫 번째 게시글입니다>, <Article: DRF 공부 너무 재밌어요>]>
many=True 옵션serialize를 할 때 many=True를 써야 하는 경우가 있다.
→ 답이 리스트 형식으로 출력되는 all(), filter()는 many=True가 필요하고,
리스트 없이 단일 객체로 출력되는 get()은 many=True 없이 써야 한다. (안 그러면 에러 발생)
| 메서드 | 반환 형태 | 데이터 개수 | Serializer 설정 | JSON 결과 모양 |
|---|---|---|---|---|
all(), filter() | 📦 상자 (QuerySet) | 0개, 1개, 여러 개 (상관없음) | many=True 필수 | [ {...}, {...} ] 또는 [ ] |
get(), first() | 🍎 단품 (Object) | 무조건 딱 1개 (아니면 에러) | many=True 쓰면 안 됨 | {...} (리스트로 감싸지 않음) |
# articles/serializers.py
from rest_framework import serializers
from .models import Article
class ArticleSerializer(serializers.ModelSerializer):
class Meta:
model = Article
fields = ['id', 'title', 'content', 'created_at']
# fields = '__all__'
#모든 필드를 한 번에
@api_view)가 필수다.