[정리] 그런 REST API로 괜찮은가

shkilo·2021년 3월 6일
0

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를 구현하기 힘들게 하는것이다.

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

0개의 댓글