자원(Resource) - URI
행위(Verb) - Http method
표현(Representation)
Roy Fielding 의 박사학위 논문에 최초로 공개된 용어이다. 당시 HTTP의 주요 저자 중 한사람인 로이필딩은 웹 설계의 우수성을 널리 알리기 위해서 REST를 하나의 아키텍처로서 소개했다고 한다.
위에서 언급한바와 같이 Resource + Verb + Representations 로 구성되어있다.
특징은 아래와 같이 6가지가 존재한다
(1) Uniform interface
- URI 로 지정된 리소스에, 접근을 통일하고 한정적인 인터페이스로 수행하는 아키텍쳐 스타일
- 쉽게 말하면 원하는 리소스의 URI 가 명확하다는 것이다
(2) Stateless
- 무상태성, 즉 작업을 위한 상태 정보를 따로 저장하고 관리하지 않는다. 세션 정보나 쿠기 정보를 별도로 저장하고 관리하지 않기 때문에 API 서버는 들어오는 요청을 단순히 처리하고 반환하기만 하면 된다.
- 한마디로 필요한 정보만 관리한다는 뜻이다.
(3) Cacheable
- HTTP 웹 표준을 따르기 때문에, 캐시 기능을 활용할 수있다. Last-modified 태그나 E-Tag 등 을 이용해서 캐싱 구현이 가능하다.
- 자주 요청되는 정보의 경우 활용할 여지가 크다.
(4) Self-descriptiveness
- REST API 메시지만 보고도 어떤 정보를 담고있는지 쉽게 이해할 수 있다.
- GET, POST 와 URI 를 통해서 이 API 가 무슨 역할을 하는지 알 수 있어야 한다.
(5) Client - Server
- 서버는 api를 제공하고, 클라이언트는 사용자 인증이나 컨텍스트(세션, 로그인, 토큰) 를 직접 관리하는 역할이 명확히 구분되어 있기에 서로간의 의존성이 줄어들게 된다.
(6) hierarchy structure
- 보안, 로드밸런싱, 암호화 계층을 추가해 구조의 유연성을 두고, proxy + gateway 를 이용해 네트워크 기반의 중간매체를 사용할 수 있게 한다.
1) 슬래시 구분자는 계층관계를 나타낼때 사용한다
2) URI 마지막 문자로 슬래시를 포함하지 않는다.
3) _ 보다는 - 를 이용한다
4) URI 는 소문자를 활용한다
5) 파일 확장자는 URI에 포함하지 않는다
6) CRUD 는 URI 에 포함하지 않고 WEB METHOD(GET, POST..) 를 이용해서 역할을 분리해야한다.
1) Document(단수)
- DB 의 row 단위, 컬렉션에서 하나의 객체 단위로 하는 단일 정보
ex) 1, 2, 3, team15, number5, seung-lee
2) Collection(복수)
- 도큐먼트들의 집합
- 관리의 주체는 서버
ex) projects
3) Store(복수)
- 도큐먼트들의 집합이며 관리의 주체는 클라이언트
ex) favorites, basket(장바구니)
4) Controller(복수)
- Collection, Store 의 메서드 기능
- CRUD 라는 표죽적인 메서드와 논리적으로 매핑되지 않는 애플리케이션의 고유한 행동
- URI의 경로의 마지막에 표시
예제
1) GET http://seunghwan.com/grades/1/classes/3
: 1학년 3반 학생 목록들을 조회
grades : Collections
1 : Document
classes : Collections
3 : Document
2) PUT http://seunghwan.com/members/456/follow
: 456번 회원 멤버를 follow 해라
members : Collection
456 : Document
follow : Controller
3) POST http://seunghwan.com/items/1/favorites/register
: item 1번을 좋아요 목록에 register
- items : Collections
- 1 : Document
- faverites : Store
- register : Controller
1) GET : READ + No body + Use params or querystring
2) POST : CREATE + Use body
3) PUT : UPDATE + Use body
4) DELETE : DELETE + No body + Use params or querystring
1) 성공 (2xx)
2) 리다이렉션 (3xx)
3) 클라이언트 에러 (4xx)
4) 서버에러 (5xx)