REST는 2000년에 Roy Fielding의 논문으로부터 처음 세상에 나오게 되었다.
REST는 REpresentational State Transfer의 약자이다.
이는 분산 하이퍼미디어(ex: Web) 시스템을 위한(웹 서비스에서의 통신을 위한) 아키텍처 스타일이다.
이러한 REST의 6가지 원칙을 따르는 API를 RESTful API라고 하며, 6가지 원칙은 다음과 같다.
Client-Server: REST 서버와 클라이언트의 역할은 명확히 구분되어 있기때문에, 각각 개발해야 할 내용이 명확하지고 서로간의 의존성이 줄어든다.
Stateless: REST는 작업을 위한 상태정보를 따로 저장, 관리하지 않는다. 그렇기에 API 서버는 요청에 대한 처리만 하면 되며, 이에 따라 서비스의 자유도는 높아지고 구현이 단순해진다.
Cacheable: REST는 HTTP Porotocol을 그대로 사용하기 때문에 웹에서 사용하는 인프라를 그대로 사용할 수 있다. 그렇기에 캐싱 기능을 적용할 수 있으며, 적용을 위해 Last-Modifined 태그나 E-Tag를 이용하면 된다.
Uniform Interface: URI로 지정한 리소스에 대한 조작을 통일되고 한정적인 인터페이스로 수행한다.
Layered System: REST 서버는 다중 계층으로 구성될 수 있고 보안, 로드 밸런싱, 암호화 계층을 추가할 수 있으며, Proxy, Gateway 같은 네트워크 기반 중간매체를 사용할 수도 있다.
Code on demand(Optional): REST를 사용하면 applet이나 스크립트 형태의 코드를 다운로드하고 실행해 클라이언트 기능을 확장할 수 있다. 이는 사전 구현 기능 수를 감소시켜주어 클라이언트를 단순화한다.
위 원칙을 준수한다면 RESTful API라고 할 수 있겠다.
그런데, 이 6가지 원칙에 대한 이해를 했다해도 막상 REST API를 디자인 하려하면 막막해진다.
아래는 이에 대한 디자인 가이드라인이다.
중심 규칙
1. Resources
- 리소스 설명 시 가능한 한 동사가 아닌 명사를 사용한다.
- Get /users
- Get /users/1
- Patch /workspaces/2
- Post /workspaces/2/messages
- URI case는 CamelCase, snake_case, spinal-case 중 가능한 한 spinal-case를 사용한다.
URI 설계 시 주의점
1. /
는 계층 관계를 나타내는 데 사용
https://localhost:3000/cats/russianblue https://localhost:3000/dogs/husky
URI 마지막에 /
포함 불가
https://localhost:3000/cats/russianblue/
가독성을 높이기 위해 -
사용(URI가 긴 경우)
_
은 사용 불가
URI은 소문자로 작성
URI에 파일 확장자를 포함하지 않음
GET /cats/russianblue/3/picture HTTP/1.1 Host: restapi.test.com Accept: image/jpg
리소스 간 관계 표현
Case 1) 리소스 간 관계가 복잡하지 않을 경우(보통 has 관계를 표현할 때)
GET : /users/:id/pets
Case 2) 리소스 간 관계가 복잡한 경우(관계명 모호, 구체적 표현)
GET : /users/:id/supports/pets
Collection과 Document
- Collection은 문서 또는 객체들의 집합
- Document는 하나의 문서 또는 객체
- 이 둘은 모두 리소스에 해당되며 URI에 표현됨
https://localhost:3000/restapi.test.com/workspaces/1/users/3
- 위 예에서 Collection은 workspaces, users이고, Document는 1번 워크스페이스와 3번 유저이다.
- 위처럼 Collection과 Document 사용 시 단수, 복수를 쓴다면 보다 더 가독성이 좋은 URI를 설계할 수 있다.
https://restfulapi.net/
https://meetup.toast.com/posts/92
https://gunju-ko.github.io/spring/2020/09/15/Rest-API-%EB%94%94%EC%9E%90%EC%9D%B8-%EA%B0%80%EC%9D%B4%EB%93%9C.html