🎯 목표 : REST API의 개념 이해
📒 REST ?
📌 특징과 구성
- Representational State Transfer의 약자로 HTTP 통신의 장점을 최대한 활용할수 있는 설계 아키텍처다.
- 자원(Resource - URI), 행위(Verb - HTTP Method), 표현(Representations)으로 구성 되어 있다.
- 특징으로는,
- Uniform Interface(유니폼 인터페이스) :
URI로 지정한 리소스에 대한 조작을 통일 되고 한정적인 인터페이스로 수행하는 아키텍처 스타일.
- Stateless(무상태성) :
작업을 위한 상태 정보를 따로 저장,관리 하지 않으며, 세션,쿠키 정보도 별도로 저장하고 있지 않는다. API서버는 들어오는 요청만 단순히 처리한다.
서비스 자유도가 높아지고 불필요한 정보를 서버에서 관리하지 않아, 구현이 단순해진다.
- Cacheable(캐시 가능) :
HTTP의 기존 웹 표준을 그대로 적용하기 때문에, 웹에서 사용하는 인프라를 그대로 활용한다. HTTP가 가진 캐싱 기능이 적용 가능하다.
- Self-descriptiveness(자체 표현 구조) : REST API 메세지만 보고 쉽게 이해할수 있다.
- Client - Server 구조 :
서버는 API를 제공하고 클라이언트는 사용자 인증, 컨텍스트 등을 직접 관리하는 구조로 각 역할이 확실히 구분된다.
- 계층형 구조 :
다중 계층으로 구성될수 있는데, 보안, 로드 밸런싱, 암호과 계층을 추가해 구조상 유연성을 둘수 있고 프록시와 게이트웨이 같은 네트워크 기반 중간 매체를 사용할수 있게 한다.
📒 REST API 설계 가이드
- API(Application Programming Interface)
데이터와 기능의 집합을 클라이언트로 제공하여 유저와의 상호작용을 촉진하며 정보를 서로 교환 가능하도록 만드는 인터페이스.
- REST API
REST에 기반하여 API를 구현한 것.
OpenAPI, 마이크로 서비스 등 서비스 제공 업체 대부분은 REST API를 제공한다.
📌 리소스(URI)
- 꼭 기억해야 할 가이드로 URI는 정보의 자원에 알맞은 엔드포인트로 표현해야 하며, 동사보다 명사를 사용한다. 자원에 대한 행위는 HTTP Method로 표현 한다.
# 회원을 삭제할때.
GET /members/delete/1 -> delete와 같은 행위에 대한 표현을 리소스에 적용하면 안된다.
DELETE /members/1 -> 행위에 대한 표현은 HTTP Method로 표현한다.
# 회원정보를 가져올때.
GET /members/1
# 회원을 추가
POST /members/2
# 회원정보 전체 교체
PUT /members/2
# 회원정보를 일부 교체
PATCH /members/2
- 슬래시 구분자는 계층관계를 나타내는데 사용한다.
http://api.example.com/houses/apartments
http://api.example.com/animals/mammals/whales
- URI 마지막 문자로 슬래시를 포함하지 않는다.
http://api.example.com/houses/apartments/ (X)
http://api.example.com/houses/apartments (0)
- 하이픈(-)은 URI 가독성을 높이는데 사용한다.
- 언더바(_)는 URI에 사용하지 않는다.
- URI 경로에는 소문자가 적합하다. 대소문자에 따라 다른 리소스로 인식되기 때문
- 리소스 파일의 확장자는 URI에 포함시키지 않는다. 파일 확장자는 Accept header를 사용하여 표현한다.
GET / members/1/345/photo HTTP/1.1 Host: api.example.com Accept: image/jpg
- 리소스 간의 관계를 표현할때는아래와 같이 표현하며 구체적 표현이 필요할때 서브 리소스에 명시적으로 표현한다.
/리소스명/리소스 ID/관계가 있는 다른 리소스명
GET : /users/{userid}/music (일반적으로 소유 ‘has’의 관계를 표현할 때)
GET : /users/{userid}/favorit/music (관계명이 애매하거나 구체적 표현이 필요할 때)
- 자원을 표현하는 Collection과 Document
Document는 단순히 문서 또는 하나의 객체로 이해하면 되겠다. 이 Document의 집합이 Collection이다.
sports, palyers와 같이 하위 리소스를 포함하는 리소스를 Collection이라 하며, Collection은 복수를 사용한다.
soccor과 players/13을 하나의 객체, Document로 이해하면 되겠다.
http:// api.example.com/sports/soccer
http:// api.example.com/sports/soccer/players/13
📌 HTTP 응답 상태 코드
RESTful API를 구현할때, 적절한 HTTP 상태 코드를 사용하는 것이 아주 중요하다.
- 2xx : 클라이언트 요청이 성공적으로 수행됨.
- 3xx : 클라이언트는 요청을 완료하기 위해 추가적인 행위를 해야한다.
- 4xx : 클라이언트의 잘못된 요청.
- 5xx : 서버 오류
200OK : 클라이언트의 요청을 정상적으로 수행함.
201Created : 클라이언트가 리소스 생성을 요청 했을때, 리소스가 성공적으로 생성
301Moved Permanently : 클라이언트가 요청한 리소스에 대한 URI가 변경 되었을때 사용하는 응답코드.
Location header에 변경된 URI를 표기해 리다이렉션 해주어야 한다.
400Bad Request : 클라이언트의 요청이 부적절 할 경우.
401Unauthorized : 클라이언트가 인증되지 않은 상태에서 보호된 리소스를 요청했을때.
403Forbidden : 유저 인증상태와 관계 없이 응답하고 싶지 않은 리소스를 클라이언트가 요청했을때.
404Not Found : 클라이언트가 요청한 리소스가 존재 하지 않을때.
405Method Not Allowed : 클라이언트가 요청한 리소스에서는 사용 불가능한 Method를 이용했을 경우.
500Internal Server Error : 서버에 문제가 있을때.
Reference
https://blog.restcase.com/5-basic-rest-api-design-guidelines/
https://developer.mozilla.org/en-US/docs/Web/HTTP/Methods
https://ko.wikipedia.org/wiki/REST