참조 : https://www.youtube.com/watch?v=RP_f5dMoHFc&ab_channel=NAVERD2
REST 많이 봐왔지만 REST가 뭔지 설명이 안되고 이해가 안된다. 전문가들이 "REST 스럽지 않은 것 같아요 .. REST API 가 아닌거같은데 ..?" 라고 말하는 가운데 REST는 어떤 의미일까?
- REpresentational State Tranfer
- A way of providing interoperability between computer system on the Internet.
"컴퓨터 시스템 간 상호운용성을 제공하는 방법"
어떻게 인터넷에서 정보를 공유할 것인가에 대한 해답으로 웹이 나왔는데 모든 정보들을 하이퍼텍스트로 연결하여 제공을 하면 될 것이라고 생각하였다.
HTML이라는 표현형식으로 정보들을 표현하고
URI이라는 정보들에 대한 식별자로 URI 만들었고
HTTP이라는 전송방법으로 HTTP라는 프로토콜까지 만들었다.
1994년, 여러사람들이 HTTP라는 프로토콜을 설계하는 가운데 HTTP프로토콜 1.0 작업에 참여중인 Roy T.Fielding는 의문을 가진다.
"How do I improve HTTP without breaking the Web?"
"내가 HTTP를 개선하면 웹이 깨질거같은데? 웹을 안깨먹고 HTTP를 개선하는 방법이 있을까?"
HTTP 1.0명세가 나오기 전에 이미 HTTP는 WWW의 전송 프로토콜로서 이용되고있었다. 웹은 급속도로 성장중이였고 이미 전세계에 수많은 웹서버가 존재했다.
Roy T.Fielding은 HTTP를 정립하면서 명세의 기능을 더하고 기존의 기능을 개선해야하는 상황에 놓였다. HTTP를 정립없이 HTTP 프로토콜을 개선하게되면 기존에 구축되어있던 웹과 호환성문제가 생길것이다.
어떻게하면 웹을 망가뜨리지않고 HTTP를 고칠 수 있을까? Roy T.Fielding은 그에 대한 해답으로 'HTTP Object Model'이라는 표준을 만들게 된다.
이것은 1998년, Roy T.Fielding에 의해 'Representational State Transfer'라는 이름으로 발표된다.
이를 2000년, Roy T.Fielding이 다시 박사논문으로 발표하게되는데
이 논문이 우리가 오늘날 알고있는 'REST'라고 하는것을 정의하는 논문이다.
- Application Programming Interface
- 정의 및 프로토콜 집합을 사용하여 두 소프트웨어 구성 요소가 서로 통신할 수 있게 하는 메커니즘
1998년에 Microsoft에서 XML-RPC라는 원격으로 단일시스템의 메소드를 호출할 수 있는 프로토콜을 만들었다. 이는 나중에 SOAP이라고 바뀌게 된다.
이 SOAP를 사용해서 2000년에 Salesforce라는 회사에서 API를 공개하게 되는데 이게 최초의 API이다. 하지만 이는 어떤ID로 오브젝트 하나 가져오는데만 해도 너무 복잡해서 인기가 없었다.
4년 후 flickr에서만든 API는 형태가 여러가지 였는데 SOAP형태와 REST형태를 만들었다. SOAP을 보다가 REST를 보니 훨씬 짧고 간결했고 사람들은 이 둘을
SOAP는 복잡하고 규칙많고 어렵다
REST 단순하고 규칙적고 쉽다
라고 비교하게된다.
이는 결국

이런 결과로 이루어졌다.
2006년 AWS가 자사 API의 사용량의 85퍼센트가 REST임을 발표했고
2010년 결국 Salesforce조차 REST API를 추가했다. 이렇게 WWW의 API가 REST로 정착이 되는듯 했다.
그러나 2008년에 CMS를 위한 표준인 'CMIS'이 나오게 된다. EMC, IBM, Microsoft 등이 함께 작업했고 REST 바인딩을 지원했다.
근데 Roy T.Fielding은 이를 보고 CMIS에 REST는 없다 라고 이야기했다.
2016년에 Microsoft가 REST API 가이드라인을 만들었는데
- uri는 도메인네임이
https://{serviceRoot}/{collection}/{id}형식이여야 한다.- GET PUT DELETE POST HEAD PATCH OPTIONS를 지원해야한다
- API버저닝은 Major.minor로 하고 uri에 버전 정보를 포함시킨다
등을 제시했고 사람들은 이것이 합리적인것 처럼 보였고 흔히 알고있는 REST에 부합하는거 같았다.
하지만 Roy T.Fielding은 이것 또한 REST API가 아니라고 말했고 HTTP API라고 해야한다고 하며
- REST API는 반드시 hypertext-driven이어야 한다.
- REST API를 위한 최고의 버저닝 전략은 버저닝을 안 하는 것
이라고 발표했다.
사람들이 알고있던 REST와 Roy T.Fielding이 생각하는 REST가 왜 차이가 날까?
REST API는 말그대로 REST아키텍쳐 스타일을 따르는 API이다.
REST는 분산 하이퍼미디어 시스템(예: 웹)을 위한 아키텍쳐 스타일이다.
이것은 제약조건의 집합이며 제약조건을 모두 지켜야 REST를 따른다고 할 수 있다.
uniform interface를 제외한 스타일들은 HTTP API를 사용하기만 해도 대체로 만족을 잘 하게된다. 하지만 uniform interface만은 잘 지켜지지 않는다.
uniform interface의 제약조건을 살펴보자.
REST API라고 알려져있는 거의 모든 것들이 self-descriptive messages와 HATEOAS 두가지는 지키지 못하고있다.
하나씩 살펴보자면
GET/HTTP/1.1
이 HTTP 요청 메시지는 목적지가 빠져있어서 self-descriptive하지 못함
GET/HTTP/1.1
Host: www.example.org
목적지를 추가하면 self-descriptive 만족
HTTP/1.1 200 OK
[ { "op": "remove", "path": "/a/b/c" } ]
어떤 문법으로 작성되어있는지,
op가 뭔지 path가 뭔지 모르기 때문에 self-descriptive불만족
HTTP/1.1 200 OK
Content-Type: application/json-patch+json
[ { "op": "remove", "path": "/a/b/c" } ]
self-descriptive 만족
이 요청 메시지의 내용만으로 모든것이 이해 되어야한다.
애플리케이션의 상태가 하이퍼링크를 이용해 전이되어야한다는 의미이다.

HTTP/1.1 200 OK
Content-Type: text/html
<html>
<head></head>
<body><a href="/test">test</a></body>
</html>
a태그를 통해 하이퍼링크를 통해 그다음 상태로 전이가 가능
HTTP/1.1 200 OK
Content-Type: application/json
Link: </articles/1>; rel="previous", </articles/3>; rel="next";
{
"title": "The second article"
"contents" : "blah blah ..."
}
한 게시물을 제이슨으로 표현했다.
</articles/1>; rel="previous", </articles/3>; rel="next";
을 통해 uri 순서를 정보로 표현을 해 주었다.
이를통해 HATEOAS를 만족한다.
독립적 진화를 하기 위해서 반드시 uniform interface는 만족 되어야 한다. 서버와 클라이언트가 각각 독립적으로 진화하고 이는 서버의 기능이 변경되어도 클라이언트를 업데이트할 필요가 없게된다. 이것이 REST를 만들게 된 계기이다. uniform interface가 만족되지 않으면 REST라 할 수 없는것이다.
그렇다면 self-descriptive와 hypermedia as the engine of application state가 독립적 진화에 어떻게 도움이 될까?
REST는 웹의 독립적 진화에 지속적인 영향을 주었다.
이는 현재
로서 웹은 독립적으로 진화하고있다.
웹은 W3C Working groups, IETF Working groups, 웹브라우저, 서버 개발자들이 노력하여 HTML5 첫 초안에서 권고안 나오는데까지 6년, HTTP/1.1 명세 개정판 작업하는데 7년이 걸렸다. 왜이렇게 걸렸느냐면 상호운용성(interoperability)을 깨면 안되기 때문이다.
REST는 웹의 독립적 진화를 위해 만들어졌다
웹은 독립적으로 진화하고있기 때문에 성공적이라 할 수 있다.
REST API는 REST 아키텍쳐 스타일을 따라야한다. 하지만 오늘날 스스로 REST API라고 하는 API들의 대부분이 REST 아키텍쳐 스타일을 따르지 않는다.
그렇다면 REST API도 저 제약조건을을 다 지켜야 하는건가?
Roy T.Fielding는 명시적으로 REST API는 self-descriptive한 메시지의 uniform interface를 지켜야한다고 말했다. 하지만 시스템 전체를 통제할 수 있다고 생각하거나 진화에 관심이 없다면 REST에 대해 따지느라 시간을 낭비하지 말라고 말했다.
오늘날 대부분의 REST API는 사실 REST를 따르지 않고 있다. REST의 제약조건 중 특히 self-descriptive와 hypermedia as the engine of application state를 잘 만족하지 못한다.
REST는 긴 시간에 걸쳐 진화하는 웹 애플리케이션을 위한 것이다. REST를 따를 것인지 API를 설계하는 이들이 스스로 판단하여 결정해야한다.
REST를 따르겠다면 self-descriptive와 hypermedia as the engine of application state를 만족시켜야한다