이 서비스는 RESTful하네요..
위의 REST Architecture를 구현한 서비스는 RESTful하다고 말한다.
Architecture Style은 "제약조건의 집합"이다.
시스템이 정확하게 RESTful하려면 다음 6가지 조건을 만족해야 한다.
"Architecture"
REST는 아키텍처 스타일이다. 따라서 무조건적으로 해당 조건들을 만족해야되는 것은 아니다.
http만 잘 따라도 조건 충족이 쉽다. 하지만 첫 번째 조건인 uniform interface를 따르기가 좀 어렵다. 이러한 이유로 현재 REST API로 "불리우는 것"들 중에 정확하게 RESTful한 REST API는 없다.
uniform interface의 조건은 4가지가 있다. 위의 두 가지는 대부분 API가 쉽게 충족하지만, 아래 두 가지 조건을 대부분 API가 충족하지 못하고 있다.
self-descriptive messages
메세지 자기 자신을 설명할 수 있어야 한다.hypermedia as the engine of application state (HATEOAS)
애플리케이션의 상태 전이를 만족해야 한다.위의 두 가지 조건 달성이 의미하는 것
Self-descriptive -> 메세지만 가지고 해석 가능 -> 확장 가능한 커뮤니케이션
HATEOAS -> 애플리케이션 상태 전이 late binding
"독립적 진화 : 하위버전과 상호운용성"을 실현. 현존 가장 RESTful한 시스템은 Web이다.
- 웹페이지를 변경했다고 웹 브라우저를 업데이트할 필요 없다.
- 반대로 웹브라우저를 업데이트했다고 웹 페이지를 변경할 필요 또한 없다.
- HTTP 명세가 변경되어도 웹은 잘 동작한다.
- HTML 명세가 변경되어도 웹은 잘 동작한다.
위의 것들을 이뤄내기 위해 "하위버전과 상호운용성"을 끝까지 지켜내려고 노력하는 것이다.
무조건 완벽하게 REST API를 작성해야 해?
REST API는 REST 아키텍처 스타일을 따라야한다.
하지만 오늘날 스스로 REST API라 하는 API들이 대부분 아키텍처 스타일을 따르지않고있다.
제대로 REST API를 구현하지 못할거같으면 HTTP API라고 부르라고 한다.
왜 App에 구현된 REST API라고 불리는 API들은 위 두 가지 조건을 못 지킬까?
- | REST API(Web) | HTTP API |
---|---|---|
protocol | HTTP | HTTP |
communication | 사람-기계 | 기계-기계 |
media type | HTML | JSON |
communication 상호 대상이 다르며, 이에 따라 media 타입이 다르기 때문이다.
HTML : text/html IANA 명세 html, body 명세 | 링크로 HATEOAS 만족
JSON : application/json 명세 | 하지만 id, title이 not-self discriptive | HATEOAS 불만족
충족 방법
Self-descriptive custom media type or profile link relation로 충족
HATEOAS HTTP 헤더나 본문에 링크 담아서 충족