본문 바로가기
source-code/Django

Django REST Framework _ ViewSets & Router 이용하기

by mattew4483 2021. 2. 10.
728x90
반응형

REST framework는 ViewSets라는 추상 클래스를 제공한다.

이 녀석을 통해 개발자는 API의 상호작용이나 상태별 모델링에 집중할 수 있고, 

URL구조는 기본 관례에 의해 자동적으로 설정된다...고 한다! (무슨 소리인지 원)

 

그래서 ViewSets이 뭔디? → View와 거의 유사!

다만 GET과 PUT은 지원하지 않고, READ와 UPDATE 메서드를 지원한다.

 

ViewSets는 메서드가 실제 뷰로 구체화될 때 이를 연결해주기만 하며, 

복잡한 URL의 경우 Router 클래스를 사용해 처리한다고 한다.

 

무슨 소리인지 모르겠으니... 지금껏 만들 view들을 살펴보며 ViewSets을 이용해 refactoring 해볼 예정!

 

www.django-rest-framework.org/tutorial/6-viewsets-and-routers/

 

6 - Viewsets and routers - Django REST framework

REST framework includes an abstraction for dealing with ViewSets, that allows the developer to concentrate on modeling the state and interactions of the API, and leave the URL construction to be handled automatically, based on common conventions. ViewSet c

www.django-rest-framework.org

역시나 공식 문서의 ViewSets & Routers 챕터를 따라가려 한다!


1. ViewSets 이용하기

우선 가장 최근에 만든 UserList와 UserDetail을 ViewSets를 이용해 다시 만들어 보자!

 

views.py

필요한 viewsets를 import 해주시고

 

기존의 이 두 녀석을

 

views.py

이렇게 적어줄 수 있다!

ReadOnlyModelViewSet을 이용하기 때문에 자동적으로 ReadOnly가 수행되며,

list와 검색 기능을 담당하게 된다.

 

아니 그런데, list와 검색 시의 URL요청이 각기 다른데... 이걸 한 곳에서 어떻게 처리한담?

→ 이따 나오니 조금만 기다려보자.

 

다음은 generics Mixins를 사용해 만들었던 PostList와 PostDetail을 refactoring 해보자.

이 두 녀석을 합쳐 하나로 만들어버릴 텐데...!

 

views.py

쨔자잔. ModelViewSet를 이용해 CRUD를 수행!

당연히 queryset과 serializer_class와 permission_classes는 지정해준다.

 

이렇게만 적어줬다는 건...? 각 HTTP 요청(GET, POST 등등등)에 따라 수행되는 기능이 달라지는 것! 와우!

 

그런데 CRUD 말고 다른 기능을 수행하려면? → @action 데코레이터를 이용한다!

요 녀석은 기본적으로 GET 요청에 응답. method인자를 설정해 POST 요청에도 응답할 수 있단다.

또한 URL은 기본적으로 메서드의 이름과 같다! 이게 싫다면 데코레이터에 url_path인자를 지정해주면 된단다.

 

2. Router 이용하기

이용하기 전! 아까 전에 생겼던 의문, 하나의 view로 각기 다른 URL요청을 어떻게 처리하는지 해결해보자.

이를 위해 ViewSet의 view들을 명시적으로 적어줄 예정. 물론 URL에!

 

urls.py

우선 더 이상 사용하지 않는 view들 대신...

 

이 친구들을 import!

 

urls.py

url 요청 시 → 작동될 view를 지정해주자!

ViewSet 클래스의 뷰들을 HTTP 메서드에 따라 실제 뷰와 연결.

또 각 HTTP 메서드마다 작동될 기능(list, create 등등등)도 지정!

 

urls.py

실제 뷰와 URL을 명확하게 연결해주면 된다!

 

그런데 Router를 이용하면 이 녀석들을 조금 더 간단하게 적을 수 있다!

우선 각 view와 DefaultRouter를 import!

DefaultRouter라는 녀석을 사용할 예정.

 

urls.py

DefaultRouter안에 우리가 만든 view를 넣어준다!

 

urlpatterns를 router.urls에 include 했기 때문에... 이제 API의 URL요청은 router에 의해 결정된다!

 

여기 있는 posts와 users는 뭔디?

URL 요청을 보시라! api/users라는 요청에 해당 view가 작동됨을 볼 수 있다! 요 녀석을 지정해준 것.

 

요 녀석이 주석 처리된 이유는?

얘는 URL에서 파일 이름 확장자를 알려주는 역할이었다. 그런데 그대로 썼더니...

어쩌고 저쩌고 에러가 떴다!

잘 읽어보면 format을 두 번 사용했다는 뜻.

 

아항. 즉 Router안에 format을 지정해주는 기능이 포함되어 있다는 걸 유추할 수 있다!


아니 그래서 view를 어떻게 작성해야 한담?

ViewSets를 사용하면 코드가 줄어들어 한결 간결해진다!

또한 API 전반에 걸쳐 일관적인 URL을 구축할 수 있다.

 

하지만 함수형 뷰, 클래스형 뷰에 비해 명확함이 훨씬 약하다. 또한 자유도도 제한적인 편.

 

따라서? 상황에 맞게 잘 잘 잘 사용해야 한다는 말씀!

728x90
반응형