본문 바로가기
IT CHANNEL/Python

[DRF 게시판만들기] #1 Intro

by TitanX 2022. 2. 27.

Hongreat What I Learn

Django 를 restful 하게 사용하는 이유, restful 이란?

django 는 파이썬언어로 만들 수 있는 web 어플리케이션 프레임워크 입니다.

이전 까지는 프로젝트를 하면서 api 를 활용할 만큼 프론트단에서 프레임워크나 라이브러리를 크게 활용하지 않고, html/css 부트스트랩 등으로 화면구성을 했기 때문에 api 를 활용하지는 않았습니다.

하지만, 프로젝트의 규모와 로직이 복잡해질수록 프론트엔드 백엔드를 구분하는 것이 더 나을 수 밖에 없습니다.

db와 관련된 모든 로직을 백엔드에서 처리하는 것이기 때문입니다.

Home - Django REST framework

사용하는 방법(basic)

기본적인 django 는 세팅되었다고 가정합니다.

  • 설치
    • pip intall djangorestframework
    • pip intall django-filter
  • django setting에서 INSTALLED_APP 에 ‘rest_framework’ 추가

django VS rest_framework

rest_framework 역시 django 프레임워크의 일부지만, view와 serializer의 역할과 기능을 알게되고 api를 지원하는 수준은 차원이 다르다고 생각했습니다. 많은 프로젝트로 탄생한 결과물들이 일반적인 게시판 수준(단일 crud)의 기능만 있는 것이 아니기 때문이라고 생각합니다.

rest_framework를 사용함으로써 크게 두 가지를 얻는다고 생각하는데,

  1. api 구현 - 접근 제어, JSON 변환 등이 매우 용이 한 점
  2. 코드 컨벤션이 파이써닉 해지는 점 (drf 사용효과)

정도로 정의 할 수 있다고 생각합니다.

MVT구조를 기본으로 따르기 때문에 view와 serializer를 사용하는 rest_framework는 View단에서 가장 큰 차이를 느꼈습니다.

예시

  • django 에서 제공하는 generic view ↔ rest_framework 에서 제공하는 generic view를 예로 들어보겠습니다.
# from django.views.generic import ListView
class ReviewListView(ListView):
    model = Review 
    context_object_name = "reviews"

# from rest_framework.generics import ListAPIView
class ReviewListAPIView(ListAPIView):
    queryset = Review.objects.all()
    serializer_class = ReviewSerializer

두 개의 view는 같은 기능을 하지만 변수로 지정되는 것과 방식이 매우 다릅니다.

먼저 처음의 ReviewListView를 보면 모델을 정의 받고 html 단에서 사용하기 위해 모델의 objects을 문자열로 지정해줬습니다.

반면, rest_framework 의 ListAPIView를 상속한 ReviewListAPIView의 경우에는 queryset을 Review 모델의 객체들을 지정받고, 아래의 Serializer 클래스를 사용합니다.

이 serializer 는 rest_framework 에서 데이터직렬화를 해주는 기능입니다.

가장 중요하고 강력한 기능이기 때문에, 따로 다루도록 하겠습니다.

 

여기서 ListAPIView 외에 CRUD를 다양하게 조합한 다양한 APIView와 ViewSet등이 존재하며, 이는 endpoint를 url 로 하여, 원하는 구현을 로직을 잘 설정하면 매우 강력하고 간편한 클래스로 활용됩니다.

view역시 함수형 view 와 class 형 view, ViewSet 등 다양하게 만들 수 있습니다.

from rest_framework import serializers
from [app].models import Review

class ReviewSerializer(serializers.ModelSerializer):
    class Meta:
        model = Review
        # fields = "__all__" # 편하긴 하지만, fields를 직접 지정하는 것이 좋다.
        fields = (
            'title',
            'name',
            'image_1',
            'content',
        )

 

결과로 다음과 같은 API 를 얻을 수 있습니다.

 

 

정리

Django restframework 는 Api 를 보다 편리하게 사용할 수 있게 해주는 별개의 프레임워크라고 할 수 있겠습니다.