사전적인 정의의 RESTful 은 다음과 같다.
RESTful(Representational State Transferful)은 REST(Representational State Transfer) 원칙을 따르는 웹 서비스 또는 API를 의미합니다. REST는 웹의 장점을 최대한 활용하여 설계된 아키텍처 스타일로, 주로 HTTP를 사용하여 자원(Resource)을 전송하고 처리합니다. RESTful은 이 원칙을 충실히 따르는 시스템을 말합니다.
라고 합니다. 그리고 다음 제한조건을 준수해야 된다고 합니다
- 통합된 인터페이스
- 클라이언트 서버/구조
- Stateless (무상태)
- 캐시 처리 가능(Cacheable)
- 계층화된 시스템
1. 통합된 인터페이스
https://jaess.com/orders
orders 라는 주문에 대한 리소스가 있다면 조회에 대해 위와 같이 설계를 하면 간결하게 추가적인 요청을 정의할 수 있다.
그리고 새로운 주문에 대한 정보는 다음과 같이 처리할 수 있다.
// 각 요청은 POST 메소드를 통한 요청
https://jaess.com/orders/create-order (X)
https://jaess.com/orders (O)
2. 클라이언트-서버 구조
클라이언트와 서버의 역할을 명확히 분리하여 시스템의 확장성과 유연성을 높인다.
클라이언트는 사용자와의 상호작용, 서버는 데이터 저장, 처리, 비지니스 로직을 관리한다.
3. Stateless (무상태)
각 요청은 서버에서 클라이언트의 상태가 저장되지 않습니다.
이전 요청에 대한 정보를 기억하지 않기 때문에 모든 요청은 서버 입장에서 새롭게 처리된다.
만약 ServerA 가 유저의 로그인 상태(인증이 된)를 기억하고 있는 상황이면 ServerB에서는 현재 로그인이 되어있지 않아 로그인 후 처리되는 유저의 정보를 조회할 수 없다.
ServerA 로 요청하던 유저는 ServerA가 부하가 심해 ServerB로 요청하게되면 로그인을 다시 하라는 응답을 받을것이다.
상태가 없는 (Stateless) 로 관리하게 된다면 인증된 사용자는 ServerA 에 요청 후 ServerB 에 요청하더라도 유저의 상태를 저장을 하지 않고 있는 상태이므로 정상적으로 응답을 받을 수 있다.
4. 캐시처리 가능
HTTP를 그대로 사용하여 HTTP가 가진 캐싱 기능을 사용할 수 있다.
요청과 응답에 대한 예시
- 요청
GET /books/popular HTTP/1.1
Host: api.example.com
- 응답
HTTP/1.1 200 OK
Cache-Control: max-age=3600
Content-Type: application/json
[
{
"id": 1,
"title": "RESTful API Design",
"author": "John Doe"
},
{
"id": 2,
"title": "Learning REST",
"author": "Jane Smith"
}
]
max-age=3600 을 통해 응답에 대해 1시간(3600초) 캐시될 수 있음을 알려준다.
5. 계층화된 시스템
중간 계층을 통해 요청을 검사하고 필터링하여 보안을 강화할 수 있다.
또한 프록시 서버를 거쳐 요청을 캐싱하여 성능개선을 하고 로드밸런서를 통해 부하분산을 할 수 있다.