TIL 05-16 (DRF)

김덕협·2026년 5월 17일

TIL

목록 보기
9/41

Django REST Framework (DRF) 정리

Gemini를 통해 학습한 DRF 내용 정리 노트


1. DRF란?

DRF (Django REST Framework) 는 Django 위에서 RESTful API를 쉽고 빠르게 구축할 수 있도록 도와주는 오픈소스 라이브러리이다.

  • 프론트엔드와 백엔드를 분리해서 개발하거나, 모바일 앱과 통신해야 하는 환경에서는 백엔드가 데이터를 HTML이 아닌 JSON 형식으로 응답해야 한다.
  • 이때 순수 Django만 사용하면 번거롭기 때문에, DRF가 이런 작업들을 편리하게 처리해 준다.

2. DRF를 왜 사용하는가? (장점)

장점설명
웹 브라우저블 API개발자가 만든 API를 브라우저에 직접 접속해서 테스트 가능하도록 기본 웹 UI 제공
직렬화 (Serialization)복잡한 데이터(Django 모델 등)를 JSON, XML 등으로 쉽게 변환. 반대로 클라이언트에서 온 JSON 데이터를 파이썬 데이터로 검증·변환
인증 및 권한 관리JWT, OAuth, 세션 기반 인증 등 다양한 인증 방식과 사용자별 접근 권한 설정 가능

3. DRF 구성 요소

① Serializer (시리얼라이저) — "통역사" 🗣️

Django 모델(DB 데이터)은 파이썬 객체라서 프론트엔드가 알아듣지 못한다.
Serializer는 다음 역할을 한다:

  • 직렬화: 파이썬 객체 → 프론트엔드가 이해할 수 있는 JSON 형태로 변환
  • 역직렬화: 프론트엔드에서 보낸 JSON 데이터 → 파이썬 객체로 변환
  • 유효성 검사: 들어온 데이터가 올바른지 검증

② Views & ViewSets (뷰 & 뷰셋) — "행동 대장" 💪

클라이언트의 요청(GET, POST, PUT, DELETE)을 받아 실제로 어떻게 처리할지 결정하는 곳.

  • APIView / Generic APIView: 기본적이고 세밀하게 제어할 때 사용
  • ViewSet: 게시판의 글을 작성·수정·삭제·조회하는 로직은 거의 비슷한데, ViewSet을 사용하면 중복되는 CRUD 코드를 하나로 묶어 아주 짧은 코드로 처리 가능

③ Router (라우터) — "길잡이" 🧭

ViewSet을 사용하게 되면 각 요청(GET, POST 등)에 맞는 URL을 일일이 지정하기 귀찮아진다.
Router는 ViewSet과 연결되어 필요한 URL 패턴을 자동으로 생성해 준다.


4. 데이터가 흘러가는 기본 흐름

사용자가 프론트엔드에서 게시글 목록을 요청했을 때:

1) 클라이언트(웹/앱) 요청
   → GET /articles/

2) Router / URLs
   → 해당 URL을 처리할 View로 요청 전달

3) View
   → DB에서 게시글 데이터(QuerySet) 가져와 Serializer에게 넘김

4) Serializer
   → 파이썬 형태의 데이터를 JSON 형태로 변환

5) View
   → 변환된 JSON 데이터를 클라이언트에게 Response로 응답

5. QuerySet 반환 예시

기본 QuerySet 출력

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 공부 너무 재밌어요>]>

6. Serializer의 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 쓰면 안 됨{...} (리스트로 감싸지 않음)

7. Serializer 예시 코드

# 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__'
        #모든 필드를 한 번에

📌 헷갈렸던 포인트 / 추가 의문

  • DRF에선 뷰 데코레이터(@api_view)가 필수다.
  • Serializer의 역할 = 통역사 (파이썬 ↔ JSON 변환 + 유효성 검증)

※ 참고
https://weareyoung8-8.tistory.com/4

profile
뭘봐

0개의 댓글