API 서버
- 앱/웹 서비스를 만드는 개발자들이 이용하는 데이터 위주의 서비스로, 주로 JSON 포맷을 사용한다.
- 앱은 유저들이 사용하는 버전이 다양하기 때문에 API에 버전 개념이 존재하며, 버전 간의 호환성을 유지해야 한다.
- 반면에 웹 서비스를 이용하는 유저는 항상 최신 버전을 사용하게 된다.
HTTP 클라이언트 프로그램
- 유저가 웹 브라우저를 통해 웹페이지 간 이동
- 웹 프론트엔드에서 JavaScript를 통해 호출
- Android/iOS 앱 코드를 통한 호출
- 웹 요청 개발 프로그램을 통한 호출
- GUI: Postmat
- CLI: cURL, HTTPie
- 라이브러리: requests
REST
- 아키텍처 스타일로 프로토콜에 독립적이며, 일반적인 REST 구현에는 HTTP를 사용한다.
RESTful API 디자인 원칙
- 리소스를 중심으로 API를 설계한다. (심플하고 유연성있게 구성)
- 클라이언트에서 액세스할 수 있는 모든 종류의 개체/서비스가 리소스에 포함된다.
- 리소스마다 해당 리소스를 고유하게 식별하는 식별자가 있어야 한다.
- 요청/응답 포맷으로 흔히 JSON을 사용한다. (JSON이 XML보다 데이터 용량이 작기 때문에 응답이 더 빠름)
- 균일한 인터페이스를 적용한다. (리소스에 표준 HTTP 동사 사용)
HTTP 메서드
- GET: 리소스의 표현으로, 응답 본문에 리소스의 세부 정보를 제공한다.
- POST: 새 리소스 생성 요청으로, 응답 본문에 새 리소스의 세부 정보를 제공한다. (멱등성 미보장)
- PUT: 기존 리소스를 대체하며, 요청 본문에 갱신할 리소스의 정보를 제공한다. (멱등성 보장)
- PATCH: 기존 리소스를 부분 대체하며, 요청 본문에 갱신할 리소스 정보를 제공한다. (멱등성 미보장)
- DELETE: 지정한 리소스를 제거한다.
리소스 | POST | GET | PUT | DELETE |
/posts/ | 새 포스팅 만들기 | 모든 포스팅 목록 | 포스팅 대략 업데이트 | 모든 포스팅 삭제 |
/posts/1/ | 오류 | 포스팅 1에 대한 내용 | 포스팅 1의 정보 갱신 | 포스팅 1 삭제 |
/posts/1/comments | 포스팅 1의 새 댓글 만들기 | 포스팅 1에 대한 모든 댓글 목록 | 포스팅 1의 댓글 대량 없데이트 | 포스팅 1의 모든 댓글 삭제 |
HTTP 메서드 별 상태 코드
- GET
- 일반적으로 200 OK 응답
- 리소스를 못 찾을 경우 404 Not Found 응답
- POST
- 201 Created 응답 (새 리소스의 URI는 응답의 Location 헤더에 포함)
- 새 리소스를 만들지 않은 경우, 200로 응답하고 응답 본문에 포함하거나 반환할 결과가 없으면 204 내용없음을 반환
- 잘못된 데이터로 요청하면 400 잘못된 요청으로 응답하고 응답 본문에 오류 정보 또는 자세한 정보를 제공하는 URI 링크를 포함
- PUT
- 기존 리소스를 업데이트할 경우 200 OK 또는 204 내용없음 반환
- 상황에 따라 업데이트할 수 없는 경우 409 충돌 반환
- DELETE
- 성공하면 응답 본문에 추가정보가 포함되지 않았음을 의미하는 204 응답
- 리소스가 없는 경우 404 응답
- 비동기 작업
- 작업 완료에 시간이 오래 걸리는 경우 다른 Task Queue를 통해 비동기 처리를 할 수 있다.
- 이때 요청은 수락되었지만 아직 완료되지 않았음을 의미하는 202 수락됨 응답
- 클라이언트가 이 작업을 Polling을 통해 모니터링할 수 있도록 비동기 요청의 상태를 반환하는 URI를 Location 헤더로 반환
요청/응답 형식 지정 (Content-Type 헤더)
- 요청 시에 처리를 원하는 형식을 지정하면 서버에서 지정한 형식으로 응답한다.
- 만약 서버에서 해당 형식을 지원하지 않으면 HTTP 상태코드 415 (지원하지 않는 미디어 유형)를 반환한다.
- ex) application/json, application/vnd.ms-excel, image/jpeg, application/pdf 등
django-rest-framework
- Serializer/ModelSerializer를 통한 데이터 유효성 검증 및 데이터 직렬화
- 각종 Parser를 통한 데이터 처리
- APIView/Generic/ViewSet/ModelViewSets를 통한 요청 처리
- 각종 Renderer를 통한 다양한 응답 포맷 지원
- 인증/권한 체계 - 써드파티를 통해 JWT 지원
- Throttling (최대 호출 횟수 제한)