REST - Representational State Transfer 는 정확히는 아키텍처 원리를 의미하는데,
아키텍처 원리는 '자원을 정의하고 자원에 대한 주소를 지정하는 것'을 말한다.
(REST 외에 SOAP, Graphql, GRPC 등이 있다)
프로젝트를 진행할 때 다양한 step이 존재하고, 어느 정도 API 구현이 완료되면 프론트와 논의하여 uri를 포함, headers, 상태코드 등을 작성하게 된다. 아래는 예시.
그런데 이런 정보들을 작성하는 것이 워낙 중구난방이었는지,
로이 필딩이란 사람이 처음 REST라는 아키텍처 원리를 논물을 통해 발표했다.
핵심은 "리소스와 리소스에 대한 행위(http method)를 구조적으로, 직관적으로 작성하라"는 것.
그래서 REST API는 아키텍처 원리이기도 하면서, 하나의 네트워킹 문화라고도 볼 수 있겠다. 이렇다보니 실제로는 개발자나 조직 입맛에 따라 바꿔서 사용하는 등 안티 패턴(실제 많이 사용되는 패턴이나 비효율적인 패턴)도 많다고 한다.
"RESTful" 하다는 것은 REST 아키텍처에 적용되는 원칙들을 잘 준수했다는 의미다.
아래의 세부 규칙을 따르면 RESTful 한 API를 설계할 수 있다.
1. URL rules
/
를 포함하지 않음_
가 아니라 -
(hash)를 사용 GET /users/{id: 1}/profile
Content-location: /users/1
, users/1에 새롭게 생성되었음)applictaion/json
으로 사용한다HTTP/1.1 404 Not Found
{
"code" : -765,
"more_info" : "https://api.test.com/errors/-765"
}
order
를 사용 (GET /users?order=name
)AND
, OR
, =
, !=
, >
, <
, IN
, NOT IN
, LIKE
type = ssd or (cpu=1 or memory>=2) and staus != 04
GET /users?fields=level
-
를 붙이면 그 필드만 제외해서 호출 가능?-fields=level
, level 필드 제외하고 모두 반환)❓ path parameter vs query parameter
1) products/3
2) products/?id=3
1번은 path parameter방식이고 2번은 query parameter 방식이다.
둘 다 제품 3번을 조회하는 것이라고 했을 때, 좀 더 RESTful한 것은 1번이다.
(필터링 등의 과정 없이 바로 3번만 조회하면 되기 때문)
query parameter는 filtering/sorting/searching에 더 적합하다.
몇 가지 예시 및 비교를 통해 최종 정리 !
1) http://10.58.4.1:8000/detail_page > http://10.58.4.1:8000/product
2) http://10.58.4.1:8000/main_page > http://10.58.4.1:8000/products
3) http://10.58.4.1:8000/find/product > http://10.58.4.1:8000/product/
4) http://10.58.4.1:8000/add/product > http://10.58.4.1:8000/product
5) http://10.58.4.1:8000/product_reviews > http://10.58.4.1:8000/products/1/reviews
6) http://10.58.4.1:8000/product_filter > http://10.58.4.1:8000/products?name=
참고 자료:
https://library.gabia.com/contents/8339/
https://ko.wikipedia.org/wiki/REST
https://medium.com/@fullsour/when-should-you-use-path-variable-and-query-parameter-a346790e8a6d