REST의 가장 중요한 특성: 각 요청이 어떤 동작이나 정보를 위한 것인지를 그 요청의 모습 자체로 추론이 가능함.
REST API에서는 HTTP 규약에 따라 신호를 전송한다.
GET: 특정 리소스의 표시를 요청, 오직 데이터를 받기만 한다.
POST: 특정 리소스에 생성요청을 보낸다.
PUT: 목적 리소스에 모든 현재 표시를 요청 Payload로 바꾼다.
DELETE: 특정 리소스를 삭제한다.
(추가적으로 PATCH를 사용하기도 한다)
PATCH: 리소스의 일부만을 수정한다.
POST, PUT, PATCH는 body가 존재해서 정보를 안전하고, 많이 실어서 보낼 수 있다.
하지만 이 요청들의 기능이 특정 용도로 제한되어 있지는 않지만, 누구나 요청의 의도를 파악하기 위해 위의 규칙을 지키는게 좋다.
REST API란 HTTP 요청을 보낼때, 어떤 URI에 어떤 메소드를 사용할지, 개발자들 사이에 지켜지는 규칙이다.
naver d2의 그런 REST API로 괜찮은가?를 개인적으로 정리한 블로깅입니다
REST(REpresentational State Transfer): '웹에 존재하는 모든 자원(이미지, 동영상, DB자원)에 고유한 URI를 부여해 활용'하는 것
Roy T.Fielding(로이 필딩)이 1994년부터 1996년 웹을 망가뜨리지 않고 HTTP를 증폭시킬 수 있을까라는 고민을 하다가 HTTP Object Model
이라는 것을 만든다.
그리고 이름을 REST로 바꾸고 논문으로 발표한다.
REST 아키텍쳐 스타일을 따르는 API
REST?: 분산 하이퍼 미디어 시스템(ex: 웹)을 위한 아키텍쳐 스타일
하이퍼미디어: 그래픽, 오디오, 영상, 완전한 텍스트, 그리고 하이퍼링크가 비선형인 매체
아키텍쳐 스타일: 제약조건들의 집합 (제약조건을 모두 지켜야 REST이다)
Uinfrom Interface이 제약조건
왜 인터페이스 일관성을 지켜야하나?
매우 잘 지키고있다 이유는?
REST API는 하이퍼텍스트를 포함한 스스로 설명가능(self-descriptive)한 메시지의 인터페이스 일관성(uniform interface)을 통해 리소스에 접근하는 API
REST API를 꼭따라야 할까?
로이 필딩의 답은 '아니다' 이다.
-> "서버와 클라이언트를 모두 스스로 만들어서 시스템 전체를 통제할 수 있거나, 업데이트에 관심이 없으면, REST에 대해 따지느라 시간을 낭비하지 말아라."
비교
흔한 웹 페이지 | HTTP API | |
---|---|---|
Protocol | HTTP | HTTP |
커뮤니케이션 | 사람-기계 | 기계-기계 |
Media Type | HTML | JSON |
커뮤니케이션에서 문제가 발생한다.
HTML | JSON | |
---|---|---|
Hyperlink | 됨 (a 태그 등) | 정의되어있지 않음 |
Self-descriptive | 됨 (HTML 명세) | 불완전* |
*문서 해석은 가능하지만, 의미를 해석하려면 별도로 문서가(API 문서 등) 필요하다.
ex)
[
{"id": 1, "title": "회사 가기"},
{"id": 2, "title": "집에 가기"}
]
"id"
가 무엇을 의미하고, "title"
이 무엇을 의미하는지 알 방법은 없다.
Self-descriptive - 확장 가능한 커뮤니케이션을 가능하게 한다.
서버나 클라이언트가 변경되더라도 메시지를 해석할 수 있다.
HATEOAS - 애플리케이션 상태 전이의 late binding
어디서 어디로 전이가 가능한지 미리 결정되지 않는다. 어떤 상태로 전이가 완료되고 나서야 그 다음 전이될 수 있는 상태가 결정된다.(페이지1을 눌러서 이동 -> 페이지1에 가서야 다음 페이지2로 이동가능)
-> 링크는 동적으로 변경될 수 있다.(서버가 링크를 바꿔도 클라이언트의 동작은 문제가 없다.)
방법1: Media type
1. 미디어 타입을 하나 정의한다.
2. 미디어 타입 문서를 작성한다. 이 문서에 "id"가 뭐고 "title"이 뭔지 의미를 정의한다.
3. IANA(모든 미디어 타입이 정의되어 있음)에 미디어 타입을 등록한다. 이 때 만든 문서를 미디어 타입의 명세로 등록한다.(정해진 Form을 채워서 등록)
4. 이제 이 메시지를 보는 사람은 명세를 찾아갈 수 있으므로 이 메시지의 의미를 온전히 해석할 수 있다.
단점
방법2: Profile
1. "id"가 뭐고 "title"이 뭔지 의미를 정의한 명세를 작성한다.
2. Link 헤더에 profile relation으로 해당 명세를 링크한다.
3. 이제 메시지를 보는 사람은 명세를 찾아갈 수 있으므로 이 문서의 의미를 온전히 해석할 수 있다.
단점
방법1: data로 하이퍼링크를 표현
ex 1)
[
{
"link": "https://example.org/todos/1",
"title": "회사 가기"
},
{
"link": "https://example.org/todos/2",
"title": "집에 가기"
}
]
ex 2)
[
"links": {
"todo": "https://example.org/todos/{id}"
},
"data": [{
"id": 1,
"title": "회사 가기"
}, {
"id": 2,
"title": "집에 가기"
}]
]
단점
JSON으로 하이퍼링크를 표현하는 방법을 정의한 명세들을 활용하는 방법도 있다.(ex: JSON API)
단점
방법2: Link, Location 등의 헤더로 링크를 표현한다.
단점
얄팍한 코딩사전 - REST API가 뭔가요?
naver d2 - 그런 REST API로 괜찮은가
위키백과 - REST
stampid.log - REST API와 RESTful API
홍찬기 - REST란