내일배움캠프 본캠프 30일차 - DRF가 뭐죠?
Django REST Framework(DRF)란?
Django REST Framework(DRF)는 Django 기반의 애플리케이션에서 RESTful API를 쉽고 강력하게 구축할 수 있도록 지원하는 라이브러리입니다.
RESTful API는 클라이언트와 서버 간에 데이터를 주고받기 위해 HTTP를 사용하는 방식으로, 웹 서비스, 모바일 앱, IoT 등 다양한 환경에서 사용됩니다.
1. DRF의 주요 특징
1) 강력한 기능 제공
- Serializer: Django 모델이나 Python 객체를 JSON 등으로 변환하고, 반대로 데이터를 객체로 역직렬화합니다.
- APIView와 Generic 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 데이터 전송)
요약
- DRF 설치 및 설정 (rest_framework 추가)
- 모델 작성 (models.py)
- Serializer 작성 (serializers.py)
- 뷰 작성 (views.py, 제네릭 뷰 활용)
- URL 연결 (urls.py)
- API 테스트 (Postman, 브라우저 등)
이 과정을 통해 기본 CRUD API를 손쉽게 생성할 수 있습니다.
5. DRF의 활용 사례
- RESTful API 제공: 모바일 앱이나 프론트엔드(React, Vue.js 등)와 데이터 통신.
- 데이터 마이크로서비스: 백엔드 서비스 간 데이터 교환.
- IoT 서비스: IoT 기기와 데이터 동기화 API 제공.