그런 REST API로 괜찮은가.

1 분 소요

REpresentaion State Transfer

1991년에 WWW이 출시된 이후 인터넷 정보를 어떻게 공유할 것인가에 대한 연구가 활발히 진행됐는데, 그 예로 가장 먼저 HTTP라는 프로토콜이 만들어졌다.

Roy T.FieldingREST의 창시자이며 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

JSONHTML에 비해 불안전하다. HTML은 명세에 대해 해석 가능하며, self-descriptive하며, HATEOAS하다.

그러면 우리는 JSON을 통해 정보를 주고받는 API 환경에서 어떻게 해야 REST에 대해 만족시킬 수 있을까?

Self-descriptive

Media type을 정의한다.

  1. 미디어 타입을 정의 후 문서로 정리한다.
  2. IANA에 미디어 타입을 등록할 수 있다. 만든 문서를 미디어 타입의 명세로 등록한다.
  3. 이제 이 메세지를 보는 사람은 명세를 찾아갈 수 있으므로 이 메세지의 의미를 온전히 해석 가능하다.

Profile

  1. id, title에 대한 정의를 문서로 작성한다.
  2. Link 헤더에 profile relation으로 해당 명세를 링크한다.
  3. 이제 메세지를 보는 사람은 명세를 찾아갈 수 있으므로 이 문서의 의미를 온전히 해석할 수 있다.

클라이언트가 Link 헤더에 대한 명세를 이해해야하며, Content negotiation을 할 수 없다.

HATEOAS

data에 하이퍼링크를 추가한다.

이는 링크를 표현하는 방법을 직접 정의해야하는 단점이있다.

  • JSON API
  • HAL
  • UBER

등 이미 JSON에서 하이퍼 링크를 표현하는 방법을 정의한 명세를 활용할 수 있지만, 기존에 내가 구현했던 API를 고쳐야하는 단점이 있다.

HTTP 헤더로 표현

Link, Location 등의 헤더로 표현한다.

Refernce
  • https://tv.naver.com/v/2292653