🚀 Django REST Framework (DRF) 개요 & API 개발 정보
1. Django REST Framework(DRF)란?
- Django를 사용하여 웹 API를 쉽게 개발할 수 있도록 도와주는 라이브러리
- REST API 구축 과정을 단순화하며, 다양한 기능을 제공하여 빠른 개발 지원 가능
- Django를 백엔드 프레임워크로 사용할 때 자주 함께 사용됨
2. 클라이언트-서버 모델 구조
- 웹 서비스의 기본적인 네트워크 구조
- 서비스 요청자(클라이언트)와 서비스 제공자(서버)를 분리하여 명확한 책임 구분
💡 구성 요소:
- 클라이언트 (Client): 사용자, 웹/모바일 인터페이스, 버튼 클릭 등
- 서버 (Server): HTTP 요청을 받아 처리하고, 응답 반환
- UI (User Interface): 클라이언트 측 인터페이스
- API (Application Programming Interface): HTTP 통신을 위한 창구
3. DRF의 핵심 개념: Serializer
✅ DRF Serializer란?
- Python 데이터를 JSON 형식으로 직렬화(serialize)하거나,
- JSON 데이터를 Python 객체로 역직렬화(deserialize)하는 도구
✏️ 핵심 역할
- Django 모델 인스턴스를 JSON 형태로 변환하여 응답 데이터로 활용
- 클라이언트가 보낸 JSON 데이터를 Python 객체로 변환하고 유효성 검사 수행
📌 직렬화/역직렬화 구조
- 직렬화(Serialization): Django 모델 → JSON
- 역직렬화(Deserialization): JSON → Python 객체 (유효성 검사 포함)
4. 기본 API 설계 예시 (ShortURL 앱 기반)
✅ API 정의
- GET /api/short-urls/: 전체 ShortURL 목록 조회
- POST /api/short-urls/: 새로운 ShortURL 생성
- DELETE /api/short-urls/<str:code>/: ShortURL 삭제
✅ DRF 설치
pip install djangorestframework
# config/settings.py
INSTALLED_APPS = [
...
'rest_framework',
]
✅ Serializer 정의 예시
# shortener/serializers.py
from rest_framework import serializers
from shortener.models import ShortURL
class ShortURLResponseSerializer(serializers.ModelSerializer):
class Meta:
model = ShortURL
fields = "__all__"
✅ View 정의 (목록 조회)
from rest_framework.views import APIView
from rest_framework.response import Response
from shortener.models import ShortURL
from shortener.serializers import ShortURLResponseSerializer
class ShortURLsAPIView(APIView):
def get(self, request):
short_urls = ShortURL.objects.all()
serializer = ShortURLResponseSerializer(short_urls, many=True)
return Response(serializer.data)
✅ URL 연결
# shortener/urls.py
from django.urls import path
from . import apis
urlpatterns = [
path("api/short-urls/", apis.ShortURLsAPIView.as_view(), name="short_urls_api"),
]
5. ShortURL 생성 API 구현
✅ Serializer 분리
class ShortURLCreateSerializer(serializers.ModelSerializer):
class Meta:
model = ShortURL
fields = ["original_url"]
✅ View (생성 구현)
class ShortURLsAPIView(APIView):
def post(self, request):
serializer = ShortURLCreateSerializer(data=request.data)
if serializer.is_valid():
while True:
code = ShortURL.generate_code()
if not ShortURL.objects.filter(code=code).exists():
break
short_url = serializer.save(code=code)
return Response(ShortURLResponseSerializer(short_url).data, status=201)
return Response(serializer.errors, status=400)
✅ request.data 특징
- DRF의 Request 객체 속성으로, JSON, form 등 다양한 Content-Type 지원
- POST, PUT, PATCH 요청 등에서 자동 파싱됨
- Django의 request.POST와는 다르게 다양한 HTTP 메서드 지원
6. ShortURL 삭제 API 구현
from django.shortcuts import get_object_or_404
from rest_framework.views import APIView
from rest_framework.response import Response
from rest_framework import status
class ShortURLAPIView(APIView):
def delete(self, request, code):
short_url = get_object_or_404(ShortURL, code=code)
short_url.delete()
return Response(status=status.HTTP_204_NO_CONTENT)
# urls.py
path("api/short-urls/<str:code>/", apis.ShortURLAPIView.as_view(), name="short_url_api"),
7. CRUD 개발 시 반복되는 패턴 (템플릿화 가능)
📌 공통 흐름:
1️⃣ 클라이언트가 보낸 데이터 읽기
2️⃣ 데이터 유효성 검사
3️⃣ 데이터베이스 저장 또는 처리
4️⃣ 응답 반환
📌 달라지는 부분:
- 어떤 Serializer를 쓸 것인가?
- 어떤 모델에 데이터를 저장할 것인가?
8. GenericAPIView + Mixin 활용
from rest_framework.generics import GenericAPIView
from rest_framework.mixins import ListModelMixin, CreateModelMixin
class ShortURLsAPIView(ListModelMixin, CreateModelMixin, GenericAPIView):
queryset = ShortURL.objects.all()
serializer_class = ShortURLResponseSerializer
- ListModelMixin: GET / 리스트 응답
- CreateModelMixin: POST / 생성 처리
✅ Mixin 클래스는 기능을 조합하는 구성요소이며, 복잡한 로직 없이 CRUD 기능을 빠르게 구현할 수 있음
9. Concrete GenericAPIView
from rest_framework.generics import ListCreateAPIView
class ShortURLsAPIView(ListCreateAPIView):
queryset = ShortURL.objects.all()
serializer_class = ShortURLResponseSerializer
- DRF가 제공하는 최적화 CBV (Class-Based View) 조합
- 별도 Mixin 선언 없이 기능 자동 제공
10. ViewSet + Router 활용 (코드 간소화)
from rest_framework.viewsets import GenericViewSet
from rest_framework.routers import DefaultRouter
class ShortURLViewSet(ListModelMixin, CreateModelMixin, DestroyModelMixin, GenericViewSet):
queryset = ShortURL.objects.all()
serializer_class = ShortURLResponseSerializer
lookup_field = "code"
router = DefaultRouter()
router.register("api/short-urls", ShortURLViewSet, basename="short_urls")
# urls.py
urlpatterns = [
path('', include(router.urls)),
]
11. DRF View 종류 선택 기준
추상화 수준 구현 방식 특징
낮음 | 함수형 View | 단순 기능 테스트용, 작은 기능에 적합 |
중간 | APIView / GenericAPIView | 명확한 제어 가능, 필요한 부분만 커스터마이징 |
높음 | ViewSet + Router | 코드 간소화, 빠른 구축에 적합 |
예시:
@api_view(['GET'])
def hello_world(request):
return Response({"ping": "pong"})
📌 정리: DRF는 Django의 기능을 확장하여 RESTful API 개발을 간단하고 유연하게 만들어줍니다. 각 View 스타일은 개발 상황에 맞춰 선택 가능하며, 직렬화 및 유효성 검사를 통해 데이터 흐름을 명확하게 관리할 수 있습니다.
'Django' 카테고리의 다른 글
Chapter 8-2 Django에서 커스텀 유저 모델 만들기 (AbstractBaseUser 활용) (0) | 2025.05.12 |
---|---|
Chapter 8-1 [인스타그램] 회원가입 및 로그인 기능 만들기 (0) | 2025.05.12 |
Chapter 7-5 Django 블로그 이미지 포토 및 얻어서 생성하는 썸네일 구현 (0) | 2025.05.11 |
Chapter 7-4 Django 블로그 구성에 이미지 업로드 기능 추가하기 (0) | 2025.05.11 |
Chapter 7-3 Django Summernote iframe 메시 구성와 'codeview' 설정의 의의 (0) | 2025.05.11 |