REST(Representational State Transfer)의 약자로 자원을 이름으로 구분하여 해당 자원의 상태를 주고받는 모든 것을 의미한다.
즉 REST란
HTTP URI(Uniform Resource Identifier)를 통해 자원(Resource)을 명시하고,
HTTP Method(POST, GET, PUT, DELETE, PATCH 등)를 통해
해당 자원(URI)에 대한 CRUD Operation을 적용하는 것을 의미한다.
자원(Resource) : URI
행위(Verb) : HTTP Method
표현(Representations) : HTTP Message Pay Load
Client-Server(서버-클라이언트 구조)
REST는 클라이언트와 서버 간의 역할을 분리한다.
이렇게 함으로써 클라이언트와 서버는 각각 개발될 수 있고, 이는 각자의 분야에서 독립적으로 발전하고 확장될 수 있다는 이점을 제공한다.
Stateless(무상태)
REST는 상태가 없는(stateless) 프로토콜이다.
각 요청 간에 클라이언트의 컨텍스트가 서버에 저장되지 않음을 의미한다.
각 요청은 서버가 이전에 만든 요청에 대한 정보 없이 처리되어야 한다.
이로 인해 서버의 확장성이 향상된다.
Cacheable(캐시 처리 가능)
REST의 표준 HTTP 프로토콜을 기반으로 한 캐싱 기능은 클라이언트가 서버의 응답을 캐시하고 재사용할 수 있게 한다.
이를 통해 클라이언트의 성능과 효율성이 향상될 수 있다.
Layered System(계층화)
클라이언트는 바로 연결된 서버에만 응답을 보낼 수 있으며, 중간 서버는 요청이나 응답을 전달하는 역할을 한다.
이는 네트워크 기반의 인프라를 사용하여 서버나 클라이언트를 쉽게 변경하고 업데이트할 수 있게 한다.
Uniform Interface(인터페이스 일관성)
REST는 일관된 인터페이스를 제공한다.
이는 자원 지향 아키텍처, HTTP 메소드(GET, POST, PUT, DELETE 등), 자원에 대한 식별을 위한 URI, 그리고 메시지 포맷(JSON, XML 등)을 포함한다.
Code on Demand (optional)
필요한 경우, 서버는 실행 가능한 코드를 클라이언트에게 제공하여 클라이언트의 기능을 확장할 수 있다.
이는 선택적인 요구사항이며, 일반적으로는 사용되지 않는다.
이러한 특징들 덕분에 REST는 확장성이 뛰어나며 유지보수가 쉽고, 다양한 유형의 클라이언트와 상호작용할 수 있습니다.
별도의 인프라 구축 필요 없음
REST API는 HTTP 프로토콜의 인프라를 그대로 활용한다.
따라서 별도의 인프라를 구축할 필요가 없으며, 이는 비용 및 시간을 절약하는 데 도움이 된다.
명확한 메시지
REST API 메시지는 의도하는 바를 명확하게 나타낸다.
이를 통해 개발자는 API의 동작을 쉽게 이해하고 예측할 수 있다.
표준화된 인터페이스
REST는 HTTP 메소드와 URI를 이용하여 자원에 접근한다.
이는 개발자가 API를 이해하고 사용하는데 있어 일관성을 제공하며, 학습 곡선을 낮춘다.
Scalability (확장성)
REST의 Stateless 특성은 서버 측에서 클라이언트 정보를 저장하지 않으므로, 서버의 확장성을 향상시키는 데 도움이 된다.
Performance (성능)
REST는 캐싱 기능을 지원합니다. 이는 반복된 요청에 대한 응답 시간을 줄이고 서버 부하를 줄여 성능을 향상시킵니다.
Separation of Concerns (관심사의 분리)
REST는 클라이언트와 서버 간의 역할을 명확히 분리합니다. 이는 개발 프로세스를 단순화하고, 각 구성 요소를 독립적으로 확장하거나 수정하는 데 유리합니다.
Limited Methods (제한된 메소드)
REST는 HTTP 프로토콜에 의존하며, HTTP 메소드의 제한된 세트 (GET, POST, PUT, DELETE 등)를 사용하여 모든 종류의 트랜잭션을 표현해야 한다.
이는 때때로 충분한 표현력을 제공하지 못할 수 있다.
Overhead
REST는 메타데이터, 헤더 정보, URI 등을 통해 데이터를 전송한다.
이는 비효율적인 데이터 전송을 초래하며, 특히 모바일 네트워크와 같이 대역폭이 제한된 환경에서는 부담이 될 수 있다.
Stateless Limitations (상태 없음의 한계)
REST의 Stateless 특성은 각 요청이 독립적으로 처리되어야 함을 의미한다.
이는 서버가 클라이언트의 상태를 추적하지 않음을 의미하며, 이로 인해 일부 연산에서는 비효율적일 수 있다.
Difficulty in Managing Real-Time Communication
REST는 실시간 통신이나 소켓 통신 같은 상황에는 적합하지 않다.
이런 경우에는 WebSocket이나 GraphQL 등의 기술이 더 적합하다고 볼 수 있다.
브라우저 호환성 문제
구형 브라우저에서 호환이 되지 않아 지원해주지 못하는 동작이 많다.(ex. 익스폴로어)
REST API는 REST 원칙을 따르는 애플리케이션 프로그래밍 인터페이스이다.
클라이언트가 서버의 자원에 접근하고 조작하는데 사용된다.
Bad Example
/Running
Good Example
/run
/users
/users/1
Bad Example
/users/
Good Example
/users
Bad Example
/user_profile
Good Example
/user-profile
Bad Example
/users.json
Good Example
/users
(클라이언트가 JSON 형식을 원하는 경우, Accept: application/json 헤더를 사용)
POST /users Content-Type: application/json { "name": "John Doe", "email": "john.doe@example.com" }
Bad Example
/users/1/select
/users/1/update
/users/1/delete
Good Example
GET/users
(모든 사용자를 조회)
POST/users
(새 사용자를 생성)
PUT/users/1
(id가 1인 사용자를 업데이트)
DELETE/users/1
(id가 1인 사용자를 삭제)
HTTP/1.1 201 Created
GET api/v1/users
GET /users/1 { "id": 1, "name": "John Doe", "email": "john.doe@example.com", "links": [ { "rel": "delete", "href": "/users/1" } ] }