Client/Server 구조 : 클라이언트(사용자 인증이나 컨텍스트 관리)와 서버(API 제공)의 역할이 확실히 구분되어 각각의 역할만 수행하고 서로 의존하지 않는다.
무상태성(Stateless) : 클라이언트 상태를 서버에 저장하지 않는다. 서버에 들어오는 모든 요청에 대해 독립적으로 통신한다. 세션이나 쿠키와 같은 상태 정보를 저장하지 않으므로 서버에서 이러한 상태정보를 신경쓸 필요가 없으므로 구현이 단순해진다. 단점으로는 필요한 모든 정보를 각각의 요청에 전부 담은 상태로 전송해야 하므로 네트워크 성능이 저하될 수 있다.
캐시 가능성(Cacheable) : REST는 HTTP 웹 표준을 사용하므로, HTTP 캐시(서버 지연을 줄이기 위해 웹 페이지, 이미지, 기타 유형의 웹 멀티미디어 등의 웹 문서들을 임시 저장하기 위한 기술)를 사용할 수 있어야 한다. HTTP 캐시는 요청과 관련된 응답을 저장하고 저장된 응답을 후속 요청에 다시 사용한다.
계층화(Layered System) : 서버와 클라이언트 사이에 방화벽, 게이트웨이, Proxy 등 다양한 계층 형태로 구성이 가능해야 하며, 이를 확장할 수 있어야 한다. 이러한 계층은 클라이언트에 보이지 않는 상태로 유지된다.
인터페이스 일관성 : 인터페이스의 일관성을 지키고, 아키텍처를 단순화시켜 작은 단위로 분리하여 클라이언트, 서버가 독립적으로 개선될 수 있어야 한다. URI로 지정한 Resource에 대한 조작을 통일되고 한정적인 인터페이스로 수행한다. HTTP 표준 프로토콜에 따르는 모든 플랫폼에서 사용이 가능하다. 특정 언어나 기술에 종속되지 않는다.
Code on Demand(Optional) : 자바 애플릿, 자바스크립트, 플래시 등 특정한 기능을 서버로부터 클라이언트가 전달받아 코드를 실행할 수 있어야 한다. 선택적으로 적용하며 필수는 아님.
장점
✔️ HTTP 프로토콜 인프라를 그대로 사용하므로 REST API 사용을 위한 별도의 인프라 구축이 필요하지 않다.
✔️ HTTP 표준을 따르는 모든 플랫폼에서 사용 가능하다.
✔️ REST API 메시지를 읽는 것 만으로도 메시지가 의도하는 바를 명확하게 파악할 수 있다.
✔️ Stateless한 특성 때문에 이전에 서버에서 진행된 내용들을 클라이언트가 알 필요가 없기 때문에 해당 URI와 원하는 메소드 자체만 독립적으로 이해하면 된다.
✔️ 서버와 클라이언트의 역할이 명확하게 구분되어 있어 구현이 간단해진다.
단점
✔️ 표준이 존재하지 않는다. 즉, 관리가 어렵고 공식화 된 API 디자인 가이드가 존재하지 않는다.
✔️ HTTP 메소드 형태가 제한적이다.
도큐먼트 : 객체 인스턴스나 데이터베이스 레코드와 유사한 개념
컬렉션 : 서버에서 관리하는 디렉터리라는 리소스
스토어 : 클라이언트에서 관리하는 리소스 저장소
Ex) GET /Member/1 -> GET /members/1
Ex) GET /members/delete/1 -> DELETE /members/1
Ex) GET /members/show/1 -> GET /members/1
Ex) GET /members/insert/2 -> POST /members/2
Ex) student를 생성하는 route: POST /students
Ex) id=12인 student를 삭제하는 route: DELETE /students/12
Ex) http://restapi.example.com/houses/apartments
Ex) http://restapi.example.com/houses/apartments/ (X)
Ex) http://restapi.example.com/members/soccer/345/photo.jpg (X)
Ex) GET / members/soccer/345/photo HTTP/1.1 Host: restapi.example.com Accept: image/jpg (O)
Ex) GET : /users/{userid}/devices (일반적으로 소유 ‘has’의 관계를 표현할 때)
참고 Reference