장고는 MVT 패턴으로 진행할 수 있고 DRF로 진행할 수 있습니다. MTV는 모델이 데이터를 처리하고, 뷰가 비즈니스 로직을 처리하고, 템플릿이 프레젠테이션을 처리하는 아키텍처를 였습니다. 그러나 웹 애플리케이션이 발전함에 따라 다양한 클라이언트에 데이터를 제공하기 위해 RESTful API를 구축해야 할 필요성이 대두 되었습니다. 때문에 등장한 것이 Django Rest Framework( 장고 DRF )입니다.

Django Rest Framework ( 장고 DRF )

DRF(Django Rest Framework)는 Django에서 웹 API를 구축하기 위한 강력한 툴입니다.

DRF는 RESTful 요청 및 응답을 처리하는 Django의 기능을 확장하여 클라이언트와 통신하는 API를 더 쉽게 구축할 수 있게 해줍니다.

DRF는 API 구축 프로세스를 간소화하기 위해 직렬화, 인증, 권한 및 뷰 세트를 포함한 강력한 기능 세트를 제공합니다.

MVT와 DRF 차이

MVT 방법

HTML response로 반환

urls.py

from django.urls import path
from . import views

app_name = "articles"
urlpatterns = [
    path("html/", views.article_list_html, name="article_list_html"),
]

views.py

from django.shortcuts import render
from .models import Article


def article_list_html(request):
    articles = Article.objects.all()
    context = {"articles": articles}
    return render(request, "articles/articles.html", context)

templates

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>API PJT</title>
</head>
<body>
    <h1>Article List</h1>
    <hr><br>

    {% for article in articles %}
        <h3>title: {{ article.title }}</h2>
        <p>content: {{ article.content }}</p>
        <p>created_at: {{ article.created_at }}</p>
        <p>updated_at: {{ article.updated_at }}</p>
        <hr>
    {% endfor %}

</body>
</html>

브라우저

장고 직렬화 매소드 이용한 API 개발

장고에서 template가 아닌 JSON 데이터를 반환하는 API를 만들 수도 있습니다.

우선 직렬화 (시리얼라이져(serializer)) 메소드를 사용하기 전에 queryset을 딕셔너리로 변환 후 JSON으로 응답하는 방법을 보겠습니다.

JSON response로 반환

urls.py

from django.urls import path
from . import views

app_name = "articles"
urlpatterns = [
    path("html/", views.article_list_html, name="article_list_html"),
    path("json1/", views.json1, name="json1"),
]

views.py

def json1(request):
    articles = Articles.objects.all()
    json_res = []

    for article in articles:
        json_res.append(
            {
                "title": article.title,
                "content": article.content,
                "created_at": article.created_at,
                "updated_at": article.updated_at,
            }
        )
    # JsonResponse에 첫번째로 넘겨주는 인자가 딕셔너리면 safe=False할 필요 없음
    return JsonResponse(json_res, safe=False)

브라우저

장고 serializers 사용하여 직렬화

위의 방법도 가능하지만 serializers 메소드를 사용하면 더욱 간단하게 JSON 데이터로 직렬화 할 수 있습니다.

urls.py

from django.urls import path
from . import views

app_name = "articles"
urlpatterns = [
    path("html/", views.article_list_html, name="article_list_html"),
    path("json1/", views.json1, name="json1"),
    path("json2/", views.json2, name="json2"),
]

views.py

from django.http import HttpResponse
from django.core import serializers

def json2(request):
    articles = Articles.objects.all()
    res_data = serializers.serialize("json", articles)
    return HttpResponse(res_data, content_type="application/json")

브라우저

장고의 Serializer는 내부적으로 직렬화를 제공해주지만 모델 구조로만 직렬화를 해줍니다.

이는 데이터 구조의 변경을 원할 때는 추가 작업이 필요함을 의미합니다.

유연한 API를 위한 기능이라기 보다는 모델의 데이터를 export 해주는 용도에 가까운 거죠

장고 DRF

웹 API를 구축하기 위한 DRF는 RESTful한 API를 손쉽게 구현할 수 있게 해줍니다.

앞서서 보았던 방법보다 간단하면서 유연하게 API를 수정할 수 있게 해줍니다.

장고 DRF 설치 및 설정

pip install djangorestframework

settings.py

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

장고 DRF 구현

urls.py

from django.urls import path
from . import views

app_name = "articles"
urlpatterns = [
    path("html/", views.article_list_html, name="article_list_html"),
    path("json1/", views.json1, name="json1"),
    path("json2/", views.json2, name="json2"),
    path("json-drf/", views.json_drf, name="json_drf"),
]

serializers.py

from rest_framework import serializers
from .models import Articles


class ArticleSerializer(serializers.ModelSerializer):
    class Meta:
        model = Articles
        fields = "__all__"

views.py

from rest_framework.decorators import api_view
from rest_framework.response import Response
from .serializers import ArticleSerializer

@api_view(["GET"])
def json_drf(request):
    articles = Articles.objects.all()
    serializer = ArticleSerializer(articles, many=True)
    return Response(serializer.data)

브라우저

훨씬 깔끔한 형태로 JSON 데이터를 보여줍니다.

마치며

장고 DRF 를 사용하면 CRUD에 해당하는 API를 손쉽게 구현할 수 있습니다. 해당 포스트는 다음에 올리도록 하겠습니다.

MVT 보다는 DRF 가 프런트엔드하고 협업하기도 훨씬 좋아 보이고 API를 구조적으로 만들 수 있는 것 같아서 좋은 것 같습니다…!!

참고하면 좋은 글

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다


목차