DEVIEW 영상 그런 REST API로 괜찮은가 및 REST 정리
REST(Representational State Transfer) 란?
- 분산 하이퍼미디어 시스템(ex. web)을 위한 아키텍쳐 스타일이다.
- 아키텍쳐 스타일 = 제약조건의 집합
REST의 제약조건
-
Client - Server
클라이언트/서버 아키텍쳐를 따라야 한다.
-
Stateless
서버는 클라이언트의 상태를 저장하지 않는다.
-
Cache
요청에 대한 응답은 Cacheable 해야 한다.
-
Uniform interface
통일된 Interface를 따라야 한다. Interface 의 제약조건은 다음과 같다.
- Identification of resource
요청에서 얻고자 하는 자원(resource)이 식별되어야 한다. (URI 사용)
- Resource manipulation through representations
자원의 representaion을 알고 있다면 그 자원의 상태를 변경시킬 수 있다.
- Self-descriptive messages
요청/응답의 메시지는 그 메시지를 해석하기 위한 모든 정보를 담고있어야 한다.
- Hypermedia as the engine of application state (HATEOAS)
하이퍼링크를 통해 어플리케이션의 상태 전환이 이루어저야 한다.
- Layered system
클라이언트는 Intermediaries(프록시, 로드밸런서 등) 너머의 정보를 알 필요가 없어야 한다.
- (Code-on-demand)
REST API
- REST API는 REST 아키텍쳐 스타일을 따라야 한다.
- 오늘날 스스로 REST API라고 하는 API들의 대부분이 REST 아키텍쳐 스타일을 따르지 않는다.
왜 REST API 구현이 어려운가
HTTP 프로토콜을 사용한다면 REST의 제약조건은 대부분 쉽게 만족시킬수 있다. 하지만 Uniform Interface 제약조건은 만족시키기 힘들다. Self-descriptive messages 와 HATEOAS 제약조건 때문이다.
위 비교와 같이, 웹에서는 Media Type으로 HTML을 주로 사용하지만 보통의 API는 JSON을 사용한다.
JSON은 HTML과 달리 hyperlink를 정의하지않고, JSON을 이해하기 위한 명세도 정해져있지 않다. 위 두 차이점이 Uniform interface를 구현하기 힘들게 하는것이다.
- 인터페이스와 구현을 분리함으로서 서버와 클라이언트는 각각 독립적인 진화를 할 수 있다.
- = 서버의 기능이 변해도 클라이언트를 업데이트 할 필요가 없다.
- = 상호운용성(interoperability)을 유지할 수 있다.
REST를 만족하는 API
- Self-descriptive는 custom media type이나 profile link relation 등으로 만족시킬 수 있다.
- HATEOAS는 HTTP 헤더나 본문에 링크를 담아 만족시킬 수 있다.
꼭 REST를 만족시켜야 하는가?
- REST를 만족시키기 위해 비용이 들기 때문에 필요하지 않으면 굳이 만족시킬 필요가 없다.
- 시스템 전체(client 와 server 모두를)를 통제할 수 있거나 진화(evolvability)에 관심이 없다면 모든 REST 조건을 만족시킬 필요는 없다.
정리
- 오늘날 대부분의 "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라고 부를 수도 있다.
참고
https://www.youtube.com/watch?v=RP_f5dMoHFc
https://roy.gbiv.com/pubs/dissertation/rest_arch_style.htm#sec_5_1
https://en.wikipedia.org/wiki/Representational_state_transfer#Uniform_interface
https://slides.com/eungjun/rest#/87/0/5