REST란?
- Resouce의 Representaion(표현)에 의한 상태(자원의 상태를) 전달
- HTTP Method(POST, GET, PUT, DELETE)를 통해 Resource를 처리하기 위한 아키텍처
REST 구성 요소
- 자원(Resource) - HTTP URI
- 자원에 대한 행위 (Verb) - HTTP Method
- 자원에 대한 행위의 내용 (Representation) - HTTP Message Pay Load
REST의 특징(아키텍처에 적용되는 6가지 제한 조건)
- Uniform(유니폼 인터페이스) : HTTP 표준에만 따른다면, 안드로이드/IOS 플랫폼이든, 특정 언어나 기술에 종속되지 않고 모든 플랫폼에 사용이 가능하며, URI로 지정한 리소스에 대한 조작이 가능한 아키텍처 스타일
- Stateless (무상태성): HTTP는 Stateless Protocol 이므로, REST 역시 무상태성을 갖는다. 즉, 각 요청 간 클라이언트의 컨텍스트가 서버에 저장되어서는 안 된다.
- Cacheable (캐시 가능): WWW에서와 같이 클라이언트는 응답을 캐싱할 수 있어야 한다.
- 잘 관리되는 캐싱은 클라이언트-서버 간 상호작용을 부분적으로 또는 완전하게 제거하여 scalability(확장성)와 성능을 향상시킨다.
- 캐시란? 웹 캐시(web cache) 또는 HTTP 캐시(HTTP cache)는 서버 지연을 줄이기 위해 웹 페이지, 이미지, 기타 유형의 웹 멀티미디어 등의 웹 문서들을 임시 저장하기 위한 정보기술. 웹 캐시 시스템은 이를 통과하는 문서들의 사본을 저장하며 이후 요청들은 특정 조건을 충족하는 경우 캐시화가 가능하다.
- 계층화(Layered System): 클라이언트는 보통 대상 서버에 직접 연결되었는지, 또는 중간 서버를 통해 연결되었는지를 알 수 없다. 중간 서버는 로드 밸런싱 기능이나 공유 캐시 기능을 제공함으로써 시스템 규모 확장성을 향상시키는 데 유용하다.
- 자체 표현 구조( Self- Descriptiveness): 동사(method) + 명사(URI)로 이루어져 있어 어떤 메서드에 무슨 행위를 하는지 알 수 있으며, 메시지 포맷 역시 JSON을 이용해서 직관적으로 이해가 가능한 구조로, REST API 메세지만 보고도 이를 쉽게 이해 할 수 있다.
- 클라이언트/서버 구조: 아키텍처를 단순화시키고 작은 단위로 분리(decouple)함으로써 클라이언트-서버의 각 파트가 독립적으로 개선될 수 있도록 해준다.(클라이언트와 서버에서 개발해야 할 내용이 명확해지고 서로 간 의존성이 줄어들게 된다)
Richardson Maturity Model(리차드슨 성숙도 모델, RMM)
- LEVEL 0
- Expose soap web services in rest style, REST 형식으로 SOAP 웹서비스를 노출
- HTTP method를 URI에 표시
- http://server/getPosts
- http://server/deletePosts
- http://server/doThis
- LEVEL 1
- Expose resources with proper uri, 적절한 리소스 노출
- http://server/accounts
- http://server/accounts/10
- note: improper use of http methods, HTTP Method의 잘못된 사용
- LEVEL 2
- Level1 + HTTP methods
- 리소스를 구분하는 것으로 응답 상태를 HTTP Status code를 활용
- LEVEL 3
- Level2 + HATEOAS(Hypertext As the Engine Of Application State)
- DATA + NEXT POSSIBLE ACTIONS
RESTful API 설계 시 고려해야할 사항
- 사용자 우선이 되어야 한다.
- HTTP의 장점을 최대한 살려 설계해야 한다.
- resource별로 적절한 HTTP Method를 제공해야 한다.
- 각 API요청에 따른 적절한 Response Status 코드를 반환시켜줘야 한다.
- URI에는 critical 한 데이터를 포함해선 안된다.
- 복수 형태를 사용하자
- /user -> /users
- /users/1 -> /users/1
- resource에 대한 정보는 동사형태보다 명사(nouns)로 표현 하자.
- 일괄된 접근 endpoint를 적용하자
- PUT -> /gists/{id}/star
- DELETE -> /gists/{id}/star