Django REST Framework
Django REST Framework (DRF) 는 Django 애플리케이션에서 쉽게 REST API 를 만들 수 있도록 도와주는 도구입니다. 어떤 애플리케이션에서 특정 데이터를 요청하면, DRF 가 이를 처리하고 필요한 데이터를 반환해주는 방식으로 동작합니다.
기본 설정
rest_framework 를 core/settings.py 의 INSTALLED_APPS 에 등록합니다.
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'rest_framework', # DRF 추가
# ...
]
Django vs DRF 모델 구현
Django
기본 Django 에서는 아래와 같이 단순히 app_name/models.py 만 구현하면 됩니다.
# app_name/models.py
from django.db import models
class BlogPost(models.Model):
title = models.CharField(max_length=100)
content = models.TextField()
published_date = models.DateTimeField(auto_now_add=True)
def __str__(self):
return self.title
DRF
기본 Django 와는 다르게 DRF 에서는 app_name/models.py 와 함께 app_name/serializers.py 도 함께 구현하여 직렬화 과정을 거쳐야합니다. 직렬화를 통해 Django 객체를 Python 의 기본 데이터 타입 (dict, list 등) 으로 변환하며 이를 DRF 의 Response 객체가 JSON 형식으로 변환하여 클라이언트에 전달합니다. 이는 클라이언트와 서버 간 데이터 교환에 필수적인 과정입니다.
컴퓨터 공학에서 직렬화 (Serialization) 는 데이터 구조나 객체를 저장하거나 전송할 수 있도록 연속적인 바이트 형태로 변환하는 과정을 의미합니다.
Python 의 dict 자체는 네트워크 전송이나 저장이 바로 가능한 형태는 아닙니다. 일반적인 관점에서는 JSON 변환도 직렬화의 일부이지만 DRF 의 표현 방식은 직렬화와 JSON 변환을 분리하여 더 세부적인 단계를 제공하려는 의도입니다.
# app_name/models.py
from django.db import models
class BlogPost(models.Model):
title = models.CharField(max_length=100)
content = models.TextField()
published_date = models.DateTimeField(auto_now_add=True)
def __str__(self):
return self.title
# app_name/serializers.py
from rest_framework import serializers
from .models import BlogPost
class BlogPostSerializer(serializers.ModelSerializer):
class Meta:
model = BlogPost
fields = '__all__'
Django vs DRF URL 설정
Django
기본 Django 에서는 뷰를 함수 형식으로 구현하는것이 일반적이며 아래와 같이 모듈 내에서 함수 단위로 호출하는 것이 보편적입니다. name 인자에 여러 단어로 구성된 문자열을 주기 위해서는 보통 언더스코어 (_) 를 사용합니다.
# app_name/urls.py
from django.urls import path
from . import views
app_name = 'api'
urlpatterns = [
path('blogposts/', views.function_views, name='function_views'),
# ...
]
DRF
DRF 에서는 뷰를 클래스 형식으로 구현하는것이 일반적이며 아래와 같이 클래스 단위로 호출하는 것이 보편적입니다. name 인자에 여러 단어로 구성된 문자열을 주기 위해서는 보통 하이픈 (-) 을 사용합니다.
# app_name/urls.py
from django.urls import path
from .views import ClassBasedViews
app_name = 'api'
urlpatterns = [
path('blogposts/',
ClassBasedViews.as_view(),
name='class-based-views'),
# ...
]
뷰 구현
DRF 에는 ListCreateAPIView, RetrieveUpdateDestroyAPIView 와 같은 기본 뷰들이 제공되어서, 쉽게 API 의 CRUD 기능을 만들 수 있습니다.
# app_name/views.py
from rest_framework import generics, status
from rest_framework.views import APIView
from rest_framework.response import Response
from .models import BlogPost
from .serializers import BlogPostSerializer
class BlogPostListCreate(generics.ListCreateAPIView):
queryset = BlogPost.objects.all()
serializer_class = BlogPostSerializer
def delete(self, request, *args, **kwargs):
BlogPost.objects.all().delete()
return Response(status=status.HTTP_204_NO_CONTENT)
# ...
class BlogPostList(APIView):
def get(self, request, format=None):
title = request.GET.get("title", "")
if title:
blog_posts = BlogPost.objects.filter(title__icontains=title)
else:
blog_posts = BlogPost.objects.all()
serializer = BlogPostSerializer(blog_posts, many=True)
return Response(serializer.data, status=status.HTTP_200_OK)
# ...
'Dev > Web Programming' 카테고리의 다른 글
DRF Views 정리 (6) | 2024.11.25 |
---|---|
Django vs Django REST Framework (4) | 2024.11.12 |
Django 입문 가이드 (7) | 2024.11.05 |
React 와 Django 간의 데이터 통신: HTTP 와 REST API 로 구현하기 (5) | 2024.10.14 |