본문 바로가기
IT CHANNEL/Python

[DRF 게시판만들기] #4 GenericAPIView & Urls

by TitanX 2022. 3. 29.
목차

1. View 역할

 

2. View

 

3. GenericAPIView

 

4. Url

 

5. 게시글 확인

 

View 역할

게시판을 만들기 위해서 지금까지 했던 것들을 간단하게 정리하겠습니다.

  • 먼저 모델을 만들고 데이터와 속성을 어떻게 db에 적용할 것인지 정했습니다. 그리고 그 데이터들을 사용하기 위한 직렬화를 위해 serializer를 사용했습니다.

  • 이제 데이터 활용에 대한 기능이 필요합니다. CRUD에 따라서 데이터를 생성하고, 읽고, 수정하고, 삭제하는 등의 기본액션부터 다양하고 심화된 개발을 도와주는 것이 View 입니다.

  • 이런 View에는 html을 render하는 django 의 기본View부터 API생성을 위한 APIView 그리고 CRUD의 집합체인 ViewSet 등 다양하게 있습니다. 이번 포스트에서는 GenericAPIView를 다루겠습니다.

 

View

  • 앞서 간단하게 View 를 왜 작성해야하고 사용하는 것인지에 대해서 설명했습니다. 먼저 코드를 살펴 보겠습니다.

  • board/views.py 입니다.
    Generic API View를 사용하면 다음처럼 간단해게 몇 줄 만으로도 게시판의 뼈대를 완성할 수 있습니다.
from rest_framework.generics import ListCreateAPIView

from board.models import Post
from board.serializers import PostSerializer

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

앞에서 작성했던 models 과 serializers 를 아래의 변수처럼 지정해주면 APIView가 이를 처리합니다.

 

serializer_class = Serializer클래스명
queryset = 모델.objects.all()

 

GenericAPIView

  • View에서 CRUD를 어떻게 활용할 것인지 구상되었다면, 큰 뼈대로서 GenericAPIView를 사용할 수 있습니다.

    상속에 상속을 거쳐서 만들어진 매우 추상적인 클래스라서 코드는 매우 간결하고 파이써닉한 코드를 작성할 수 있지만,
    디테일한 커스텀이 필요한 경우 혹은 bottom-up으로 설계해야하는 프로젝트 등에는 적절하지 않다고 생각합니다.
    (그럴때는 base가 되는 APIView를 상속받아 코드를 작성하는 것이 더 낫다고 생각합니다.)


  • DRF 의 serializer에 대한 공식문서 : GenericAPIView

  • restframework에서 제공하는 GenericAPIView 의 종류에 대해서 알아보겠습니다.
    공식문서를 보면 직관적인 클래스이름으로 APIView 정의되어 있어 기능설명의 필요가 없을 정도입니다.

단일APIView

  • ListAPIView
  • CreateAPIView
  • RetrieveAPIView
  • UpdateAPIView
  • DestroyAPIView

에서 작성했던 것처럼 기능을 합쳐서 만든 GenericAPIView도 있습니다.

  • ListCreateAPIView
  • RetrieveUpdateAPIView
  • RetrieveUpdateAPIView
  • RetrieveDestroyAPIView
  • RetrieveUpdateDestroyAPIView

이렇게 합쳐서 만들어진 View들은 어떻게 만들어진 것인지 공식문서를 통해 살펴보겠습니다.

게시판앱의 리스트를 만들기 위해 사용했던 ListCreateAPIView 의 설명입니다.

 

모델 인스턴스의 컬렉션을 나타내기 위해 읽거나, 쓰는 목적의 endpoint 에 사용됩니다.

get과 post 방식을 이용한 통신을 합니다. ListAPIView는 get, CreateAPIView는 post로 통신하는 것이 합쳐진 결과입니다.

GenericAPIView, ListModelMixin, CreateModelMixin 가 더해져 만들어진 클래스입니다.

 

Url

 

 

  • 먼저 프로젝트 최상위 urls의 코드입니다. 프로젝트urls 의 urlpatterns 에서 먼저 app의 url들로 가지를 뻗치듯이 지정해줍니다.
from django.contrib import admin
from django.urls import path, include

urlpatterns = [
    path('admin/', admin.site.urls),
    path('post/', include('board.urls'))
]

여기서 path('post/', include('board.urls'))를 추가 했습니다. post라는 이름으로 경로를 설정하고, board앱의 urls를 포함하여 사용할 수 있습니다.

 

  • 게시판의 url 을 작성하기 위해선 게시판앱 board/urls.py를 생성합니다.
  • board.urls
from django.contrib import admin
from django.urls import path

from board.views import PostListCreateView

urlpatterns = [
    path('list/', PostListCreateView.as_view()),
]

기본 폼은 [프로젝트이름] 디렉토리에 있는 urls.py 와 같습니다.

board앱의 url에 게시물현황(리스트)를 보기위해 위에서 작성한 APIView를 파라미터로 받아서 {주소}/post/list/ 로 접속하면 게시물들이 보여지게 됩니다.

 

게시글 확인

  • 파이참 터미널에서 서버를 켜줍니다. ( python manage.py runserver )

  • http://localhost:8000/post/list/ 로 접속하면 게시글들에 대한 정보들이 나오게 됩니다.


그리고 하단에는 게시글을 생성하는 폼도 제공이 됩니다.
(하지만 현재 어떤 유저가 작성했는지 모르기 때문에 해당 url에서 직접 게시글을 작성해도 create되지 않습니다.
현재단계에서는 ORM으로 게시글을 작성하고 확인합니다.)

 

게시판 base 구현

API를 빠르게 구현하는 rest_framework로 게시판의 base를 만들었습니다.

여기서 세부적인 개발을 통해 살을 더해나가면 더 많은 기능을 가지는 게시판이 될 것입니다. 아이디어만 있다면 끝도 없이 기능을 더할 수 있기 때문에 DRF의 튜토리얼 개념으로 이 시리즈를 활용하면 좋을 것 같습니다. 이 기본게시판 프로젝트에 계속해서 살을 더하면서 개념을 추가적으로 업로드 할 생각입니다.

 


여담

주니어개발자로 계속 django로 개발하면서 공부하고 있습니다. 누군가에게 무엇을 가르쳐 줄만큼 대단한 실력이 아니라고 생각하지만, 처음 개발을 할때 “시각적인 자료"나 “약간의 보충설명" 정도만 있어도 ‘이해하는데 많은 도움이 될것’이라 생각했기 때문에, 점점 보완해서 업로드 할 생각입니다.

작성하면서 잘못되거나 부족한 부분이 있을 수도 있습니다. 혹시 발견하셨다면 언제든지 편안하게 댓글남겨주세요~