개발을 하다보면 한번쯤은 듣는 개념이다. 그때마다 매번 의미를 찾아보고 이해해보려하지만, 항상 잊어리는 녀석이라 이번에 제대로 정리해보려고 한다.
깊게 알아보기 전에 우선 단어로 접근해보자.

‘REST’라는 단어에 “~가득한, 아주 ~하는” 등의 의미를 나타내는 ‘ful’이라는 접미사가 붙은 형태이다.
해석하면 ‘아주 REST한 API’가 된다. 좀 더 알기 쉽게 의역하자면, REST의 원칙을 잘 따르는 API라는 의미이다.
결론적으로 REST를 이해하면 RESTful API를 이해할 수 있다.
REST(Representational State Transfer)란 월드 와이드 웹(WWW)과 같은 분산 하이퍼미디어 시스템을 위한 소프트웨어 아키텍처의 한 형식이다.
…
엄격한 의미로 REST는 네트워크 아키텍처 원리의 모음이다.
단순하게 말하자면 네트워크 아키텍처의 한 종류이다.
“Representational State Transfer”의 약자로 자원을 이름(자원의 표현)으로 구분하여 해당 자원의 상태(정보)를 주고 받는 모든 것을 의미한다.
즉, 자원의 표현에 의한 상태를 송수신하는 모든 행위들을 정의하는 것이다. 여기에서 “자원”, “표현”, “행위”는 REST를 구성하는 요소들을 의미한다.
위 세 가지 요소로 REST를 구체적으로 정의하면 다음과 같다.
HTTP URI(Uniform Resource Identifier)를 통해 자원(Resource)을 명시하고, HTTP Method(POST, GET, PUT, DELETE)를 통해 해당 자원에 대한 CRUD Operation을 적용하는 것을 의미한다.
JSON, XML 등의 표현으로 서버에 저장된 자원은 HTTP URI를 통해 조작할 수 있고, 해당 자원을 조작하는 행위는 HTTP Method로 정의된다는 것이다.
RESTful API를 이해하는데 구성 요소만큼 중요한 것이 원칙이다.
REST API, RESTful API는 “자원, 표현, 행위”들이 포함되고, 해당 원칙들을 충족하는 API인 것이다.
그럼, REST는 어떤 이유로 고안 되었을까?
그 이유는 다양한 클라이언트들의 등장으로 인한 애플리케이션 분리 및 통합을 위해서 였다.

서버 프로그램은 크롬, 엣지, 사파리 등 여러 종류의 브라우저에 더해 각기 다른 아키텍쳐로 구성된 모바일 디바이스를 대응할 필요가 있어졌다.
이러한 멀티 플롯폼에 대한 대응을 위해서 클라이언트/서버 간 사이에 설계된 아키텍쳐가 필요했고, REST에 수요가 증가한 것이다.
그럼 이러한 REST를 기반으로 고안된 REST API란 어떤 것일까?

API란 뭘까?
API는 정의 및 프로토콜 집합을 사용하여 두 소프트웨어 구성 요소가 서로 통신할 수 있게 하는 메커니즘입니다.
…
Application Programming Interface의 줄임말로, API의 맥락에서 애플리케이션이라는 단어는 고유한 기능을 가진 모든 소프트웨어를 나타내며, 인터페이스는 두 애플리게이션 간의 서비스 계약이라고 할 수 있습니다. 이 계약은 요청과 응답을 사용하여 두 애플리케이션이 서로 통신하는 방법을 정의합니다.
REST API는 REST 기반으로 구현된 서비스 API라는 의미이며, API의 정의에 의하면 클라이언트와 서버가 REST의 원칙이 따라 서로 통신하는 방법을 정의한 것이라고 할 수 있다.
REST API 설계 시 가장 중요한 항목은 다음 2가지로 요약할 수 있다.
이것만으로는 어려우니 구체적으로 알아보자.
GET /members/delete/1
위와 같은 방식은 REST를 제대로 적용하지 않은 URI이다. URI는 자원을 표현하는데 중점을 두어야 하며, delete와 같은 행위에 대한 표현이 들어가서는 안된다.
위의 잘못된 URI를 HTTP Method를 통해 수정해 보면
DELETE /members/1
다음과 같이 된다.
회원정보를 가져올 때는 GET, 회원 추가 할 때는 POST를 사용한다.
회원 정보 조회
GET /members/show/1 (x)
GET /members/1 (o)
회원 추가
GET /members/insert/2 (x) - GET 메서드는 리소스 생성에 맞지 않는다.
POST /members/2 (o)
[참고] HTTP Method는 다음과 같은 역할을 수행한다.
| Method | 역할 |
|---|---|
| POST | 해당 URI을 요청하면 리소스를 생성한다 |
| GET | 해당 리소스를 조회한다. 리소스를 조회하고 해당 document에 대한 자세한 정보를 가져온다. |
| PUT | 해당 리소스를 수정한다. |
| DELETE | 해당 리소스를 삭제한다. |
위와 같은 방식으로 URI은 자원, HTTP Method는 행위만을 정의하는 것이 REST API의 기본 규칙이다.
슬래시 구분자(/)는 계층 관계를 나타내는데 사용한다.
http://restapi.example.com/houses/apartments
URI 마지막 문자로 슬래시(/)를 포함하지 않는다.
http://restapi.example.com/houses/apartments/ (x)
http://restapi.example.com/houses/apartments (o)
하이픈(-)은 URI 가독성을 높이는데 사용한다.
밑줄(_)은 URI에 사용하지 않는다.
URI 경로에는 소문자가 적합하다.
파일확장자는 URI에 포함하지 않는다.
http://restapi.example.com/members/soccer/345/photo.jpg (x)
GET /member/soccer/345/photo HTTP/1.1 Host:restapi.example.com Accpet: image/jpg (o)
리소스 간에는 연관 관계가 있는 경우
GET : /users/{userid}/devices # (일반적으로 소유 'has'의 관계를 표현할 때)
[참고] 응답상태코드
- 1xx: 전송 프로토콜 수준의 정보 교환
- 2xx: 클라이언트 요청이 성공적으로 수행됨
- 3xx: 클라이언트는 요청을 완료하기 위해 추가적인 행동을 취해야 함
- 4xx: 클라이언트의 잘못된 요청
- 5xx: 서버쪽 오류로 인한 상태코드
그럼 RESTful API란 뭘까?
‘RESTful’은 아까 처음에 정의하였듯이 ‘아주 REST한’이라는 의미이다.
REST API에 확장된 개념으로 보다 REST를 REST 답게 쓰기 위한 개념이다.
‘이해하기 쉽고 사용하기 쉬운 REST API를 만드는 것’
RESTful한 API를 구현하는 근본적인 목적은 성능이 아닌 이해도 및 호환성을 높이는 것이다. 따라서, 성능이 중요한 상황에서는 굳이 RESTful한 API를 구현할 필요는 없다.
정작 중요한 RESTful API는 많이 다루지 않았는데, 그것은 본질적으로 REST API와 다르지 않기 때문이다. 그럼에도 RESTful한 것이 중요한 이유는 직관적인 소통을 위함에 있다. REST는 결국 좋은 소통을 위해 고안된 개념이다. REST를 RESTful하지 못하게 사용하는 것, 즉, 어렵게 REST를 사용하는 것은 복잡하게 소통하는 것이므로 REST를 사용하지 않는 것이나 다름없다. 그렇기 때문에 RESTful을 개념자체를 알고 이해하는 것이 중요하다. RESTful API이야말로 서버에서 쉽게 데이터에 액세스할 수 있는 웹 애플리케이션을 구축하는 가장 좋은 방법이기 때문이다.
Wikipedia, REST, https://ko.wikipedia.org/wiki/REST
heejeong Kwon, [Network] REST란, REST API란, RESTful이란?, https://gmlwjd9405.github.io/2018/09/21/rest-and-restful.html
팬도라, Jersey를 활용한 RESTful 이해하기, https://judo0179.tistory.com/13
The Postman Team, ‘What Is a REST API? Examples, Uses, and Challenges’, https://blog.postman.com/rest-api-examples/
aws, 애플리케이션 프로그래밍 인터페이스(API)란 무엇인가요?, https://aws.amazon.com/ko/what-is/api/