🚀 Django REST Framework (DRF) 개요 & API 개발 정보 ( 라이브세션 1일차 강의자료 )

2025. 5. 12. 10:09·Django

🚀 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
'Django' 카테고리의 다른 글
  • Chapter 8-2 Django에서 커스텀 유저 모델 만들기 (AbstractBaseUser 활용)
  • Chapter 8-1 [인스타그램] 회원가입 및 로그인 기능 만들기
  • Chapter 7-5 Django 블로그 이미지 포토 및 얻어서 생성하는 썸네일 구현
  • Chapter 7-4 Django 블로그 구성에 이미지 업로드 기능 추가하기
Chansman
Chansman
안녕하세요! 코딩을 시작한 지 얼마 되지 않은 초보 개발자 찬스맨입니다. 이 블로그는 제 학습 기록을 남기고, 다양한 코딩 실습을 통해 성장하는 과정을 공유하려고 합니다. 초보자의 눈높이에 맞춘 실습과 팁, 그리고 개발하면서 겪은 어려움과 해결 과정을 솔직하게 풀어내려 합니다. 함께 성장하는 개발자 커뮤니티가 되기를 바랍니다.
  • Chansman
    찬스맨의 프로그래밍 스토리
    Chansman
  • 전체
    오늘
    어제
    • 분류 전체보기 (727) N
      • Python (32)
      • 프로젝트 (55) N
      • 과제 (25)
      • Database (40)
      • 멘토링 (11)
      • 특강 (37)
      • 기술블로그 (41) N
      • 기술블로그-Fastapi편 (33)
      • 기술블로그-Django편 (153)
      • 기술블로그-Flask편 (36)
      • AI 분석 (5) N
      • HTML & CSS (31)
      • JavaScript (17)
      • AWS_Cloud (21)
      • 웹스크래핑과 데이터 수집 (14)
      • Flask (42)
      • Django (77)
      • Fastapi (16)
      • 연예 (10) N
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    trumpmuskclash
    japanricecrisis
    chinanightlife
    RM
    basalcellcarcinoma
    homebartrend
    btsreunion
    militarydischarge
    titaniumcase
    hotcoffeecase
    뷔
    뷔제대
    chansmannewspick
    livebroadcast
    globaleconomy
    urbantrends
    oliveoilhealth
    뷔전역
    evoo
    americaparty
    foodshortage
    newpoliticalparty
    galaxys25ultra
    youngprofessionals
    smartphonedurability
    bts
    skincancerawareness
    classaction
    americanlaw
    lawsuitculture
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
Chansman
🚀 Django REST Framework (DRF) 개요 & API 개발 정보 ( 라이브세션 1일차 강의자료 )
상단으로

티스토리툴바