REST API를 만들고 싶은데 내가 명세한 API가 팀원이 작성한 API를 리뷰할 때 이게 Rest한게 맞나?
맞다면 왜? 아니라면 왜 아닌지 구분하는 것은 어렵다.
REST API와 비교되는 다른 SOAP API가 존재하는데
REST는 SOAP과 비교하면 1. 단순하다. 2. 규칙이 적다. 3. 쉽다는 장점이 있다.
Rest API는 HTTP 요청을 사용하여 웹 서비스에 접근할 수 있도록 하는 인터페이스이다.
사실 REST API는 로이 필딩이라는 분이 발표한 논문의 내용이다.
해당 논문에서는 아래와 같은 원칙을 제시한다.
일관된 인터페이스
URI로 지정한 자원 (resource)에 대한 조작을 통일되고 한정적인 인터페이스로 수행하는
구조적 스타일을 말한다.
클라이언트 - 서버
클라이언트와 서버를 독립적으로 분리되어 구성되어야 한다.
각각 별도로 개발되고 대체 가능하도록 유지해야한다.
무상태
작업에 대한 요청의 상태 정보를 저장하거나 관리 하지 않음
세션, 인증, 쿠키 등의 정보는 별도로 저장하기 때문에 요청에 대한 어떠한 상태 정보를
저장하지 않고 단순 처리할 수 있어야한다.이를 위해 모든 요청에는 필요한 모든 정보가 포함되어야 한다.
캐시의 가능
서버는 캐시 가능 여부를 제공해야 함.
캐시가 가능 할 경우 클라이언트 응답 데이터를 재 사용 하여 성능과 서버의 가용성을 올릴 수 있다.
계층화된 시스템
계층화된 구조로 구성되어야 한다. 각 계층 자신이 통신하는 컴포넌트 외 다른 계층에 대한 정보를
얻을 수 없도록 분리되어야 한다.
주문형 코드(선택 사항)
클라이언트는 서버로부터 실행시킬 수 있는 로직을 다운 받아 기능을 확장시킬 수 있다.
이를 통해 클라이언트가 사전에 구현해야 하는 기능을 수를 줄여 간소화 시킬 수 있다.
내가 생각하는
Rest API는 명세서왕 Response를 보고 클라이언트가 모든 것을 이해할 수 있어야한다.
고 생각한다.
예를 들어 수정 작업이 일어날건지 , 이 데이터는 무엇을 요구하는지
어떠한 미디어 타입을 원하는지 등등
아래의 규칙들은 Rest API를 작성하기 위해서 많이들 사용하고 있는 방법들이다.
하지만 이것을 지킨다고 완전한 Rest API가 되는 것은 아니다.
/
를 사용많은 사람이 Rest API를 주장하지만, 원작자는 만족스러워하지 않는다고 한다.
여기부터 내용은 아래의 링크의 영상을 참고하여 정리한 내용이다.
🔗https://www.youtube.com/watch?v=RP_f5dMoHFc&t=1163s
마이크로소프트에서 Rest API의 가이드라인을 제시했다.
https://{serviceRoot}/{collection}/{id}
형식이어야 한다.GET
, PUT
, DELET
, POST
, HEAD
, PATCH
, OPTIONS
를 지원해야 한다.하지만 Rest API 로이필딩은 이것을 보고 REST API가 아니라고 했다고 한다.
REST : 분산 하이퍼미디어 시스템을 위한 아키텍쳐 스타일(제약조건의 집합)
여기서 말하는 아키텍쳐 스타일은 위에서 정리한 6가지인데 여기서 일관된 인터페이스
이 부분은 4가지고 세분되어있다.
보통 개발자들이 4가지 중 2가지를 지키지 못한다고 한다.
못 지키고 있는 2가지
응답으로 제공된 JSON
이렇게 된 경우 클라이언트가 응답을 받고 해석해야 하는데, 어떤 문법으로 작성되었는지 모른다..
일단 Content-Type이 명시되어 있지 않기 때문에 클라이언트는 해석할 수 없다.
그렇다면 컨텐츠 타입만 명시하면 되는 걸까? 그것도 아니다!
application/json 타입인데 json-patch라는 명세가 있는데 거기 명세표를 본다면 너는
이해할 수 있어.. 라고 의미하기 때문에 메시지만을 보고 스스로를 증명할 수 있는 조건을 만족한다.
애플리케이션의 상태는 Hyperlink를 이용해 전이되어야 한다. (HATEOAS)
클라이언트의 애플리케이션 상태가 바뀌는 것은 Hyperlink를 통해서 바뀌어야 한다는 말이다.
예를 들어서 게시판을 제공하는 사이트가 있을때 사용자의 흐름은
이렇게 페이지가 전환될 때 응답으로 보일 페이지의 hyperlink를 제공하고 이를 통해서 화면이 이동되어야 한다.
HTML의 경우
HTTP/1.1 200 OK
Contemt-Type: text/html
<html>
<head></head>
<body><a href="/test">test</a></body>
</html>
<a>
태그를 통해 링크 제공
JSON의 경우
HTTP/1.1 200 OK
Contemt-Type: application/json
Link</article/1>; rel="previous"
Link</article/3>; rel="next";
{
"title": "The Second article",
"contents": "abcde"
}
header를 통해서 이전글과, 다음금 uri를 표현 해주어 HATEOAS를 만족한다.
이렇게 지키는 것이 REST API라고 한다고 한다. 단순하고 쉽다고 표현했는데 사실 완전한 REST 조건을 지키기 위해서는 힘들고 복잡한 과정을 가져야 한다.
느낀 점
영상을 보고 Rest API를 만들기 위해서는 생각보다 JSON 타입으로 이를 만족하기 위해서는 좀 더 번거로운 작업이 필요하다고 생각했다. 하지만 영상에서 지적해준 self-descript message, HATEOAS를 지킨다면 클라이언트 입장에서 수월하고 독립적인 관계가 될 수 있다는 것에 공감된다.
최대한 Rest API 기본부터 지키면서 영상에서 언급한 부분까지 지킬 수 있도록 노력해야겠다.