- HTTP를 기반으로 클라이언트가 서버의 리소스에 접근하는 방식을 규정한 아키텍쳐
- REST 기본 원칙을 성실히 지킨 서비스 디자인을
RESTful
이라고 표현
- 구성 요소 상호작용의 규모 확장성
- 클라이언트와 서버 간의 느슨한 결합을 유지하고 서버의 부하 분산, 확장성, 가용성을 향상시키는 방법 제공
- 인터페이스의 범용성
- HTTP와 같은 기존 웹 표준을 기반으로 하며, 일반적으로 사용되는 HTTP메서드와 URI를 활용하여 리소스 식별 및 조작 가능
- 구성요소의 독립적인 배포
- 클라이언트와 서버간의 역할을 명확하게 분리하여 독립적으로 배포될 수 있는 구성 요소를 지향
- 시스템의 확장성과 유연성을 높이며 각 구성요소의 변경이 다른 구성 요소에 영향을 미치지 않도록 함
- 중간적 구성요소를 이용해 응답 지연 감소, 보안을 강화, 레거시 시스템을 인캡큘레이션
- 중간적 구성요소는 캐싱, 로드 밸런싱, 인증, 암호화 등의 기능을 수행하며 클라이언트와 서버 사이에서 중개자 역할을 수행
- REST API는 REST를 기반으로 서비스 API를 구현한 것
- 자원, 행위, 표현의 3가지 요소로 구성
- REST는 자체 표현 구조로 구성되어 REST API만으로 HTTP 요청 내용을 이해할 수 있음
자체 표현 구조(Self-descriptiveness)
- API 메시지 자체만 보고도 API를 이해할 수 있는 것.
- 리소스와 메서드를 이용해서 어떤 메서드에 무슨 행위를 하는지를 알 수 있음.
- 메시지 포맷 역시 JSON을 이용해서 직관적으로 이해가 가능한 구조.
구성요소 | 내용 | 표현방법 |
---|---|---|
자원 | 자원 | URI (엔드포인트) |
행위 | 자원에 대한 행위 | HTTP 요청 메서드 |
표현 | 자원에 대한 행위의 구체적 내용 | 페이로드 |
//bad ; 동사 사용
GET /getTodos/1
GET /todos/show/1
// good ; 명사 사용
GET /todos/1
- HTTP 요청 메서드는 클라이언트가 서버에게 요청의 종류와 목적을 알리는 방법
- 리소스에 대한 행위는 URI에 표현하지 않고, HTTP메서드를 통해 표현
// bad ; HTTP 요청 메서드는 GET, URI에 delete 표현
GET /todos/delete/1
// good ; HTTP 요청 메서드에 delete 행위 표현
DELETE /todos/1
- MIME 타입은 페이로드의 유형을 식별하기 위해 사용되는 미디어 타입을 지정
- 페이로드가 필요없는 GET, DELETE 메서드를 제외한 POST, PUT, PATCH 요청 시
setRequestHeader 메서드를 사용하여 요청 몸체에 담아 서버로 전송할 페이로드의 MIME타입 지정 - 보통 타입/서브타입 의 형식을 가지며, 페이로드가 어떤 종류의 데이터인지 명시
1-3-1. 타입 예시
- text/plain: 일반 텍스트 데이터
- text/html: HTML 문서
- image/jpeg: JPEG 이미지 파일
- image/png: PNG 이미지 파일
- audio/mp3: MP3 오디오 파일
- video/mp4: MP4 비디오 파일
- application/json: JSON 데이터
1-3-2. 예시 코드
// XMLHttpRequest 객체 할당
const xhr = new XMLHttpRequest();
xhr.open('POST','/todos');
// XHR 객체의 setRequestHeader 메서드를 호출하여 content-type 요청 헤더를 설정. 서버에게 전송되는 데이터의 유형이 JSON 형식이므로 다음과 같이 설정
xhr.setRequestHeader('content-type', 'application/json');
// XHR 객체의 send 메서드 호출하여 실제 데이터를 서버로 전송
// 이 때 JSON.stringify를 사용하여 자바스크립트 객체를 JSON문자열로 변환한 후 해당 문자열을 전송
xhr.send(JSON.stringify({id:4, content: 'Angular', completed: false}));
xhr.onload=()=>{
// XHR 객체의 onload 이벤트 정의,
// 요청이 성공적으로 완료된 경우 발생
}
자바스크립트 딥다이브
위키백과 REST - https://ko.wikipedia.org/wiki/REST
MDN REST - https://developer.mozilla.org/ko/docs/Glossary/REST
MDN MIME - https://developer.mozilla.org/ko/docs/Web/HTTP/Basics_of_HTTP/MIME_types