그런 REST API로 괜찮은가.
REpresentaion State Transfer
1991년에 WWW
이 출시된 이후 인터넷 정보를 어떻게 공유할 것인가에 대한 연구가 활발히 진행됐는데, 그 예로 가장 먼저 HTTP
라는 프로토콜이 만들어졌다.
Roy T.Fielding
은 REST
의 창시자이며 HTTP
프로토콜 개발에 참여했던 연구진으로 HTTP
개발이후 HTTP object model
이란 이름의 REST
아키텍쳐를 발표했다.
Roy T.Fielding: “How do i improve HTTP without breaking the Web?”
REST API
REST
아키텍쳐 스타일(제약조건의 집합)을 따르는 API
이다.
REST
는 아키텍쳐 스타일의 집합이기 때문에 hyper archittecture styles
라고도 불린다.
- client-server
- stateless
- cache
- uniform interface
- layered system
- code-on-demand(Optional)
대부분 HTTP
기반에서 사용할 경우 쉽게 지켜질 수 있는 부분이나, uniform interface
에서 REST
조건을 지키기 매우 까다롭다.
uniform interface
는 클라이언트 혹은 서버가 변경된다 해서 상대방까지 업데이트를 해야하는 상황을 막기위해 반드시 충족되어야 하는 조건이다.
이를 독립적 진화
라 하며 아래는 오늘 날 REST API
라 불리우는 것들에게서 충족시키기 어려운 조건들이다.
- self-descriptive messages
- hypermedia as the engine of application state(HATEOAS)
이를 잘 지키는 플랫폼은 현재 Web
이 있다.
REST가 웹의 독립적 진화에 도움을 주었나?
- HTTP에 지속적으로 영향을 줌
- HOST 헤더 추가
- 길이 제한을 다루는 방법을 명시
414 UIL Too Long
HTTP/1.1
명세 최신판에서REST
에 대한 언급이 들어감
REST API는 반드시 따라야 하나?
Roy T.Fielding: “REST emphasizes evolvability to sustain an unconrollable system. If you think you have control over the system or aren’t interested in evolvability, don’t waste your time arguing about REST”
API를 REST API로 구현해보자.
웹과 HTTP API에 차이점
웹 페이지 | HTTP API | |
---|---|---|
Protocol | HTTP | HTTP |
communication | Human - Machine | Machine - Machine |
Media Type | HTML | JSON |
JSON
은 HTML
에 비해 불안전하다. HTML
은 명세에 대해 해석 가능하며, self-descriptive
하며, HATEOAS
하다.
그러면 우리는 JSON
을 통해 정보를 주고받는 API
환경에서 어떻게 해야 REST
에 대해 만족시킬 수 있을까?
Self-descriptive
Media type을 정의한다.
- 미디어 타입을 정의 후 문서로 정리한다.
IANA
에 미디어 타입을 등록할 수 있다. 만든 문서를 미디어 타입의 명세로 등록한다.- 이제 이 메세지를 보는 사람은 명세를 찾아갈 수 있으므로 이 메세지의 의미를 온전히 해석 가능하다.
Profile
id
,title
에 대한 정의를 문서로 작성한다.Link
헤더에profile relation
으로 해당 명세를 링크한다.- 이제 메세지를 보는 사람은 명세를 찾아갈 수 있으므로 이 문서의 의미를 온전히 해석할 수 있다.
클라이언트가 Link
헤더에 대한 명세를 이해해야하며, Content negotiation
을 할 수 없다.
HATEOAS
data에 하이퍼링크를 추가한다.
이는 링크를 표현하는 방법을 직접 정의해야하는 단점이있다.
- JSON API
- HAL
- UBER
등 이미 JSON
에서 하이퍼 링크를 표현하는 방법을 정의한 명세를 활용할 수 있지만, 기존에 내가 구현했던 API
를 고쳐야하는 단점이 있다.
HTTP 헤더로 표현
Link
, Location
등의 헤더로 표현한다.
Refernce
- https://tv.naver.com/v/2292653