REST
>> 정의
REST (REpresentational State Transfer)는 웹 서비스가 어떻게 동작해야 하는지에 대한 아키텍쳐 스타일 또는 설계 원칙이다.
자원을 이름(자원의 표현)으로 구분해 해당 자원의 상태(정보)를 주고 받는 모든 것을 의미한다.
즉, 자원(resource)의 표현(representation)에 의한 상태 전달을 뜻한다.
REST는 기본적으로 웹의 기존 기술과 HTTP 프로토콜을 그대로 활용하기 때문에, 웹의 장점을 최대한 활용할 수 있다.
또한 클라이언트와 서버 간의 상호작용을 규정하며, 여러가지 원칙과 제약 조건들을 가지고 있다.
✨ 자원 : 해당 소프트웨어가 관리하는 모든 것 (문서, 그림, 데이터, 해당 소프트웨어 자체 등)
✨ 표현 : 자원을 표현하기 위한 이름 (DB의 학생 정보가 자원이면, ‘students’를 자원의 표현이라고 정함)
✨ 상태 전달 : 데이터가 요청되는 시점에 자원의 상태를 전달한다. (JSON 혹은 XML을 통해 데이터를 주고 받는 것이 일반적이다.)
>> 개념
어떠한 자원에 대하여 CRUD (Create, Read, Update, Delete) 연산을 수행하기 위해 URI (Resource) 로 GET, POST 등의 방식 Method를 사용하여 요청을 보내고, 그 요청을 위한 자원은 특정한 형태 (Representation of Resource)로 표현이 된다.
💡 여기서 URI란,
Uniform Resource Identifier 의 약자로 아래의 의미를 담고 있다.
Uniform : 리소스를 식별하는 통일된 방식,
Resource : 자원 즉 URI 로 식별할 수 있는 모든 것,
Identifier : 다른 항목과 구분하는데 필요한 정보
즉, 인터넷 상에서 자원을 구분하기 위한 통일된 방식 을 의미한다.
✨ URL vs URI URI는 아래의 그림과 같이 URL과 URN을 포괄하는 더 큰 범위이다.
여기서, URL과 URN은 다음과 같다.
URL (Uniform Resource Location) : 자원(리소스)이 있는 위치를 지정한다.
URN (Uniform Resource Name) : 자원(리소스)에 이름을 부여한다.
여기서 이름만으로 실제 리소스를 찾을 수 있는 방법이 보편화 되어 있지 않아 URN 은 잘 쓰이지 않는다.
따라서 URI가 URL 을 포함하고 있는 것이기에 URI를 URL과 같은 의미로 봐도 무방하다.
>> 구성요소
1.자원 (Resource) : URI
- 모든 자원에는 고유한 ID가 있고, 자원은 서버 (Server)에 존재한다.
- 자원을 구별하는 ID는 HTTP URI 이다.
(ex. ‘https://www.google.com/search?q=hello&hl=ko’) - 클라이언트는 URI 를 이용해 자원을 지정하고 해당 자원의 정보(상태)에 대한 조작을 서버에 요청한다.
2.행위 (Verb) : Method
- HTTP 프로토콜의 Method 를 사용한다.
- HTTP 프로토콜은 GET, POST, PUT, PATCH, DELETE의 Method를 제공한다.
GET | Read | - 리소스 조회 - 서버에 전달하고 싶은 데이터는 query (쿼리 파라미터, 쿼리 스트링)를 통해서 전달 |
POST | Create | - 요청 데이터 처리 - 메시지 바디를 통해 서버로 요청 데이터를 전달 - 주로 전달된 데이터로 신규 리소스 등록, 프로세스 처리에 사용함 |
PUT | Update | - 리소스가 있으면 완전히 대체, 없으면 생성(쉽게 이야기하면 덮어버린다는 뜻) - POST 와 차이점 : 클라이언트가 리소스 위치를 알고 URI 를 지정한다. |
PATCH | Update | - 리소스 부분만 변경 |
Delete | Delete | - 리소스 제거 |
3.표현 (Representation of Resource)
- 클라이언트와 서버가 데이터를 주고 받는 형태
(ex. JSON, XML, TEXT, RSS 등..) - 일반적으로 JSON, XML 사용
>> 특징
1.Client - Server (클라이언트 - 서버 구조)
(기존 HTTP만 사용해도 저절로 잘 지켜진다.)
- Request Response 구조
- 클라이언트는 서버에 요청을 보내고, 응답을 대기
- 서버가 요청에 대한 결과를 만들어서 응답
✨ 클라이언트-서버 구조로 이루어지면 양쪽이 각각 독립적으로 진행 할 수가 있게 된다!
2. Stateless (무상태)
(기존 HTTP만 사용해도 저절로 잘 지켜진다.)
- 서버가 클라이언트의 상태를 보존 X
- 즉, 클라이언트의 매 요청들이 독립적(다음 요청에 영향이 안감)이기 때문에 중간에 서버가 끊기거나 다른 서버로 바뀌어도 처리하는 데 문제가 발생하지 않는다.
- → 확장을 쉽게 할 수 있다. 즉, 무한한 서버 증설이 가능하다.
3. Cacheable (캐시 처리 가능)
(기존 HTTP만 사용해도 저절로 잘 지켜진다.)
- 웹 표준 HTTP 프로토콜을 그대로 사용하므로 웹에서 사용하는 기존의 인프라 그대로 활용
- HTTP 프로토콜 표준에서 사용하는 Last-Modified Tag 혹은 E-Tag를 이용해 캐싱을 구현한다.
- 대량의 요청을 효율적으로 처리할 수 있다.
4.Layered System (계층 구조)
(기존 HTTP만 사용해도 저절로 잘 지켜진다.)
- 클라이언트는 REST API 서버만 호출한다.
- REST API는 다중 계층으로 구성 될 수 있다.
- API 서버는 순수 비즈니스 로직을 수행한다.
- 보안, 로드 밸런싱, 암호화 등을 위한 계층을 추가해 구조를 변경 할 수 있다.
- Proxy, Gateway 와 같은 네트워크 기반의 중간 매체를 사용할 수 있다.
→ 클라이언트는 서버와 직접 통신하는지, 중간 서버 프록시 (Proxy)와 통신하는지는 알 수 없다.
5.Uniform Interface (인터페이스 일관성)
- URI로 지정한 Resource에 대한 요청을 통일되고, 한정적인 인터페이스로 수행한다.
- HTTP 표준 프로토콜에 따르는 모든 플랫폼에서 사용이 가능하다.
- → 특정 언어나 기술에 종속되지 않는다.
- REST에서 말하는 균일한 인터페이스를 얻으려면 아래의 4가지 제약을 따르면 된다.
- 리소스 식별 (Identification of Resources)
: 리소스가 URI로 식별 되는 것 - 표현을 통한 자원 조작 (Manipulation of Resource through Representations)
: 특정 리소스를 나타내는 URL을 바꾸지 않고도 표현(Representation)을 활용해서 리소스를 조작할 수 있다. - 자기 서술적인 메시지 (Self-descriptive message)
: 요청(request), 응답(response)과 같은 메시지는 그 자체만 보고
무슨 의미인지 파악할 수 있을 정도로의 정보가 담겨져 있어야 한다. - HATEOAS (hypermedia as the engine of application state)
: 애플리케이션의 상태가 Hyperlink를 이용해 전이되어야 한다.
- 리소스 식별 (Identification of Resources)
6.Code-On-Demand (Optional)
- 서버에서 코드를 클라이언트로 보내 실행 할 수 있어야 한다.
→ 서버로부터 받은 자바스크립트 파일을 클라이언트(브라우저)에서 실행 시킬 수 있다.
>> 장단점
- 장점
- 언어와 플랫폼에 독립적이다.
- REST API 메시지가 의도하는 바를 명확하게 나타내 의도를 쉽게 파악할 수 있다.
- REST가 지원하는 프레임워크나 언어 등 도구들이 없어도 구현 가능하다.
- HTTP를 사용하므로 기존 웹 인프라를 사용 가능하다.
- 서버와 클라이언트의 역할을 명확하게 분리한다.
- 여러 가지 서비스 디자인에서 생길 수 있는 문제를 최소화한다.
- 단점
- HTTP 프로토콜만 사용 가능하다.
- P2P 통신 모델을 가정하여 둘 이상을 대상으로 하는 분산 환경에 유용하지 않다.
- 보안, 정책 등에 대한 표준이 없다.
RESTful
>> 정의
RESTful란 일반적으로 REST라는 아키 텍쳐를 구현하는 웹 서비스를 나타내기 위해 사용되는 용어
→ ‘REST API’를 제공하는 웹 서비스를 ‘RESTful’하다고 할 수 있다.
RESTful은 REST를 REST답게 쓰기 위한 방법으로, 누군가가 공식적으로 발표한 것은 아니다!
→ 즉, REST 원리를 따르는 시스템은 RESTful이란 용어로 지칭 된다.
>> 목적
이해하기 쉽고 사용하기 쉬운 REST API를 만드는 것이다.
RESTful한 API를 구현하는 근본적인 주 목적은 성능 향상이 아니라 일관적인 컨벤션을 통한 API의 이해도 및 호환성을 높이는 것이므로 성능이 중요한 상황에서는 굳이 RESTful한 API를 구현할 필요는 없다.
* RESTful 하지 못한 경우 *
- CRUD 기능을 모두 POST로만 처리하는 API
- route에 resource, id 외의 정보가 들어가는 경우
→ ex) ‘/students/updateName’, …
REST API
💡 API (Application Programming Interface)란?
응용 프로그램에서 사용할 수 있도록 운영체제나 프로그래밍 언어가 제공하는 기능을 제어할 수 있게 만든 인터페이스를 의미한다. 즉, 프로그램들이 서로 상호 작용 하는 것을 도와주는 매개체라고 할 수 있다.
>> 정의
REST 기반으로 서비스 API를 구현한 것
최근 OpenAPI , 마이크로 서비스 등을 제공하는 업체 대부분은 REST API를 제공한다.
>> 특징
가장 큰 특징은 각 요청이 어떤 동작이나 정보를 위한 것인지 그 요청 자체로 추론이 가능하다는 것이다.
>> 디자인 가이드
REST API 설계 시 가장 중요한 대표 2가지
- URI는 정보의 자원을 표현해야 한다.
- 자원에 대한 행위는 HTTP Method (GET, POST, PUT, PATCH, DELETE)로 표현한다.
- → 행위는 URI에 포함 X
>> 설계 규칙
- URI는 명사를 사용한다. (리소스는 동사가 아닌 명사를 사용해야 한다.)
🚨 아래와 같은 동사 사용 X
/getAllUsers
/getUserById
/createNewUser
/updateUser
/deleteUser - 슬래시 (/)로 계층 관계를 표현한다.
- URI 마지막에 슬래시 (/)를 포함하지 않는다.
- 밑줄 ( _ )을 사용하지 않고, 하이픈 ( - ) 을 사용한다.
- URI는 소문자로만 구성한다.
- HTTP 응답 상태 코드 사용
클라이언트는 해당 요청에 대한 실패, 처리 완료 또는 잘못된 요청 등에 대한 피드백을 받아야 한다. - 파일 확장자는 URI에 포함하지 않는다.
EX) http://khyunji99.tistory.com/restapi/220/photo.jpg (X)
→ 참고 : https://dev-coco.tistory.com/97 , https://hahahoho5915.tistory.com/54#RESTful
→ REST api vs RESTful api 참고 : https://velog.io/@nosenal27/Rest-API-vs-Restful-API#rest-api-vs-restful-api
→ REST vs RESTful vs REST API 참고 : https://good-or-bad.tistory.com/45
'Studying' 카테고리의 다른 글
Thread (4) | 2024.01.30 |
---|---|
리다이렉트 (Redirect) (0) | 2024.01.02 |
HTTP 상태 코드 (2) | 2023.10.30 |
클라우드 서비스 개념 공부 (2) | 2023.07.17 |
코딩테스트_SQL공부(업데이트중) (2) | 2023.07.12 |