> For the complete documentation index, see [llms.txt](https://toothlessdev.gitbook.io/main/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://toothlessdev.gitbook.io/main/web-develop/web/rest-api-rest.md).

# REST API 의 REST 는 무엇인가 ?

## 📖 REST API ?

REST API 는 REpresentational State Transfer API 로, 웹 서비스에서 통신하는데 사용되는 소프트웨어 인터페이스입니다.

### ✏️ API 란 ?

> API 는 Application Programming Interface 로  애플리케이션을 만들고 통합하기 위한 프로토콜 입니다

정보를 제공하는 Provider 와 제공받는 Consumer 사이 규칙이라고 할 수 있습니다.

애플리케이션 / 컴퓨터 / 시스템 ... 과 상호작용하여 기능을 만들거나 수행할때, API 를 통해 해당 시스템에 원하는 내용, 요청을 전달하고 응답을 받을 수 있습니다.

### ✏️ REST ?&#x20;

**자원 Resource 를 이름으로 구분**하여, 해당 자원의 상태를 주고 받는것을 의미합니다.\
모든 자원은 고유한 식별자를 가지고 있고, 이런 자원은 URI 를 통해 식별됩니다.

> REST is a set of architectural constraints, not a protocol or a standard\
> REST 는 프로토콜이나 표준이 아닌 아키텍쳐 제약조건입니다.

따라서 개발자는 REST API 를 다양한 방식으로 구현할 수 있는데,

RESTful API 를 통해 클라이언트의 요청을 받으면,\
HTTP (JSON, HTML, XML, TEXT ... ) 를 통해 엔드포인트로 전송됍니다.

### ✏️ RESTful API ?

API 가 RESTful 하려면

1. 요청이 <mark style="background-color:orange;">**HTTP 를 통해 관리되는 Client-Server 아키텍쳐**</mark>이어야 합니다.
2. Client-Server 통신 사이에 상태는 <mark style="background-color:orange;">**Stateless**</mark> 해야합니다. 즉 요청 사이에 Client 정보는 저장되지 않고, 각 요청이 별도로 연결되지 않습니다. (서버가 클라이언트의 상태를 저장하지 않는다는 의미) \
   서버는 각 요청을 독립적으로 처리할 수 있어 확장성이 향상됩니다.
3. Client-Server 사이에 상호작용을 줄일 수 있는 <mark style="background-color:orange;">**Cacheable**</mark> 한 데이터이어야 합니다.
4. 시스템의 각 구성 요소 간에 <mark style="background-color:orange;">**일관된 인터페이스 Uniform Interface**</mark> 를 유지해야합니다.\
   (Client-Server 통신에서 데이터 형식 등이 일관되게 유지되어야 한다는 의미)
5. RESTful API 의 시스템은 <mark style="background-color:orange;">**계층화 Layered System**</mark> 되어, 독집적으로 구현될 수 있어야 합니다.

정리하면 RESTful API 는&#x20;

> Server-Client 구조를 가지고 있으며,\
> Stateless, 서버는 클라이언트의 상태를 저장하지 않고,\
> Cacheable, 클라이언트와 서버 사이에 상호작용을 줄일수 있는 캐시가능한 데이터이며,\
> Uniform Interface, 클라이언트와 서버 사이 통신에서 데이터 형식 등이 일관되어야 하며,\
> Layered System, 시스템이 계층화되어 독립적으로 구현될 수 있어야 합니다

## 📖 REST API 의 구성요소

### ✏️ Resource (자원)

HTTP URI 식별자로 구성됩니다.

### ✏️ Verb (자원에 대한 행위)

HTTP Method 로 식별됩니다.\
GET, POST, PUT, PATCH, DELETE 가 있습니다.

### ✏️ Representation (자원에 대한 행위의 내용)

HTTP Message Payload 즉 Body 로 식별됩니다.

## ❗️ 정리

REST ? : HTTP URI를 통해 자원을 명시하고, HTTP Method 를 통해 해당 자원에 대한 CRUD 를 적용하는 것

## ❓ 의문점

> Q. RESTful API 는 Stateless 해야하는데, 즉 서버가 클라이언트의 상태를 저장하지 않는다. 그렇다면 토큰을 사용하지 않고 Session 을 사용한 인증은 RESTful API 가 아닌가 ?
>
> A. Session 을 사용한 인증 방식은 Stateless 하지 않다. 따라서 Session 보다 Token 을 사용하는 방식이 확장성에 용이하다.

## 🔗 참고자료

<https://www.redhat.com/en/topics/api/what-is-a-rest-api>

<https://khj93.tistory.com/entry/%EB%84%A4%ED%8A%B8%EC%9B%8C%ED%81%AC-REST-API%EB%9E%80-REST-RESTful%EC%9D%B4%EB%9E%80>

<https://ko.wikipedia.org/wiki/REST>

<https://velog.io/@somday/RESTful-API-%EC%9D%B4%EB%9E%80>

<https://aws.amazon.com/ko/what-is/restful-api/>

\ <br>
