분산 하이퍼 미디어 시스템을 위한 SW 개발 아키텍처의 한 형식이다. 네트워크 상에서 Client-Server 간 통신 방식
중 하나로, 웹의 장점을 최대한 활용할 수 있는데, 이는 웹의 기존 기술과 HTTP 프로토콜을 그대로 활용하기 때문이다.
REST는 Representational State Transfer의 약자로, 자원을 이름
으로 구분하여 해당 자원의 상태
를 주고 받는 모든 것을 의미한다.
자원(resource)의 표현(representation)
- 자원을 표현하기 위한 이름을 말한다. 예를 들어, DB의
학생 정보
가 자원일 때,'students'
를 자원의 표현으로 정한다.
상태 전달 (정보 전달)
- 데이터가 요청되어지는 시점에서 자원의 상태를 전달한다.
JSON
혹은XML
을 통해 주고 받는 것이 일반적이다.
REST는 자원 기반의 구조(ROA, Resource Oriented Architecture) 설계인데, 중심에 자원
이 있다. 이 자원을 HTTP URI
*를 통해 명시하고, HTTP Method
를 통해 처리하도록 설계되었다. 처리할 때는 CRUD Operation
**을 적용한다.
* 웹 사이트에 대한 이미지, 텍스트, DB 내용 등의 모든 자원에 고유한 ID인 HTTP인 URI를 부여한다.
** CRUD Operation
Create
: 생성 (= POST)Read
: 조회 (= GET)Update
: 수정 (= PUT)Delete
: 삭제 (= DELETE)HEAD
: header 정보 조회 (= HEAD)
REST 기반으로 서비스 API를 구현한 것을 말한다. 요즘 Open API는 대부분 REST API를 제공한다.
URI
는 자원의 정보
를 표시해야한다.
GET /members/1
명사
, 대문자보다는 소문자
.단수 명사
.복수 명사
.복수 명사
.리소스 원형
- 도큐먼트 : 객체 인스턴스나 데이터베이스 레코드와 유사한 개념
- 컬렉션 : 서버에서 관리하는 디렉터리라는 리소스
- 스토어 : 클라이언트에서 관리하는 리소스 저장소
자원에 대한 행위는 HTTP Method
로 표현한다.
a. URI에 HTTP Method가 들어가면 안된다.
GET /members/delete/1
→ DELETE /members/1
b. URI에 행위에 대한 동사 표현이 들어가면 안된다. (즉, CRUD 기능을 나타내는 것은 URI에 사용하지 않는다.)
GET /members/show/1
→ GET /members/1
GET /members/insert/2
→ POST /members/2
c. 경로에서 변하는 값(부분)은 유일한 값으로 대체한다. (ex. id 등)
POST /studnets
DELETE /students/12
슬래시 구분자(/
)는 계층 관계
를 나타내는데 사용한다.
URI 마지막 문자로 슬래시(/
)를 포함하지 않는다.
리소스의 유일한 식별자
로 사용되어야한다./
)는 혼동을 준다.하이픈(-
) 은 URI 가독성
을 높이는데 사용한다.
하이픈을 사용해 가독성
을 높인다.언더 하이픈(_
)은 사용하지 않는다. (가독성 문제)
URI 경로
에는 소문자
가 적합하다.
파일 확장자는 URI
에 포함하지 않는다.
리소스 간에는 연관 관계가 있는 경우
/리소스명/리소스 ID/관계가 있는 다른 리소스 명
/users/{userid}/devices
1xx
: 전송 프로토콜 수준의 정보 교환2xx
: 클라어인트 요청이 성공적으로 수행됨3xx
: 클라이언트는 요청을 완료하기 위해 추가적인 행동을 취해야 함4xx
: 클라이언트의 잘못된 요청5xx
: 서버쪽 오류로 인한 상태코드일반적으로 REST라는 아키텍쳐를 구현하는 웹 서비스를 나타낸다. 예를 들면, REST API를 제공하는 웹 서비스를 RESTful하다
고 할 수 있다.
RESTful
은 REST를 REST답게 쓰기 위한 방법으로, REST 원리를 잘 따르는 시스템은 RESTful 용어로 지칭하기도 한다.
이해하기 쉽고 사용하기 쉬운 REST API를 만드는 것이다.
근본적인 목적은 성능 향상이 아닌, 일관적인 컨벤션을 통한 API의 이해도 및 호환성
을 높이는 것이다. 즉, 성능이 중요하다면 RESTful한 API가 필수 요건이 아니다.
/students/updateName