개요
REST와 RESTful의 차이가 문득 궁금해져서 정확한 개념 정리를 하기 위해서 정리하게 된 글이다.
1. REST란?
정의
사전적 의미는 다음과 같다.
- 웹에 존재하는 모든 자원에 고유한 URI를 부여해 활용하는 것
- 분산 하이퍼미디어 시스템을 위한 소프트웨어 아키텍처의 한 형
즉, REST란 HTTP URI를 통하여 자원을 명시하고 HTTP Method를 통해 해당 자원에 대한 CRUD 연산을 적용하는 방법이다.
* HTTP URI : 웹 사이트의 이미지, 텍스트, DB 내용 등의 모든 자원에 붙이는 고유한 ID
* CRUD : Create(생성) / Read(조회) / Update(수정) / Delete(삭제)
특징
0. HTTP 프로토콜의 형식을 그대로 활용한다.
웹의 장점을 최대한 활용할 수 있는 아키텍쳐 스타일이다.
1. 서버-클라이언트 구조로 상호 의존성을 줄인다.
서버 : API를 제공하고 API 요청 시 비즈니스 로직 처리와 데이터 저장을 책임진다.
클라이언트 : 사용자 인증, 상태(세션, 로그인 정보)관리와 서버 리소스 요청을 책임진다.
2. Stateless(무상태)이다.
서버는 작업을 위한 상태정보(세션, 쿠키 등)를 관리하지 않아야 함. 시스템 영향없이 관리 및 업데이트 가능
3. 캐시 처리가 가능하다.
HTTP가 가진 캐싱 기능이 적용되어 서버 응답 시간이 빨라지고 자원 이용률을 향상시킨다.
4. 계층화 (Layered System)
- 서버를 다중 계층으로 구성할 수 있다.
- 비지니스 로직을 수행하는 API 서버와 그 앞단에 사용자 인증, 암호화, 로드밸런싱 등의 계층을 추가해 구조상의 유연성 제공한다.
5. 인터페이스 일관성(Uniform interface)
아키텍처를 단순화하고 분리해 각 부분을 독립적으로 발전 시킬 수 있다.
구성요소
자원 (Resource) : 접근할 대상, URI를 통해 식별한다
예)
URI | 의미 |
http://api.domain.com/books/ | 도서정보 콜렉션 |
http://api.domain.com/books/1/ | 1번 도서 정보 |
http://api.domain.com/books/1/photo/ | 1번 도서의 사진 |
- 리소스 명은 books처럼 명사를 활용하여 어떤 자원인지 표현한다.
- 슬래시(/)는 계층 관계를 나타내는 것으로 컬렉션의 아이템을 지정하는 방식으로 정의한다. ex) books(컬렉션)/1(아이템)
행위 (Verb) : 리소스에 대한 행위, 표준 HTTP 메소드에 따라 자원에 접근한다.
예)
HTTP 메소드 | 행위 |
POST | 자원 생성(Create) |
GET | 자원 조회(Read) |
PUT | 자원 수정(Update) |
DELETE | 자원 삭제(Delete) |
메시지(Message) : REST에서 자원의 정보는 HTTP 바디, HTTP 헤더, 응답 상태코드를 활용하여 표현한다
HTTP 바디
- HTTP 바디에 포함된 데이터를 통해 자원에 대한 정보를 전달한다.
- 데이터 포맷으로는 JSON, XML 등이 있다.
HTTP 헤더
- HTTP 바디의 컨텐츠 종류를 명시한다.
- 요청 HTTP 해더는 "Accept" 항목으로, 응답 HTTP 해더는 "Content-type"으로 컨텐츠 타입을 설명한다.
응답 상태코드
- 리소스 요청에 대한 응답은 응답 상태 코드로 설명된다.
예) 400 - 요청이 부적절함 / 200 - 요청 정상 수행
장단점
장점
1. 기존의 웹 인프라를 그대로 이용할 수 있다.
2. HTTP 프로토콜의 표준을 그대로 사용하여 여러 추가적 장점을 가져갈 수 있다.
3. REST API 메시지가 의도하는 바를 명확하게 나타내므로 의도하는 바를 쉽게 파악할 수 있다
단점
1. 표준이 존재하지 않아 관리가 어렵다.
2. HTTP Method의 형태가 제한적이다.
2. REST API란?
정의
REST를 기반으로 구현한 서비스 API이다.
예) 네이버 지도의 API를 사용할 때 REST를 이용해서 사용하는 것이 REST API 이다.
핵심 규칙
1. URI는 정보의 자원을 표현해야 한다.
2. 자원에 대한 행위는 HTTP Method(GET, POST, PUT, DELETE)로 표현한다.
세부 규칙
1. 슬래시 구분자 ( / )는 계층 관계를 나타내는데 사용한다.
2. URI 마지막 문자로 슬래시 ( / )를 포함하지 않는다.
- 즉 URI에 포함되는 모든 글자는 리소스의 유일한 식별자로 사용되어야 하며 URI가 다르다는 것은 리소스가 다르다는 것
- 역으로 리소스가 다르면 URI도 달라져야 한다.
3. 하이픈 ( - )은 URI 가독성을 높이는데 사용한다.
4. 밑줄 ( _ )은 URI에 사용하지 않는다.
5. URI 경로에는 소문자가 적합하다.
- URI 경로에 대문자 사용은 피하도록 한다.
6. 파일확장자는 URI에 포함하지 않는다.
- REST API 에서는 메시지 바디 내용의 포맷을 나타내기 위한 파일 확장자를 URI 안에 포함시키지 않는다.
- 대신 Accept Header 를 사용한다.
- ex) GET: http://restapi.exam.com/orders/2/Accept: image/jpg
7. 리소스 간에 연관 관계가 있는 경우
- /리소스명/리소스ID/관계가 있는 다른 리소스 명
- ex) GET: /users/2/orders (일반적으로 소유의 관계를 표현할 때 사용)
3. RESTful이란?
- REST 원리를 따르는 시스템은 RESTful이란 용어로 지칭된다.
예) REST API’를 제공하는 웹 서비스를 RESTful하다고 한다.
- REST를 REST답게 쓰기 위한 방법이라고 할 수 있다.
Ref
https://gmlwjd9405.github.io/2018/09/21/rest-and-restful.html
https://tech.devgear.co.kr/delphi_news/433404
https://code-lab1.tistory.com/194