요약
- REST API : 상태(State)를 전달(Transfer)하는 것을 나타내는(Representation) 방법. 자원을 이름(자원의 표현)으로 구분하여 해당 자원의 상태(정보)를 주고 받는 것.
- REST는 API를 설계할 URI 자원으로 한정된, 통일되고 일관적인 인터페이스(uniform interface)를 구현.
- URI는 동사를 제외한, 명사로 구성.
- Resource에 대한 행위를 HTTP method (GET, POST, PUT, DELETE)만으로 표현.
- Resource 사이에 연관 관계 및 계층 관계가 있는 경우 slash(
/) 를 사용- 응답 Response 의 status code 기본 규칙을 따른다.
- REST하게 설계된 API는 client-server 분리와 함께 발달 했으며,
이로 인해 client-server 개별 부분의 발전에 다른 부분이 영향을 주지 않는다는 장점이 생겼다.- HTTP 통신 상태에 대한 정보를 따로 저장하거나 관리 하지 않는 것이 (state + less) REST의 특징이다. 이러한 특징은 cache를 발달시켰다. 특징요청에 관한 응답을 따로 저장함으로써 추후에 재사용이 가능해진다.
REST API : REST하게 API를 서술하는 방법
Representational State Transfer (REST)
상태(State)를 전달(Transfer)하는 것을 나타내는(Representation) 방법
자원을 이름(자원의 표현)으로 구분하여 해당 자원의 상태(정보)를 주고 받는 것
통신한다 = 특정 자원(데이터)을 어떤 방식으로 전달한다 라면
이를 표현하는 방식을 통일하여, 개발자들 사이에서 의사소통을 원활히 하자!

요청은 "무엇을 어떻게"의 방법이다.
(https://velog.io/@scroll0908/URI-URL-URN)
REST API의 역사
HTTP 개념 설립의 주요 저자 중 한 사람인 로이 필딩(Roy Thomas Fielding)은 당시 웹(HTTP) 설계의 우수성에 비해 널리 사용되지 못하는 현상을 안타까워함. 좋은 설계로 웹의 장점을 최대한 활용할 수 있어야 한다는 필요를 느끼고 웹 아키텍처인 REST를 설계하여 발표.
1996년부터 1999년까지 HTTP 1.0의 기존 디자인에 기반을 둔 HTTP 1.1와 병행하여 REST 구조의 스타일을 개발,
2000년도에 박사 학위 논문으로 REST 발표.
Self-descriptiveness
RESTful API는 그 자체만으로도 API의 목적이 쉽게 이해된다
| 요청 | RESTful API |
|---|---|
| user들의 정보를 get 하고자 함 | [GET] http://localhost:8000/users |
| starbucks에서 1번 beverages의 정보를 get 하고자 함 | [GET] http://starbucks.com/beverages/1 |
| starbucks에서 2번 beverage를 주문하고자 함 | [POST] http://starbucks.com/order - body {beverage:2} |
문서나 주석이 없이도 해석이 쉽다.
SOAP(Simple Object Access Protocl)
XML 기반의 메시지 전송 프로토콜.
REST와는 보안이나 메세지 전송 방식등이 다르다.
보편적인 웹 서비스보다는 기업 또는 특정 조직 내부에서 사용하기 적합하다.
특징
전세계에서 가장 보편화되어 사용되고 있는 웹 API 패러다임
SOAP은 프로토콜이고, REST는 api 설계 스타일이기 때문에,
두 개념을 독립적으로도 이해해야 한다.
| REST | SOAP | |
|---|---|---|
| 정의 | API 설계 스타일 | 프로토콜 |
| 작성 방식 | 리소스(데이터) 중심으로 묘사 | 행위, 기능 중심으로 서술 |
| 전송 데이터 | ⭐️여러가지 형태의 데이터 (html, json, text) | XML 데이터(고정) |
| 캐시 사용 | ⭐️가능, 효율적 | 불가, 비효율적 |
| ACID특성 | 없음 | 자체 기준 있음 |
![]() | ![]() |
⭐️보편적인 웹 서비스에서 SOAP이 아닌 HTTP를 통한 REST를 사용하는 이유
프로그램의 원활한 유지보수와, 개발자들 사이에서의 커뮤니케이션을 원활히 돕도록 만들어진 규칙
REST는 API를 설계할 때 자원을 중심으로 만드는 것이 원칙이다.
따라서 URI 자원으로 한정된 일관적인 인터페이스 (uniform interface)를 구현하는 것으로 자원 조작을 통일하는 것이 좋다.
HTTP를 구성하는 URL, HTTP method, Status Code를 통해 인터페이스를 구현한다.
URI는 동사를 제외한, 명사로 구성한다.
| BAD | GOOD |
|---|---|
| [GET] /find/users/1 | [GET] /users/1 |
| [POST] /insert/user/2 | [POST] /users/2 |
HTTP method (GET, POST, PUT, DELETE)만으로 표현한다.| BAD | GOOD |
|---|---|
| [DELETE] /delete/users/1 | [DELETE] /users/1 |
| [POST] /post/products | [POST] /products |
Resource 간 연관, 계층 관계는 slash(/) 를 사용한다.
ex) [GET] /users/{user_id}/profile
URI 마지막 문자로 /를 포함하지 않는다.
| BAD | GOOD |
|---|---|
| [GET] /users/portfolios/ | [GET] /users/portfolios |
-로 가독성을 높인다.| BAD | GOOD |
|---|---|
| [GET] /users/1/ordered_items | [GET] /users/1/ordered-items |
| BAD | GOOD |
|---|---|
| [GET] /users/1/profile-photo.jpg | [GET] /users/1/profile-photo |

데이터를 저장하는 데이터 스토리지 부분과, 이를 활용하고 서비스를 구동하는 유저 인터페이스를 분리하는 것.
클라이언트(프론트엔드)와 서버(백엔드)에서 개발해야할 내용이 명확해졌기 때문에 서로의 의존성이 줄어들었다.
👉 각자 신경써야 하는 개발 분야가 달라졌음(관심사의 분리), 독립적인 개발이 가능.
👉 개별 부분의 발전에 있어 다른 부분이 영향을 주지 않는다는 장점이 생김.
상태에 대한 정보를 따로 저장하거나 관리 하지 않는 것(state + less)
API서버는 들어오는 요청만을 단순히 처리,
요청에 대한 결과를 서버에 따로 저장하지 않기 때문에,
이미 로그인을 했는지, 이미 주문을 했는지 서버는 알지 못한다.
👉 서비스의 자유도가 높아지고,
👉 서비스 구현이 단순해짐.(불필요 정보 관리X)
코드의 가시성과 안정성 확보,
더 간편하게 확장될 수 있다.
서버가 세션 정보, 쿠키 정보 또한 별도로 저장하거나 관리하지 않기 때문에 클라이언트에서 상태 정보를 항상 전송. 👉 통신 비용이 높아짐.
Stateless에서 통신 비용이 높아짐을 해결하기 위한 정책
요청에 관한 응답을 따로 저장하여 추후에 재사용이 가능.
클라이언트-서버의 상호 작용을 제거 👉 성능 향상, 보다 확장성을 보장
추가적인 기능을 생성하는 것이 아닌 기존 웹 표준을 사용하기 때문에,
HTTP가 기본적으로 가지고 있는 캐시 정책을 사용할 수 있다.
요청에 대한 응답을 매번 갱신하는 것이 아니기 때문에,
캐시를 이용하여 데이터를 보여줄 경우 서버측에서 업데이트된 데이터가 반영되지 않고, 캐시된 데이터를 보여줄 경우 신뢰성을 감소시킬 우려가 있다.
예)
첫번재 요청 GET /v2/tasks/2
Reponse 200 OK
Last-Modified: Sun, 03 Apr 2016 16:09:23 GMT
두번째 요청 GET /v2/tasks/2
If-Modified-Since: Sun, 03 Apr 2016 16:09:23 GMT
Reponse 304 Not Modified
기존의 데이터를 그대로 사용한다(이건 구현에 따라서 달라질 수 있다)
여러 기능이 혼재된 인터넷 규모의 요구 사항을 향상시키기 위해서 레이어드 시스템을 지키며 설계되어 있다.
복잡한 여러 기능을 계층화 시켜서 한 기능씩 순차적으로 진행하는 것
서버가 네트워크를 통해 클라이언트에 전달한 javascript 등과 같은 프로그램들은 그 자체로 실행이 될 수 있어야 한다. 서버로부터 기능을 내려받아 클라이언트에서 바로 실행할 수 있어야 한다
👉 사전에 구현에 필요한 기능의 수를 줄여 클라이언트를 단순화할 수 있다.
code on demand 원칙은 client에 보내는 데이터를 바로 실행 가능한 코드의 형태도 보내어 client가 곧바로 실행하는 것.

