Backend/Django

[django-rest-framework] (1) API서버 / REST / django-rest-framework

dltjdn 2022. 1. 18. 20:19

API 서버란?

  • 앱/웹 서비스를 만드는 개발자들이 이용하는 데이터(주로 json 포맷 사용) 위주의 서비스

- http 프로토콜에서 클라이언트가 서버에 html형식 요구하는 대신 스타일과 로직을 제외한 순수 데이터(xml, json)만 요구 

 

  • 시간이 지나도 호환성 유지해야 함

- 앱은 유저가 원할 때 업데이트 / 웹은 자동으로 항상 최신버전 사용하게 됨

- 유저층이 사용하는 버전 다양해 API에도 버전 개념 있음 ex) /api/v1/posts/, /api/v2/posts/   ( 요청 url에 지정 )

 

 

REST ( Representional State Transfer )

  • 아키텍처 스타일
  • 프로토콜에 독립적 But, 일반적인 REST 구현에 HTTP 사용

 

RESTful API의 디자인 원칙

  • 리소스(ex 장고 모델)를 중심으로 디자인

/customers/  고객 컬렉션

/customers/5/  pk가 5인 고객

 /customers/5/orders  고객 5에 대한 모든 주문

 /orders/99/customer/  주문 99의 고객

 

TIP  url은 가능한 심플하게 구성하기 -> 유연성 up

 

  • 클라이언트에서 액세스 할 수 있는  모든 종류의 개체/서비스가 리소스에 포함
  • 리소스마다 해당 리소스를 고유하게 식별하는 식별자
  • 요청/응답 포맷으로 흔히 JSON을 사용 ( 요즘은 xml 잘 사용하지 x )
{
    "pk" : 1,
    "name": "영국"
    "user_id": 100
    "place_set" : [100, 102, 300]
}
  • uniform 인터페이스 적용 -> 리소스에 표준 HTTP 동사 (GET, POST, PUT, PATCH, DELETE)를 적용

- GET : 리소스의 표현, 조회 / 응답 본문에 리소스의 세부 정보

 ex) /posts/ 모든 포스팅 목록   |   /posts/1/ 포스팅 1에 대한 내용  |  /posts/1/comments/ 포스팅 1에 대한 모든 댓글 목록 

상태 코드 : 일반적으로 200 (OK), 리소스 못 찾으면 404 ( Not Found ) 

 

- POST : 새 리소스 생성 요청 / 응답 본문에 새 리소스의 세부 정보 제공

 ex) /posts/ 새 포스팅 만들기   |   /posts/1/comments/ 포스팅 1에 새 댓글 만들기

상태 코드 :  201 (Created) 응답, 새 리소스를 만들지 않은 경우 200(OK) 응답하고 응답 본문에 포함 또는 204(내용 없음), 잘못된 요청은 400 (잘못된 요청)

 

- PUT : 기존 리소스의 리소스의 모든 것을 업데이트  / 요청 본문에 업데이트할 리소스 정보 제공

같은 요청 할 때마다 서버 상에서 같은 결과 보장되야함

 ex) /posts/ 포스팅 대량 업데이트  |   /posts/1/ 포스팅 1의 내용 업데이트  |  /posts/1/comments/ 포스팅 1의 댓글 대량 업데이트

상태 코드 : 성공할 경우 200 (OK) 또는 204(내용 없음), 실패할 경우 409(충돌)

 

- PATCH : 기존 리소스의 일부를 업데이트 / 요청 본문에 갱신할 리소스 정보 제공

 

- DELETE : 지정 리소스를 제거

 ex) /posts/ 모든 포스팅 삭제   |   /posts/1/ 포스팅 1 삭제  |  /posts/1/comments/ 포스팅 1의 모든 댓글 삭제 

상태 코드 : 성공하면  204 (내용 없음) , 리소스가 없는 경우 404 (Not Found)

 

 

요청/응답 형식 지정

Content-Type 헤더 ( Http 프로토콜 )

application/json, application/pdf, application/vnd.ms-excel 등 요청 시  처리를 원하는 형식 지정하면,

서버에서 이 형식을 지원한다면 응답 or 지원하지 않는다면 415( 지원하지 않는 미디어 유형 )

 

API와 Rest API의 차이점

REST API = REST 아키텍처를 제대로 지원하는 API

보통의 API = HTTP API ( http 프로토콜을 통한 api )  = Web API

 

But 대부분 REST API라고 부르는 것들은 단순히 HTTP 프로토콜을 통한 API 이기에

대부분의 REST API는 REST 아키텍처 스타일을 지키지 않는다

 

 

django-rest-framework (DRF)

장고의 패러다임 하에 빠르고 관리하기 쉬운 REST API를 만들 수 있게 도와준다

 

  • Serializer/ModelSerializer를 통한 데이터 유효성 검증 및 데이터 직렬화 ( json, xml 형식 )

Serializer는 장고 기본의 form과 유사, ModelSerializer는 장고 ModelForm과 유사

 

  • 각종 Parser를 통한 데이터 처리

다양한 요청 포맷을 parser을 통해 일관되게 처리

 

  • APIView / Generic View / ViewSet / ModelViewSets를 통한 요청 처리

함수기반 뷰나 클래스 기반 뷰를 사용할 때 반복되는 부분을 패턴화 하여 관리하기 쉽게 지원

 

  • 각종 Renderer를 통한 다양한 응답 포맷(엑셀, pdf, xml 등) 지원
  • 인증(Authentication) / 권한 (Permission) 체계 지원 

djagno-rest-framework 기본에서는 Token인증만 지원하지만 써드파티 라이브러리를 통해 JWT 지원

 

  • Throttling ( 최대 호출 횟수 제한)에 대한 기반
  • 리소스에 대한 대표적인 동작인 CRUD를 쉽게 만들 수 있도록 지원