1장
- 웹에서의 원칙 : 일반 사용자들이나, 자동화 소프트웨어 에이전트나 동일하게 작동한다.
- URL : 데이터 접근 경로 ⇒ 각 URL은 하나의 리소스를 식별한다.
- 브라우저가 리소스에 HTTP 요청을 보내면 서버는 응답으로 리소스의 표현(representation)을 반환한다.
주소 지정 가능성(addressability)
- 하나의 URL은 단 하나의 리소스만 식별한다.
- 플래시 인터페이스가 이를 어긴 대표적인 예시
- 이 원칙은 모든 리소스는 각각 자신의 URL을 가져야 한다는 말
짧은 세션
- HTTP 세션은 하나의 요청 동안 유지된다.
- 요청이 발생하지 않으면 서버는 클라이언트의 존재를 모른다 ⇒ 무상태(statelessness)
자기 서술형 메시지
-
요청에서 받은 리소스의 표현에는 보통 다음에 해야할 것도 포함되어 있다.
- HTTP 메서드 : 클라이언트가 리소스에 무엇을 원하는지 서버에 알려주는 방법
- GET, HEAD, POST, PUT, DELETE를 포함하여 총 8개
- PATCH : 확장 메서드(이 외 새로운 메서드 정의는 권유되지 않음)
애플리케이션 상태
- 애플리케이션 상태 in REST : ‘어떤 페이지에 와있는가?’, ‘어떤 상태고 다음에 어떤 동작을 수행할수 있는가’의 기준에서 현재 상황을 의미
- 애플리케이션 상태의 전환 ⇒ 나타난 링크로 이동한다거나, 폼을 채운다거나…
- 구현되어 있지 않은 상태의 전환은 불가능하다
- 빈 페이지에서 POST를 보낼 수 없듯이..
리소스 상태
- 말 그대로 리소스들의 상태
- GET은 조회, POST는 새 상태를 추가하는 것
- 클라이언트는 리소스 상태에 대해 직접적으로 컨트롤 할 수 없다(클라이언트가 DB에 접근 불가능하듯)
-
어려웠던 말
애플리케이션 상태는 클라이언트 측에서 관리하지만, 서버는 가능한 상태 전이를 나타내는 표현을 보내 조작할 수 있다
- 애플리케이션 상태는 클라이언트측에서 관리한다.
- 서버는 애플리케이션 상태를 모르기 때문이다.
- 현재 보고있는 데이터가 무엇인지, 다음 수행할 수 있는 동작이 어떤것들인지는 클라이언트에서 기억하고 서버에 요청한다.
- 요청을 받은 서버는 “어떤 상태로 전이되는지”를 보여준다(데이터가 추가되거나 삭제된 모습, 새로운 링크 등)
- 하지만 그걸 받아 화면에 출력하는 것(실제 애플리케이션 상태의 변화)은 클라이언트의 몫이다.
- 서버가 보낸 데이터에 따라 클라이언트가 하는 짓이 달라진다?
- 서버가 말한대로 행동하니까
- 서버가 조질라면 조질 수 있다.
연결
- 연결의 원칙 : 각 페이지는 인접한 페이지에 어떻게 갈 수 있는지 알려준다(클릭, 입력 등등)
- ‘애플리케이션 상태의 엔진으로서 하이퍼미디어’
- 애플리케이션 상태를 변경할 수 있는 하이퍼미디어
- 페이지를 변경할 수 있는 하이퍼미디어
- 따라서 각 하이퍼미디어는 서버가 다음에 무엇을 할 수 있는지를 말해준다.
- ex1. 입력폼은 서버가 리소스 상태를 추가할 수 있음을 알려준다.
- ex2. 출력 태그는 서버가 리소스 상태를 조회할 수 있음을 알려준다.
웹보다 뒤쳐지는 웹 API
- 자기 서술 메시지 원칙(Self-Descriptive Messages Principle) : 별도의 문서나 추가 데이터가 없어도, 응답 메시지만으로 작업과 영향에 대해 파악할 수 있어야 함.
- 따라서 URL 이름을 잘 짓자
의미 체계(semantic)의 문제
- 문서의 구조를 이해하는 것과 문서의 의미를 이해하는 것은 차이가 있다.
- 자기 서술적 메시지를 파악하고 선택하는 것을 모두 인간이 수행하지 않고, 그럴 순 없다.
- 이를 위해 웹 API 설계를 배워야 함
2장
HTTP GET: 확실한 시도
- GET 요청 : 표현을 요청한다.
- 서버의 리소스 상태를 변경할 의도가 전혀 없다 = 리소스의 URL만 알아도 요청을 보내고 표현을 받을 수 있다.
- GET 요청은 안전해야 하고, 큰 부작용을 야기하도록 해선 안된다.
HTTP 응답 읽기
- 상태 코드(status code) or 응답 코드(response code) : 요청의 결과를 요약하여 세 자리 숫자로 표현
-
본문(body) or 엔티티-바디(entity-body) : 데이터가 담겨 있음
정확히는, HTTP 응답 전체가 “표현”이고 본문안에는 중요한 정보가 들어있는 것임)
- 응답헤더
- 키-값 형태
- Content-Type : 클라이언트가 바디를 어떻게 이해해햐 할지 설명해줌
- 이 키의 값은 엔티티 바디의 미디어 유형(media type)이나 MIME 유형 등으로 부른다
JSON
- 정확한 정의는 평문(plain-text)으로 간단한 자료구조를 표현하는 표준
- 문자열(”큰 따옴표”), 리스트([대괄호]), 객체({”키-값 묶음은”: “중괄호”}) 를 알맞은 형식으로 표기함
- 이것이 제공되기 위해선 Content-Type이 “application/json”이어야 함
Collection+JSON
- JSON의 형식에 제약을 건 형태
- Content-Type: application/vnd.collection+json 일 때
- JSON이 정해진 표준대로 키-값 을 가져야 함
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
# Collection+JSON의 예시
{
"collection":
{
"version" : "1.0",
"href": "https://www.naver.com",
"items": [
{
"href": "https://www.naver.com/news/1254215",
"data": [
{
"name": "text",
"value": "Test",
},
{
"name": "skdqwkdq",
"value": "hkrhklrhkrh",
},
],
"links": [],
},
],
...
}
각 키의 값으로는 정해진 대상이 들어가야 한다. 예를 들어, 4번째 줄 href는 “이 문서의 표현을 가져오는 데 사용한 주소”가 들어가야 한다. 즉, 이 리소스의 URL을 의미한다.
API 작성하기
- Collection+JSON 표준으로 작성하려면
- 클라이언트가 template 객체를 사용해 유효한 표현을 작성하고
- HTTP POST를 사용해 이 1의 표현을 서버에 보내서
- 서버가 처리해야 한다.
HTTP POST: 리소스는 어떻게 탄생할까
- 응답 코드 201을 받으면, 헤더의 Location에 생성된 것을 찾을 수 있는 곳을 알 수 있다.
제약 조건으로 자유해짐
- RESTful 디자인을 따르면 제약이 많이 생긴다
- 그러나 그 제약이 자유를 준다.
- 언제 GET 요청을 보내도 아무 악영향이 없다는 확신이 생기기 때문.
- JSON에 담기면 그 값의 의미를 알 수 있다.
- Collection+JSON 으로 작성한다면?
- 담긴 링크(href)의 의미를 알려줄 필요가 없음
애플리케이션 의미 체계가 의미적 차이를 만든다
- Collection+JSON도 내부 항목을 커스텀할 수 있다.
- 이렇게 개별적으로 변경되는 것들이 애플리케이션 의미 체계다.
- 이게 바로 1장에서 말하는 의미 체계(semantic)의 문제.