진정한 REST
REST ( Representational State Transfer )
- 논문 저자 : Roy T. Fielding
- 현재 상태 : REST API가 아니지만 REST API라고 부른다.
<정의 >
- a way of providing interoperability between computer systems on the internet.
- Architecture Styles and the Design of Network-based Software Architecture
- REST APIs must be hypertext-driven “REST API를 위한 최고의 버저닝 전략은 버저닝을 안 하는 것”
<REST를 구성하는 스타일 >
- client-server
- stateless
- cache
- uniform interface
- layered system
- code-on-demand (optional)
<Uniform Interface 의 제약 조건 >
- 목표 : 서버와 클라이언트의 독립적인 진화 ( 서버의 API 스펙이 변경되더라도 클라이언트이 업데이트가 필요하지 않도록 )
- 3, 4번이 잘 지켜지지 않는다. (Github API 가 가장 잘 지킨다. )
- identification of resources
- manipulation of resources through representation
- self-descriptive messages
- 확장 가능한 커뮤니케이션
- 서버나 클라이언트가 변경되더라도 오고가는 메세지는 언제나 self-descriptive 하므로 언제나 해석 가능
- hypermedia as the engine of application state (HATEOAS)
- 애플리케이션의 상태는 Hyperlink 를 이용해 전이되어야 한다
- 애플리케이션 상태 전이의 late binding
- 어디서 어디로 전이가 가능한지 미리 결정되지 않는다. 어떤 상태로 전이가 완료되고 나서야 그 다음 전이될 수 있는 상태가 결정된다. 쉽게 말해서 [링크는 동적으로 변경될 수 있다]
<REST API >
-
Media Type
(1) 미디어 타입을 하나 정의한다.
(2) 미디어 타입 문서를 작성한다. 이 문서에 “id”가 뭐고 “title”이 뭔지 의미를 정의한다.
(3) IANA에 미디어 타입을 등록한다. 이 때 만든 문서를 미디어 타입의 명세로 등록한다.
(4) 이제 이 메세지를 보는 사람은 명세를 찾아갈 수 있으므로 이 메세지의 의미를 온전히 해석할 수 있다. -
Profile
(1) “id”가 뭐고 “title”이 뭔지 의미를 정의한 명세를 작성한다.
(2) Link 헤더에 profile relation 으로 해당 명세를 링크한다.
(3) 이제 이 메세지를 보는 사람은 명세를 찾아갈 수 있으므로 이 문서의 의미를 온전히 해석할 수 있다.
단점 : 클라이언트가 Link 헤더(RFC 5988)와 profile(RFC 6906)을 이해해야 한다.
Content negotiation을 할 수 없다. -
data
(1) data에 다양한 방법으로 하이퍼링크를 표현한다.
(2) JSON으로 하이퍼링크를 표현하는 방법을 정의한 명세들을 활용한다.
- JSON API - HAL - UBER - Siren - Collection+json -
HTTP 헤더
(1) Link, Location 등의 헤더로 링크를 표현한다.
<정리 >
- 오늘날 대부분의 “REST API”는 사실 REST를 따르지 않고 있다.
- REST의 제약조건 중에서 특히 Self-descriptive와 HATEOAS를 잘 만족하지 못한다.
- REST는 긴 시간에 걸쳐(수십년) 진화하는 웹 애플리케이션을 위한 것이다.
- REST를 따를 것인지는 API를 설계하는 이들이 스스로 판단하여 결정해야한다.
- REST를 따르겠다면, Self-descriptive와 HATEOAS를 만족시켜야한다.
- Self-descriptive는 custom media type 이나 profile link relation 등으로 만족시킬 수 있다.
- HATEOAS는 HTTP 헤더나 본문에 링크를 달아 만족시킬 수 있다.
- REST를 따르지 않겠다면, “REST를 만족하지 않는 REST API”를 뭐라고 부를지
결정해야 할 것이다.
- HTTP API라고 부를 수도 있고..
- 그냥 REST API라고 부를 수도 있다.. (roy fielding 이 싫어함)
<관련 유튜브 영상! >
- 개발자라면 꼭 한번 봐야할 영상!! [DEVIEW]
Comments