REST란?
- Representational State Transfer의 약자
- ROA(Resource Oriented Architecture)를 따르는 월드 와이드 웹(www)과 같은 분산 하이퍼 미디어 시스템을 위한 소프트웨어 아키텍처(제약조건의 집합)의 한 형식
- 컴퓨터 시스템간에 상호운영성을 제공하는 방법 중 하나
REST 아키텍쳐를 따르려면 다음 아래의 스타일을 만족시켜야 한다.
- REST를 구성하는 스타일
1. client-server
REST client가 REST server로부터의 resource를 요청한다.
client와 server에서의 역할들이 확실히 구분되어 의존성이 줄어든다.
2. stateless
3. cache
4. uniform interface(another architecture)
5. layered system
6. code-on-demand (optional)
코드를 client로 보내서 실행할 수 있어야 함(javascript 파일을 의미)
- Uniform Interface의 제약조건
1. resource가 uri로 식별되어야 한다.
2. resource를 새로 만들거나 기존의 resource를 삭제하는 등의 resource 조작은 representations를 통해서 이뤄져야 함(http message에 표현을 담아서 전송)
3. self-descriptive messages
4. hypermedia as the engine of application state(HATEOAS): 애플리케이션의 상태는 Hyperlink를 이용하여 전이 되어야 한다(링크를 따라가면서 상태가 전이).
위의 제약조건들을 따르게 되면 server와 client가 각각 독립적으로 진화할 수 있어 서버의 기능이 변경되어도 client를 업데이트할 필요가 없다.
특히 웹에서는 REST가 잘 지켜지고 있다.
(HTTP 1.0 -> HTTP 2.0으로 변경되거나 HTML 버전이 5.0으로 변경되어도 웹은 잘 동작)
REST의 기본 구성 요소
크게 3가지로 구성
1. resource(자원)
모든 자원은 URI로 식별되고 server에 존재한다.
client에서는 URI로 식별된 resource에 대한 조작을 server에게 요청한다.
2. verb(행위)
uri는 리소스를 식별하는 이름일 뿐, 이 리소스를 조작(Create, Read, Update, Delete)할 수 있어야 하고 이러한 조작은 4가지 HTTP method(POST, GET, PUT or PATCH, DELETE)를 통해 이루어진다.
(PUT: 전체 내용을 변경, PATCH: 부분을 변경)
3. representation(표현)
client에서 리소스에 대한 조작을 server로부터 요청하고 요청에 대한 응답을 받을 때 JSON, XML 등의 형태(representation)로 데이터(message)를 주고 받는다.
REST API란?
- REST 아키텍쳐 스타일을 따르는 API를 구현한 것
하지만 오늘날 REST API로 불리는 것들이 거의 대부분 REST 아키텍쳐를 따르지 않고 있다.
특히 Self-descriptive, HATEOAS 조건을 지키지 않고 있다.
REST API 설계 예시
REST API 설계 규칙
- URI
- 리소스는 동사보다는 명사, 대문자보다는 소문자를 사용
- 리소스의 document 이름으로는 단수 명사를, collection과 store의 이름으로는 복수 명사 사용
- HTTP method가 URI에 들어가면 안 됨
- URI에서 변하는 부분은(:id) 하나의 특정 리소스를 나타내는 고유값이어야 함
- URI의 마지막 문자로 ‘/’를 포함하지 않음
- ‘_’은 사용하지 않고 긴 URI의 경우에는 ‘-’를 사용
파일확장자는 포함하지 않고 Accept header를 사용
ex)
http://www.example.com/developers/front/19/photo.jpg (x)
대신
GET /developers/front/19/photo HTTP/1.1 Host: www.example.com Accept: image/jpg
리소스간에 연관 관계가 있는 경우에는 /리소스명/리소스ID/관계 있는 다른 리소스 명
ex)
{ "posts": [ { "id": 1, "title": "React", "content": "React is ..." }, { "id": 2, "title": "Vue", "content": "Vue is ..." } ], "comments": [ { "id": 1, "content": "good post!", "postId": 1 }, { "id": 2, "content": "bad post!", "postId": 1 } ] }
comments 2번의 element는 posts 1번 element에 종속되어 있다.
부모가 되는 posts를 앞에 적고 부모의 element id값을 적은 뒤에 자식이 되는 리소스의 이름을 적어서 URI를 표현한다.
URI: posts/1/comments
RESTful API란?
- REST의 기본 원칙을 성실히 지킨 서비스 디자인을 “RESTful”하다고 표현한다.
- REST 아키텍쳐 스타일을 성실히 따르는 API로서 REST를 REST답게 쓰기 위한 방법으로, 공식적으로 발표된 것은 아니다.
References