"Representational State Transfer(대표적인 상태 전달)"의 약자
월드 와이드 웹(www)과 같은 분산 하이퍼미디어 시스템을 위한 소프트웨어 개발 아키텍처의 한 형식
REST는 기본적으로 웹의 기존 기술과 HTTP 프로토콜을 그대로 활용하기 때문에
웹의 장점을 최대한 활용할 수 있는 아키텍처 스타일이다.
REST는 네트워크 상에서 Client와 Server 사이의 통신 방식 중 하나이다.
HTTP URI(Uniform Resource Identifier)를 통해 자원(Resource)을 명시하고, HTTP Method(Post, Get, Put, Delete)를 통해 해당 자원에 대한 CRUD Operation을 적용하는 것을 의미한다.
즉, REST는 자원 기반의 구조(ROA, Resource Oriented Architecture) 설계의 중심에 Resource가 있고
HTTP Method를 통해 Resource를 처리하도록 설계된 아키텍쳐를 의미한다.
웹 사이트의 이미지, 텍스트, DB 내용 등의 모든 자원에 고유한 ID인 HTTP URI를 부여한다.
여러 가지 서비스 디자인에서 생길 수 있는 문제를 최소화해준다.
Hypermedia API의 기본을 충실히 지키면서 범용성을 보장한다.
Hypermedia API
어디서 어디로 전이가 가능한지 미리 결정되지 않는다.
어떤 상태로 전이가 완료되고 나서야 그 다음 전이 될 수 있는 상태가 결정된다.
링크가 동적으로 변경될 수 있음.
HTTP 프로토콜의 표준을 최대한 활용하여 여러 추가적인 장점을 함께 가져갈 수 있게 해준다.
브라우저를 통해 테스트할 일이 많은 서비스라면 쉽게 고칠 수 있는 URL보다
Header 값이 왠지 더 어렵게 느껴진다.
구형 브라우저가 아직 제대로 지원해주지 못하는 부분이 존재한다.
- PUT, DELETE를 사용하지 못하는 점
- pushState를 지원하지 않는 점
pushState
HTML 문서에서 브라우저의 세션 기록 스택에 상태를 추가하는 history 내부 메서드
history.pushState(state, title[, url]);
pushState() 호출 이후에 브라우저는 주어진 URL로 탐색하지 않는다.
SPA (Single Page Application)의 페이지 전환을 구현할 수 있다.
- '애플리케이션 분리 및 통합'
- '다양한 클라이언트의 등장'
즉, 최근의 서버 프로그램은 다양한 브라우저와 안드로이폰, 아이폰과 같은
모바일 디바이스에서도 통신을 할 수 있어야 한다.
- 자원(Resource): URI
- 모든 자원에 고유한 ID가 존재하고, 이 자원은 Server에 존재한다.
- 자원을 구별하는 ID는 '/groups/:group_id'와 같은 HTTP URI 다.
- Client는 URI를 이용해서 자원을 지정하고 해당 자원의 상태(정보)에 대한 조작을 Server에 요청한다.
- 행위(Verb): HTTP Method
- HTTP 프로토콜의 Method를 사용한다.
- HTTP 프로토콜은 GET, POST, PUT, DELETE, HEAD 와 같은 메서드를 제공한다.
- 표현(Representation of Resource)
- Client가 자원의 상태(정보)에 대한 조작을 요청하면 Server는 이에 적절한 응답(Representation)을 보낸다.
- REST에서 하나의 자원은 JSON, XML, TEXT, RSS 등 여러 형태의 Representation으로 나타내어 질 수 있다.
- JSON 혹은 XML를 통해 데이터를 주고 받는 것이 일반적이다.
Server-Client(서버-클라이언트 구조)
사용자들에게 제공하는 interface인 User Interface와 데이터 스토리지, 알고리즘 등 서버 내부의 작업들을 분리함으로 써 User Interface는 여러 플랫폼에서의 이식성을 향상될 수 있으며, 서버는 그 구성요소를 단순화하여 확장성을 단순화할 수 있습니다.
클라이언트와 서버가 서로 의존하지 않고 별도로 진화할 수 있습니다. 클라이언트는 서버의 리소스 URI만 알고 있으면 되기 때문입니다.
Stateless(무상태)
- 클라이언트에서 서버로의 각 요청에는 그 요청을 이해하는 데 필요한 모든 정보가 포함되어야 한다.
서버에 저장된 환경 정보를 이용해서 이득[서버에서의 클라이언트 정보 유지 등]을 취하면 안 된다.
따라서 세션의 정보는 전적으로 클라이언트가 가지고 있어야 한다.- 로그인했다는 세션 유지가 필요하다면 그 정보 또한 Client가 해당 정보를 가지고 서버에 전달해야 한다. [ex) JWT 등을 사용]
Cacheable(캐시 처리 가능)
- 요청에 대한 응답 내의 데이터에 해당 요청은 캐시가 가능한지 불가능 한지 명시해야 합니다.
응답을 캐시 할 수 있다면 클라이언트에서 동일한 요청이 왔을 때 응답 데이터를 재사용할 수 있어야 한다.- cache-control 헤더를 통하여 캐시 여부 명시
Layered System(계층화)
- 계층화된 시스템 아키텍처를 사용하여
각 구성들 간의 계층을 마음대로 상호작용 할 수 없도록 제한함으로 써 Interface를 일원화한다.
Code-On-Demand(optional)
- 서버가 네트워크를 통해 클라이언트에 전달한 javascript 등과 같은 프로그램들은
그 자체로 실행이 될 수 있어야 한다.
이것은 사전 구현에 필요한 기능의 수를 줄임으로써 클라이언트를 단순화한다.- 이 말은 우리가 평소에는 정적인 데이터를 xml 또는 json에 담아서 client로 보내고 client가 이것을 가공합니다. 하지만 code on demand라는 것은 client에 보내는 데이터를 바로 실행 가능한 코드를 보내서 이것을 Client에서 실행하는 것을 말합니다.
Uniform Interface(인터페이스 일관성)
전체적인 시스템 아키텍처를 간단하고 잘 파악할 수 있도록 하기 위한 약속된 Interface,
해당 규약을 REST를 사용자들이 지킴으로써
추후에 사용하는 Client를 개발하는 사용자와 Server를 개발하는 사용자 간의 결합도가 낮아질 수 있다(Decoupling).개발 REST는 인터페이스 일관성 제약 조건으로 4가지를 제시한다.
- identification of resources
- manipulation of resources through representations
- self-descriptive messages
- HATEOS (hypermedia as the engine of application state)
REST 기반으로 서비스 API를 구현한 것
최근 OpenAPI(누구나 사용할 수 있도록 공개된 API: 구글 맵, 공공 데이터 등),
마이크로 서비스(하나의 큰 애플리케이션을 여러 개의 작은 애플리케이션으로 쪼개어
변경과 조합이 가능하도록 만든 아키텍처) 등을 제공하는 업체 대부분은 REST API를 제공한다.
사내 시스템들도 REST 기반으로 시스템을 분산해 확장성과 재사용성을 높여
유지보수 및 운용을 편리하게 할 수 있다.
REST는 HTTP 표준을 기반으로 구현하므로,
HTTP를 지원하는 프로그램 언어로 클라이언트, 서버를 구현할 수 있다.
즉, REST API를 제작하면 델파이 클라이언트 뿐 아니라,
자바, C#, 웹 등을 이용해 클라이언트를 제작할 수 있다.
- URI는 정보의 자원을 표현해야 한다.
- resource는 동사보다는 명사를 사용한다.
- resource는 영어 소문자 복수형을 사용하여 표현한다.
- Ex)
GET /Member/1
->GET /members/1
- 자원에 대한 행위는 HTTP Method(GET, PUT, POST, DELETE 등)로 표현한다.
- URI에 HTTP Method가 들어가면 안된다.
- Ex)
GET /members/delete/1
->DELETE /members/1
- URI에 행위에 대한 동사 표현이 들어가면 안된다.
- Ex)
GET /members/show/1
->GET /members/1
- Ex)
GET /members/insert/2
->POST /members/2
- 슬래시 구분자(/ )는 계층 관계를 나타내는데 사용한다.
- Ex)
http://restapi.example.com/houses/apartments
- URI 마지막 문자로 슬래시(/ )를 포함하지 않는다.
- URI에 포함되는 모든 글자는 리소스의 유일한 식별자로 사용되어야 하며 URI가 다르다는 것은 리소스가 다르다는 것이고, 역으로 리소스가 다르면 URI도 달라져야 한다.
- REST API는 분명한 URI를 만들어 통신을 해야 하기 때문에 혼동을 주지 않도록 URI 경로의 마지막에는 슬래시(/)를 사용하지 않는다.
- Ex)
http://restapi.example.com/houses/apartments/ (X)
- 하이픈(- )은 URI 가독성을 높이는데 사용
- 불가피하게 긴 URI경로를 사용하게 된다면 하이픈을 사용해 가독성을 높인다.
- 밑줄(_ )은 URI에 사용하지 않는다.
- 밑줄은 보기 어렵거나 밑줄 때문에 문자가 가려지기도 하므로 가독성을 위해 밑줄은 사용하지 않는다.
- URI 경로에는 소문자가 적합하다.
- URI 경로에 대문자 사용은 피하도록 한다.
- RFC 3986(URI 문법 형식)은 URI 스키마와 호스트를 제외하고는 대소문자를 구별하도록 규정하기 때문
- 파일확장자는 URI에 포함하지 않는다.
- REST API에서는 메시지 바디 내용의 포맷을 나타내기 위한 파일 확장자를 URI 안에 포함시키지 않는다.
- Accept header를 사용한다.
- Ex)
http://restapi.example.com/members/soccer/345/photo.jpg (X)
- Ex)
GET / members/soccer/345/photo HTTP/1.1 Host: restapi.example.com Accept: image/jpg (O)
- 리소스 간에는 연관 관계가 있는 경우
- /리소스명/리소스 ID/관계가 있는 다른 리소스명
- Ex)
GET : /users/{userid}/devices (일반적으로 소유 ‘has’의 관계를 표현할 때)
- :id는 하나의 특정 resource를 나타내는 고유값
- Ex) student를 생성하는 route: POST /students
- Ex) id=12인 student를 삭제하는 route: DELETE /students/12
RESTful은 일반적으로 REST라는 아키텍처를 구현하는 웹 서비스를 나타내기 위해 사용되는 용어이다.
즉, REST 원리를 따르는 시스템은 RESTful이란 용어로 지칭된다.
RESTful은 REST를 REST답게 쓰기 위한 방법으로, 누군가가 공식적으로 발표한 것이 아니다.
이해하기 쉽고 사용하기 쉬운 REST API를 만드는 것
RESTful API를 구현하는 근본적인 목적이 퍼포먼스 향상에 있는게 아니라,
일관적인 컨벤션
을 통한API의 이해도
및호환성
을 높이는게 주 동기이니,퍼포먼스가 중요한 상황에서는 굳이 RESTful API를 구현하실 필요는 없다.
Ex1) CRUD 기능을 모두 POST로만 처리하는 API
Ex2) route에 resource, id 외의 정보가 들어가는 경우(/students/updateName)