TIL

내일배움캠프 본캠프 30일차 - DRF가 뭐죠?

수현조 2025. 1. 7. 20:33

Django REST Framework(DRF)란?

Django REST Framework(DRF)는 Django 기반의 애플리케이션에서 RESTful API를 쉽고 강력하게 구축할 수 있도록 지원하는 라이브러리입니다.

RESTful API는 클라이언트와 서버 간에 데이터를 주고받기 위해 HTTP를 사용하는 방식으로, 웹 서비스, 모바일 앱, IoT 등 다양한 환경에서 사용됩니다.


1. DRF의 주요 특징

1) 강력한 기능 제공

  • Serializer: Django 모델이나 Python 객체를 JSON 등으로 변환하고, 반대로 데이터를 객체로 역직렬화합니다.
  • APIViewGeneric Views: 코드 작성량을 줄이고 효율적으로 API를 생성할 수 있습니다.
  • 인증 및 권한(Authorization): 다양한 인증 방법(토큰, 세션 등)을 지원하며, 사용자 권한을 설정할 수 있습니다.
  • Throttling: 요청 제한 기능으로 API 남용을 방지합니다.
  • 필터링 및 검색: API 데이터에서 검색, 필터링, 정렬 기능을 쉽게 구현할 수 있습니다.

2) RESTful API 표준 준수

HTTP 메서드(POST, GET, PUT, DELETE 등)를 기반으로 리소스 조작 방식을 정의합니다. 예:

  • GET /api/posts/: 모든 게시글 조회
  • POST /api/posts/: 새 게시글 생성
  • PUT /api/posts/1/: 게시글 1번 수정
  • DELETE /api/posts/1/: 게시글 1번 삭제

3) 직관적인 브라우저 API 인터페이스

DRF는 브라우저에서 쉽게 API를 테스트하고 탐색할 수 있는 HTML 기반 인터페이스를 제공합니다.


2. DRF를 사용하는 이유

1) 복잡한 API를 간단하게 구현

  • DRF는 Django ORM과 자연스럽게 통합되어 모델 데이터를 직렬화하거나 CRUD 작업을 쉽게 처리할 수 있습니다.

2) 인증 및 권한 처리 간소화

  • 인증(예: JWT, OAuth2)을 쉽게 설정하고, 사용자의 접근 권한을 세밀하게 관리할 수 있습니다.

3) 유지보수성과 재사용성 증가

  • 제네릭 뷰와 뷰셋(ViewSets)을 사용하면 코드 중복을 줄이고 유지보수가 쉬워집니다.

4) 대규모 프로젝트에서도 확장성 제공

  • DRF는 다양한 확장 기능과 설정 옵션을 제공하여 작은 API부터 대규모 서비스까지 유연하게 대응할 수 있습니다.

3. DRF 주요 구성 요소

1) Serializer

데이터를 JSON 등 직렬화 가능한 형식으로 변환하거나, 역직렬화하여 데이터를 Python 객체로 변환합니다.

from rest_framework import serializers
from .models import Post

class PostSerializer(serializers.ModelSerializer):
    class Meta:
        model = Post
        fields = ['id', 'title', 'content']

2) APIView

Django의 일반적인 View를 확장하여 RESTful API를 생성합니다.

from rest_framework.views import APIView
from rest_framework.response import Response

class HelloWorldAPIView(APIView):
    def get(self, request):
        return Response({"message": "Hello, DRF!"})

3) Generic Views

CRUD 작업을 간소화한 제네릭 뷰를 제공합니다.

from rest_framework.generics import ListCreateAPIView
from .models import Post
from .serializers import PostSerializer

class PostListCreateView(ListCreateAPIView):
    queryset = Post.objects.all()
    serializer_class = PostSerializer

4) ViewSet

뷰셋은 CRUD 작업을 한 클래스 안에서 처리할 수 있도록 도와줍니다.

from rest_framework.viewsets import ModelViewSet
from .models import Post
from .serializers import PostSerializer

class PostViewSet(ModelViewSet):
    queryset = Post.objects.all()
    serializer_class = PostSerializer

5) Router

URL 라우팅을 쉽게 설정할 수 있도록 도와줍니다.

from rest_framework.routers import DefaultRouter
from .views import PostViewSet

router = DefaultRouter()
router.register(r'posts', PostViewSet)

urlpatterns = router.urls

5. DRF로 API 생성 기본 과정

Django REST Framework(DRF)를 사용하여 API를 생성하는 과정을 단계별로 정리하였습니다.


1) DRF 설치 및 설정

(1) DRF 설치

pip install djangorestframework

(2) settings.py에 DRF 추가 DRF를 프로젝트의 앱으로 등록합니다.

INSTALLED_APPS = [
    ...,
    'rest_framework',
]

2) 모델 작성

API로 제공할 데이터를 정의합니다. Django 모델을 사용하여 데이터베이스 구조를 작성합니다.

from django.db import models

class Post(models.Model):
    title = models.CharField(max_length=200)  # 제목
    content = models.TextField()              # 내용
    created_at = models.DateTimeField(auto_now_add=True)  # 생성 시간
    updated_at = models.DateTimeField(auto_now=True)      # 수정 시간

    def __str__(self):
        return self.title

3)Serializer 작성

모델 데이터를 JSON 등 직렬화 가능한 형태로 변환하기 위해 Serializer를 작성합니다.

from rest_framework import serializers
from .models import Post

class PostSerializer(serializers.ModelSerializer):
    class Meta:
        model = Post
        fields = '__all__'  # 모든 필드 포함

4) 뷰(View) 작성

뷰를 작성하여 클라이언트 요청을 처리하고 적절한 응답을 반환합니다. DRF는 제네릭 뷰를 사용하여 CRUD 작업을 간소화할 수 있습니다.

from rest_framework.generics import ListCreateAPIView
from .models import Post
from .serializers import PostSerializer

class PostListCreateView(ListCreateAPIView):
    queryset = Post.objects.all()  # 모든 Post 객체를 쿼리셋으로 반환
    serializer_class = PostSerializer  # PostSerializer를 사용

5) URL 연결

뷰를 URL에 연결하여 클라이언트가 API에 접근할 수 있도록 합니다.

(1) 앱의 urls.py에 URL 패턴 추가

from django.urls import path
from .views import PostListCreateView

urlpatterns = [
    path('posts/', PostListCreateView.as_view(), name='post_list_create'),
]

(2) 프로젝트 urls.py에 앱의 URL 포함

from django.urls import path, include

urlpatterns = [
    path('api/', include('blog.urls')),  # 'blog' 앱의 URL 포함
]

 

6) API 테스트

(1) 개발 서버 실행

python manage.py runserver

(2) API 엔드포인트 테스트 브라우저 또는 Postman, cURL 등으로 아래 URL에 접근

  • GET /api/posts/: 모든 게시글 조회
  • POST /api/posts/: 새 게시글 생성 (JSON 데이터 전송)

요약

  1. DRF 설치 및 설정 (rest_framework 추가)
  2. 모델 작성 (models.py)
  3. Serializer 작성 (serializers.py)
  4. 뷰 작성 (views.py, 제네릭 뷰 활용)
  5. URL 연결 (urls.py)
  6. API 테스트 (Postman, 브라우저 등)

이 과정을 통해 기본 CRUD API를 손쉽게 생성할 수 있습니다.


5. DRF의 활용 사례

  • RESTful API 제공: 모바일 앱이나 프론트엔드(React, Vue.js 등)와 데이터 통신.
  • 데이터 마이크로서비스: 백엔드 서비스 간 데이터 교환.
  • IoT 서비스: IoT 기기와 데이터 동기화 API 제공.