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를 쉽게 만들 수 있도록 지원