
REST란 무엇인가?
REST (Representational State Transfer: 자원의 상태 전달)
- 말 그대로 자원(Resource)을 표현(Representation)으로 구분하여 상태를 주고 받는 것(Transfer-Verb)으로, 웹의 장점을 최대한 활용하기 위해 쓰이는 아키텍쳐 스타일이다.
REST API(Application Programing Interface)
-REST 기반으로 API를 구현한 것.
RESTful
- REST의 조건을 잘 갖춘 웹 서비스를 일컫는 용어로 주로 REST API를 제공하는 웹서비스를 RESTful 하다고 표현합니다.
REST의 구성요소
(1) 자원(Resource) - URI(Uniform Resouce Identifier)
- 특정 자원의 식별자(Identifier)이다. e.g) '/study/rest_api'
- 자원은 서버에 존재하며, 클라이언트는 URI 로 자원을 지정하여 조작을 서버에 요청한다.
# URL (Uniform Resource Locator) 와의 차이점은?
-URL은 특정 자원(URI로 식별할 수 있는 자원)에 접근할 수 있는 위치(locator), 즉 파일 식별자를 일컫는다.
e.g.) https://www.ellie-yoon.tistory.com/study/rest-api.pdf
-따라서 URL 은 URI 의 하위 개념이다.
(2) 표현(Representation)
- 클라이언트가 자원을 지정하여 조작을 서버에 요청하면, 서버는 적절한 응답을 보낸다.
- 자원의 형태는 XML, JSON, TEXT 로 다양하다. (JSON이 더 자주 쓰인다)
(3) 행위(Verb) - HTTP Method(GET, POST, PUT, DELETE)
- 자원에 행해지는 행위는 HTTP Method에 의해 일어난다.
- HTTP Method 는 GET, POST, PUT, DELETE 등이 있으며 이를 통해 CRUD (Create, Read, Update, Delete) Operations 을 할 수 있다.
[Resource] URI 설계 원칙
- 계층관계에서 슬래시 구분자(/) 사용 e.g) https://ellie-yoon.tistory.com/web/spring
- 소문자 사용
- 언더바(_) 대신 하이픈(-) 사용 e.g) https://ellie-yoon.tistory.com/web/rest-api
- URI 마지막에는 슬래시 포함하지 않음
- 프로그래밍의 메소드명(행위)는 포함하지 않음 e.g) https://ellie-yoon.tistory.com/web?action='sth'
- 파일 확장자는 URI에 포함하지 않음 e.g) https://ellie-yoon.tistory.com/web/index.jsp
- 명사형을 사용하되, 컨트롤러를 일컫을 때는 예외적으로 동사 허용 e.g) https://ellie-yoon.tistory.com/book/order
- 명사에 단수형보다는 복수형으로 사용 e.g) https://ellie-yoon.tistory.com/web/courses
- 세션 ID 는 포함하지 않음 e.g) https://ellie-yoon.tistory.com/web?session-id=ellie
- CRUD 기능을 나타내는 이름은 URI에 사용하지 않음
- 일관성있게 서브 도메인을 사용한다. e.g.) (1) https://ellie-yoon.tistory.com/ (2) https://rest-api.ellie-yoon.tistory.com/
URI 정의와 설계원칙은 아래 링크에서 자세하게 확인이 가능하다.
https://datatracker.ietf.org/doc/html/rfc3986
[Verb] HTTP Method
| 의미 | CRUD | 멱등성 | 안전성 | Path Variable |
Query Parameter |
Data Body |
|
| GET | 리소스 취득 | R | O | O | O | O | X |
| POST | 리소스 생성 | C | X | X | O | 권장X | O |
| PUT | 리소스 갱신 | C/U | O | X | O | 권장X | O |
| DELETE | 리소스 삭제 | D | O | X | O | O | X |
| HEAD | 헤더 데이터 취득 | - | O | ||||
| OPTIONS | 지원하는 메소드 취득 | - | O | ||||
| TRACE | 요청메세지 반환 | - | O | ||||
| CONNECT | 프록시 동작의 터널 접속으로 변경 | - | X |
이 HTTP Method들은 다음과 같은 URI 형태로 사용되어 진다.
GET: 사용자 정보 요청(READ)
http://ellie.com/user/1
POST: 사용자 정보 생성(CREATE)
http://ellie.com/user
PUT: 사용자 정보 생성 및 업데이트(CREATE OR UPDATE)
http://ellie.com/user/1
DELETE: 사용자 정보 삭제
http://ellie.com/user/1
REST API 특징
(1) Server-Client (서버-클라이언트)
: 서버와 클라이언트의 독립적인 구조로 서로간의 의존성을 낮춤.
(2) Stateless (무상태성)
: 클라이언트의 상태정보를 따로 저장하지 않고 (세션 정보나 쿠키를 별도 저장 관리 X) 서버로 들어오는 요청만 단순 처리함.
(3) Cacheable (캐시 처리 가능)
: 클라이언트는 서버의 응답을 임시저장(Cache)하고, Cache를 통한 응답의 재사용을 하여 서버의 부하를 낮춤. Last-Modified 태그나 E-Tag 태그 를 사용하여 HTTP의 캐싱 기능 사용가능.
(4) Layered System (계층형 구조)
: REST 서버는 다중 계층으로 구성이 가능하여, 구조상으로 유연하며 확장가능함.
(5) Uniform Interface (인터페이스 일관성)
: URI로 지정 자원의 조작을 통일하고, 한정적인 인터페이스로 수행하여 일관성을 유지 및 아키텍처를 단순화가능.
(6) Code on Demand (Optional)
: 옵셔널한 특징, 서버로 부터 자바 애플릿, 자바스크립트, 플래시 등 특정 기능을 Client 가 전달받아 실행하는 것
References
https://meetup.toast.com/posts/92
https://gmlwjd9405.github.io/2018/09/21/rest-and-restful.html