2022. 11. 10. 03:55ㆍ스파르타코딩(22.8.29~22.12.31)/TIL(Today I Learned)
- Today I Learned
- 이전에 FBV를 하고 CBV를 하면서 계속 해서 반복해서 나오는
DRF의 api_view / APIVIEW의 의미와 역할에 대해 알아보고자 한다.
API란 / VIEW란? ↓더보기
- API란?
API는 정의 및 프로토콜 집합을 사용하여 두 소프트웨어 구성 요소가 서로 통신할 수 있게 하는 메커니즘
API의 의미
API는 Application Programming Interface(애플리케이션 프로그램 인터페이스)의 줄임말
API의 맥락에서 Application의 단어는 고유한 기능을 가진 모든 소프트웨어를 나타냅니다.
Interface는 두 애플리케이션 간의 서비스 계약이라고 할 수 있습니다.
이 계약은 요청(Request)과 응답(Response)을 사용하여 두 애플리케이션이 서로 통신하는 방법을 정의합니다.
API 문서에는 개발자가 이러한 요청과 응답을 구성하는 방법에 대한 정보가 들어 있습니다.
-API 의 종류 (API가 생성된 시기와 이유에 따라 API는 네 가지 방식으로 작동할 수 있다.)
SOAP API
이 API는 단순 객체 접근 프로토콜을 사용합니다. 클라이언트와 서버는 XML을 사용하여 메시지를 교환합니다. 과거에 더 많이 사용되었으며 유연성이 떨어지는 API입니다.
RPC API
이 API를 원격 프로시저 호출이라고 합니다. 클라이언트가 서버에서 함수나 프로시저를 완료하면 서버가 출력을 클라이언트로 다시 전송합니다.
*프리시저 : 넓은 의미로는 어떤 업무를 수행하기 위한 절차를 뜻한다. / 어떤 프로세스를 절차적으로 기술해 놓은 것을 프로시저라 한다.
Websocket API
Websocket API는 JSON 객체를 사용하여 데이터를 전달하는 또 다른 최신 웹 API 개발입니다.
WebSocket API는 클라이언트 앱과 서버 간의 양방향 통신을 지원합니다.
서버가 연결된 클라이언트에 콜백 메시지를 전송할 수 있어 REST API보다 효율적입니다.
REST API
오늘날 웹에서 볼 수 있는 가장 많이 사용되고 유연한 API입니다. 클라이언트가 서버에 요청을 데이터로 전송합니다.
서버가 이 클라이언트 입력을 사용하여 내부 함수를 시작하고 출력 데이터를 다시 클라이언트에 반환합니다.
- VIEW란?(Django)
models.py 파일은 database와의 연결을 의미한다면
View란 Client에서 보낸 Request에 대해서 Response을 보내주는 역할을 한다.
세부적으로는 View는 Django 필요한 데이터를 모델에서 가져와서 적절히 가공하여 웹 페이지 결과를 만들도록 한다.
API와 VIEW의 의미를 확인했고 이제 API_VIEW를 확인해보려고 했다.
API : 두 요소가 서로 소통할 수 있게 하는 메커니즘 / VIEW : Request를 Response해주는 역할
자 이제 더하면
API + VIEW = API_VIEW : 두 요소가 서로 소통하며 Request를 Response 해주는 역할?
도저히 이해가 안되서 일단 기능을 알아보았다 (이것만 며칠 하..)
venv에 들어가보니
Rest_framework(DRF) > APIVIEW가 있었고 VIEW를 상속받고 있었다.
?? 상속하고있는 VIEW를 들어가보니
Django > views DRF만의 기능인줄알았는데
장고에서 VIEW를 상속받고 있었다.
해당 장고의 클래스형 VIEW의 기능을 알아보았다.
![](https://blog.kakaocdn.net/dn/crVIhQ/btrQNHDkk1v/IxKtkPOaXtVktkIL4PmZDK/img.png)
클래스형 뷰는 클래스로 진입하기 위한 진입 메소드를 제공하는데,
이것이 위 예제에서의 as_view()메소드이며, 아래의 순서로 요청을 처리한다.
- as_view() 메소드에서 클래스의 인스턴스를 생성한다.
- 생성된 인스턴스의dispatch()메소드를 호출한다.(*dispatch 뜻 : 보내다)
- dispatch() 메소드는 요청을 검사해서 HTTP의 메소드(GET, POST)를 알아낸다.
- 인스턴스 내에 해당 이름을 갖는 메소드로 요청을 중계한다.
- 해당 메소드가 정의되어 있지 않으면, HttpResponseNotAllowd 예외를 발생시킴. (*not allowed:허용되지않음
결론 : 작동할 대상의 as_view의 인스턴스(객체)를 생성하고 HTTP의 요청메소드 GET,POST를 처리한다.
* 그외 위의 사진에서 나열되있는것과 같이 GET,POST,PUT,PATCH,DELETE,HEAD,OPTIONS,TRACE의
기능을 하고 처리하는 애였던 것 이다.
그렇다면 상속을 한것으로 봐서 DRF는 장고에서의 VIEW에 추가적인 기능을 만들려고 했나보다.
- DRF의 APIVIEW
이제 DRF의 APIVIEW를 알아보자
(처음에는 기획때는 이런걸 몰랐나보다)
내용을 보면 기본적인 사용을 위해
Django HttpRequest의 인스턴스(객체)를 DRF의 인스턴스로 돌리고 시작한다.
(Django의 기능을 유지하되 이제부터 DRF로 관리를 하겠다)
후에는 기본적으로 거의 같다고 얘기하고 속성을 추가한다고 써있다.
그 속성은 뭘까 알아보았다.
조금 더 자세한 설명 : ↓
![](https://blog.kakaocdn.net/dn/pxmcA/btrQPMJXoDK/SssgK5mUUbIgsYh0NP9nN0/img.png)
1,2. (DRF에서 유용하게 사용하던 Serializer) JSON DATA로 처리하기 위한 직렬화,비직렬화
3.유저 관리하기 위한 인증
4.사용량(호출횟수 제한등)
5.접근 권한에 관한 Permission *Permission : 허가
6.위의 1,2의 직렬화의 요청처리를 위한 보조역활 content negotiation *negotiation : 협상
7.Serializer의 meta 정보를 처리위한 속성
8.API정보 탐지 *versioning : 버전관리 (서로 다른 client간에 행동을 지정 할 수 있도록 해줌) Versioning 이란?
지금까지 사용하면서 유용하다고 생각했었던 Serializer 외의 기능 뿐 아니라 여러 속성이 들어있었다!!!!
그외에 DRF의 공식문서에서는 DRF의 인스턴스화 방법 API를 구현하는 방법 등 사용방법이 적혀있었다.
처음부터 말로 잘 설명해줬으면 좋았을걸... 생각했지만 이미 적혀있었던 내용이었는데
코딩에 대한 이해도가 없어서 내용을 이해 못했던것 같다. 하지만 이와같은 과정을 통해
공식문서를 참고하는 방법에 대해서 더 구체적으로 알게된 점에 대해서 만족스럽다.
APIView의 특징
- 하나의 CBV 이므로 하나의 URL 만 처리 가능
- 각 요청 method (get, post, put, delete) 에 맞게 멤버함수를 구현하면, 해당 method 요청이 들어올 때 호출됩니다.
- 호출이 되면 호출 이전 단계(initial) 에서 다음을 처리합니다.
(1) 직렬화 / 비직렬화 처리
(2) 인증 체크
(3) 사용량 제한 체크 : 호출 허용량 범위인지 체크
(4) 권한 클래스 지정 : 비인증 / 인증 유저에 대해 해당 API 호출을 허용할 것인지 결정
(5) 요청한 버전 체크 : 요청된 API 버전 문자열을 탐지하여, request.version 에 저장
- DRF의 @API_VIEW
이제 APIVIEW를 알아보았으니 API_VIEW에 알아보자.
음 .. 영어가 약해 번역을 해보자.
별거없다.. 함수형에서도 잘 활용하라고 만들어준거다.. (순간 바보가 된느낌)
뜯어보았다.
Python 기능 중 getattr() 함수 : 이름에 해당하는 객체 속성의 값을 가져오는 Build-in 함수.
이녀석.. APIView를 가져온다..
파이썬의 데코레이터를 활용해 함수형에서도 DRF를 사용하는 방법인거였다..
서로 소통을 하고 있으니 따로 관리를 하겠구나 싶었다. 생각했던대로 경로가 달랐다 (예상했다 이자식아)
추가적으로 APIVIEW에 대해 찾아보다 알게된것.
APIView의 세부적인 기능
Mixins :
![](https://blog.kakaocdn.net/dn/DHYYd/btrQPMb7sGQ/Dk7XJwwtRq6IhDkbYvnEs0/img.png)
![](https://blog.kakaocdn.net/dn/boOwIr/btrQOmZRyAf/u7Aq4fCu9y9Lbj9DZkBf8K/img.png)
GenericAPIView :
![](https://blog.kakaocdn.net/dn/M0IkG/btrQOayAeKK/nnV8sKDocwCIhbPbTxiIR0/img.png)
![](https://blog.kakaocdn.net/dn/NacJK/btrQOCOUS1y/E3uqIlpWUhdMc6EREKtQy0/img.png)
ViewSet :
![](https://blog.kakaocdn.net/dn/b30QfD/btrQMtk47OR/ovdX88rGCNKWQal1ck4Dg0/img.png)
![](https://blog.kakaocdn.net/dn/brm1AM/btrQOAQZ716/jpE9Ssn3kZ8WmnKkaS1stK/img.png)
GenericViewSet :
![](https://blog.kakaocdn.net/dn/bA0Qal/btrQOl7HWMf/ykNVA4RHEpemnqvHxgTK7K/img.png)
![](https://blog.kakaocdn.net/dn/cmsWCk/btrQNII60F4/t5XCkarV4AeABYDTCT3arK/img.png)
ReadOnlyModelViewSet :
![](https://blog.kakaocdn.net/dn/CjVrb/btrQMs7xBFV/0wJcCzjiwLLzvS5F1akyA0/img.png)
![](https://blog.kakaocdn.net/dn/cGc8wH/btrQRF4C326/55E4kV2jacRQoFF7POFnK1/img.png)
ModelViewset :
![](https://blog.kakaocdn.net/dn/b7LD4E/btrQNGxIzNy/Wm5a05yHqhUf7gON2m8va1/img.png)
![](https://blog.kakaocdn.net/dn/Doxj9/btrQQbQiN3R/je8BLqqFlyNKT7YsCwl8rk/img.png)
해당 기능들은 앞으로 장고를 사용하면서 알아보려고 한다.
결론 :
위에서 알아본 API,VIEW는 각각 사전적 의미 또는 역할이었고,
DRF의 APIView(클래스 기반 뷰) , @api_view(함수 기반 뷰)는
Django의 VIEW의 기능을 상속받아
추가적으로 필요한 기능 Serializer,permission 등의 속성을 추가하여 만든 또 다른 장고의 확장판이었고
알아보고자 했던
APIView,@api_view는 DRF를 클래스와 함수형에 따라 사용하는 사용하는 형태였다..
시원하면서 허탈하다..
그래도
장고 제작자의 의도와
DRF의 여러 기능들
공식문서를 참고하는 방법에 대해 심층있게 알게된점에 대해 만족스러웠다.
이제 장고 기획자들이 마련해놓은 여러 기능에 대해 알아보려한다. 후련하다
탭창이 50개가 넘는것 같다. 32G 램을 사길 잘했다.
이를 위해 도와주신 KMC튜터님,YBH튜터님 감사합니다.
#번외 검색하다 우연히 알게된 DRY 원칙 더보기 : ↓
![](https://blog.kakaocdn.net/dn/U2KiN/btrQPfFD20k/eVbqu1dreqIUsnVvabFtfK/img.png)
![](https://blog.kakaocdn.net/dn/l6H7f/btrQN9fooeF/wIpkoa2m1mPBdF7qQk6oIk/img.png)
참조 : APIVIEW에 대한 자세한 설명[duo2208님 벨로그]
참조 : ReadOnlyModelViewSet[공식문서]
참조 : GenericViewSet (ViewSet,GenericViewSet,ModelViewSet)[공식문서]
'스파르타코딩(22.8.29~22.12.31) > TIL(Today I Learned)' 카테고리의 다른 글
[TIL] ORM과 객체,Class,instance에 대해 11/9 8일차 (0) | 2022.11.13 |
---|---|
[TIL] 강력한 기능 파이썬의 상속(Inheritance)에 대해 복습 11/8 7일차 (1) | 2022.11.11 |
[TIL] DRF Class Based View 클래스형 CBV 11/04 5일차 [2/2] (0) | 2022.11.04 |
[TIL] API 자동화 문서 말 그대로 멋진 SWAGGER 11/04 05일차 [1/2] (0) | 2022.11.04 |
[TIL] JSON,XML : Parser,Pasing이란? 11/03 04일차 (0) | 2022.11.03 |