1. REST란?
REST(REpresentational State Transfer) 는 프로토콜이나 표준이 아닌 웹의 장점을 최대한 활용할 수 있도록 해주는 네트워크 아키텍처 원리(또는 규칙)의 모음이고 보면 된다. 여기서 '네트워크 아키텍처 원리'란 자원을 구분하고, 자원의 상태를 표현하며, 그 자원을 어떻게 할 것인지에 대한 모든 것들을 말한다.
cf) REST는 웹의 장점을 극대화하기 위해 기존의 웹 기술과 HTTP 프로토콜을 그대로 활용한 것일 뿐 HTTP 프로토콜과 동일시하면 안 된다. 뿐만 아니라 웹 외에도 적용할 수 있다.
1.1 REST의 구성 요소
- 자원(Resource) -> URI
- 행위(Verb) -> HTTP Method
- 표현(Representations) -> JSON, TEXT, XML 등
1.2 REST의 특징
- 1) Uniform Interface
URI로 지정한 자원에 대해서 일관적이고 통일된 인터페이스를 사용해야 한다. 내용은 다음과 같다.
- Identification of resources - URI와 같이 주고 받는 리소스는 유일하게 특정될 수 있어야만 한다.
- Manipulation of resources through representations - 자원을 관리할 때는 일정한 표현들로 표현해줘야 한다.
- Self-Descriptive messages - 메시지를 보낼 때는 메시지에 자원의 타입이나 속성만 전달하는 게 아니라 자원을 어떻게 처리해야 하는지에 대한 충분한 내용들도 포함해야 한다.
- Hypermedia as the engine of application state - 클라이언트가 리소스에 액세스 한 뒤 링크를 통해 수행 가능한 모든 작업에 대해 찾을 수 있어야 한다.
- 2) Stateless
세션 정보나 쿠키 정보를 별도로 저장하거나 관리하지 않는다.
- 3) Cacheable
캐싱이 허용되는지 여부에 대한 정보를 지정해주고, 가능하다면 캐싱할 수 있어야 한다.
- 4) Client-Server 구조
클라이언트와 서버의 각 파트가 독립적으로 개선되어야 한다.
- 5) Layered System
다중 계층으로 구성될 수 있으며, 중간 서버는 로드 밸런싱 기능이나 공유 캐시 기능을 제공하여 시스템의 확장성을 보장해준다.
- 6) Code on Demand(optional)
자바 애플릿이나 자바스크립트를 활용하여 클라이언트 기능을 확장시킬 수 있다.
2. REST API란?
API란 보통 클라이언트가 리소스를 요청하면 서버에서 그대로 가져다 쓸 수 있도록 제공해주는 인터페이스를 말한다.
API를 설계할 때, REST의 원리를 올바르게 따르는 API를 REST(ful) API라고 한다.
REST API를 설계할 때 기본적인 규칙으로는 URI는 자원의 정보를 표현해야 하고, 자원에 대한 행위는 HTTP Method(GET, POST, PUT, DELETE) 를 통해 표현한다는 것이다.
2.1 REST API 중심의 설계 규칙
- 1) URI는 자원의 정보를 표현해야 한다.
- 자원을 표현할 때는 동사보다는 명사를, 대문자보다는 소문자를 사용한다.
- Document는 하나의 객체로, Collection은 객체들의 집합이라고 생각하면 좋다. 그래서 Document는 보통 단수 명사로, Collection은 보통 복수 명사를 사용한다.
- ex)
GET /Members/1
->GET /members/1
- 2) 자원에 대한 행위는 HTTP Method로 표현한다.
- GET, POST, PUT, DELETE Method를 이용하여 CRUD한다.
URI에는 동사 표현이 들어가면 안된다.- ex)
GET /members/insert/1
->POST /members/1
- 경로 부분 중 변하는 부분은 유일한 값으로 대체한다.
- ex) id=1인 student를 삭제하는 route ->
DELETE /students/1
2.2 REST API 설계 시 주의사항
1) 슬래시 구분자(/)는 계층 관계를 나타내는 데 사용한다.
http://restapi.example.com/houses/apartments
http://restapi.example.com/animals/mammals/whales
2) URI에 포함되는 모든 문자는 자원에 대한 유일한 식별자이기 때문에 혼동을 주지 않기 위해 URI의 마지막 문자로 슬래시(/)를 사용하지 않는다.
http://restapi.example.com/houses/apartments/ (X)
http://restapi.example.com/houses/apartments (0)
- 3) URI 작성 시 언더바(_)는 사용해선 안되며, 하이픈(-)은 가독성을 높이고 싶을 때 사용 가능하다.
4) 파일 확장자는 URI에 포함시키지 않는다. 대신 HTTP의 Accept header를 사용한다.
http://restapi.example.com/members/soccer/345/photo.jpg (X)
GET / members/soccer/345/photo HTTP/1.1 Host: restapi.example.com Accept: image/jpg (O)
5) 자원 간의 연관 관계가 있는 경우
/리소스명/리소스 ID/관계가 있는 다른 리소스명
ex)
GET : /users/{userid}/devices (일반적으로 소유 ‘has’의 관계를 표현할 때)
Link
http://www.incodom.kr/RestFul_API,
https://ko.wikipedia.org/wiki/REST,
https://meetup.toast.com/posts/92,
https://restfulapi.net/,
https://gmlwjd9405.github.io/2018/09/21/rest-and-restful.html,
https://www.redhat.com/ko/topics/api/what-is-a-rest-api,
https://www.codecademy.com/article/what-is-rest,