도대체 Restful 이뭔지 찾아보려고 검색 하던중에 REST API에 대한 좋은 영상을 접하게 되었다 그래서 일단 REST API에 대해서 공부해보자고 생각해서 이 글은 작성되었다.
아래 글은 해당 영상을 보고 작성했습니다.
https://www.youtube.com/watch?v=RP_f5dMoHFc
REST API
REST의 약자는 (REpresentational State Transfer)
Q : 어떻게 인터넷에서 정보를 공유할 것인가?
A : 정보들을 하이퍼텍스트로 연결 한다
그럼 HTTP를 고치면 웹이 깨질꺼같은 고민에서 나온 것이
HTTP Object Model 후에 REST 발표를 하게된다.
REST API
REST
아키텍쳐 스타일
제약 조건들을 모두 따라야만 REST를 지킨다라고 할수있다
그러면 REST를 구성하는 스타일에는
현재는 HTTP만 잘 따라도 대체로 (client-server , stateless , cache , layered system) 따를수 있다.
code-on-demand (optional) 의 경우에는 서버에서 코드를 클라이언트로 보내서 실행할수 있어야한다 가 code-on-demand다.
그런데 이중에 단 하나 uniform interface 는 잘 만족을 못한다고 한다.
uniform interface 의 제약 조건은 총 4가지다.
거의 예외없이 아래의 2가지 조건은 지키지 못하고 있다.
self-descriptive messages
메시지는 스스로를 설명해야 한다.
GET / HTTP/1.1
GET / HTTP/1.1
HOST: www.example.org
HTTP/1.1 200 OK
[ { "op" : "remove", "path": "/a/b/c" }]
HTTP/1.1 200 OK
Content-Type: application/json
[ { "op" : "remove", "path": "/a/b/c" }]
HTTP/1.1 200 OK
Content-Type: application/json-patch+json
[ { "op" : "remove", "path": "/a/b/c" }]
messages 의 내용으로 온전히 해석이 가능해야 한다.
hypermedia as the engine of application state (HATEOAS)
애플리케이션의 상태는 Hyperlink를 통해서 전이가 되어야 한다.
HTTP/1.1 200 OK
Content-Type: text/html
<html>
<head></head>
<body><a href="/test">test</a></body>
</html>
HTML 같은 경우를 보면 HATEOAS를 만족하게 되는데 a
태그를 통해서 Hyperlink 가 나와있고 Hyperlink를 통해서 그 다음상태로 전이 되기 떄문에 만족하게 된다.
독립적인 진화
실제로 REST를 잘 지키고 있는 사례는 웹이다
위에 내용들을 듣고 생각 해보니까 무슨소리인지 이해가 됬다. 왜냐하면 내가 특정 페이지에 뭐가 바뀌던 브라우저는 업데이트를 하지 않았으니까.
상호운용성에 대한 집착
결론 : 진짜 대단하신 분들이 많은거 같다.
REST API가 REST의 제약조건들을 다 지켜야 하나?
하이퍼텍스트를 포함한 self-descriptive한 메시지의 uniform interface를 통해 리소스에 접근하는 API 라고 한다.
지키라는 거임.
흔한 웹 페이지 | HHTP API | |
---|---|---|
Protocol | HTTP | HTTP |
커뮤니케이션 | 사람 - 기계 | 기계 - 기계 |
Media Type | HTML | JSON (기계가 이해할수 있는) |
그럼 JSON 떄문에???
HTML , JSON 비교
HTML | JSON | |
---|---|---|
Hyperlink | 됨 (a 태그 등) | 정의되어있지 않음 |
Self-descriptive | 됨 (HTML 명세) | 불완전* |
불완전하다는 것
문법 해석은 가능하지만, 의미를 해석하려면 별도로 문서가(API 문서 등) 필요하다.
HTML
GET /todos HTTP/1.1
HOST: example.org
HTTP/1.1 200 OK
Content-Type: text/html
<html>
<body>
<a href="https://todos/1" 회사 가기 </a>
<a href="https://todos/2" 집에 가기 </a>
</body>
</html>
Self-descriptive
HATEOAS
JSON
GET /todos HTTP/1.1
HOST: example.org
HTTP/1.1 200 OK
Content-Type: application/json
[
{"id": 1, "title" : "회사 가기"},
{"id": 2, "title" : "집에 가기"}
]
Self-descriptive
HATEOAS
Self-descriptive
확장 가능한 커뮤니케이션을 가능하게 한다.
HATEOAS
애플리케이션 상태 전이의 late binding
진짜 너무나도 좋은 영상이였다. 발표를 들으면서 순서대로 너무나도 이해가 잘되었던거 같다. 한번만 들어도 이해가 잘됬지만 언제 한번 다시 접하고 싶었던 영상이였던거 같다.
일단 오늘은 REST API에 대한 내용을 알았으니 spring 프로젝트로 간단하게라도 만들어 봐야겠다