REST(REpresentational State Transfer)
자원의 이름(HTTP URI)을 통해 자원을 구분하여 해당 자원의 상태를 주고 받는 기술
REST 3요소
구성요소 | 내용 | 표현방법 | 예 |
---|---|---|---|
자원(Resource) | 자원 | HTTP URI | /member/1 |
행위(Verb) | 자원에 대한 행위 | HTTP Method | GET, POST, PUT, PATCH, DELETE |
표현(Representation) | 행위의 내용 | JSON, XML 등 | {id: “1”, name: “europa”} |
HTTP Method
- GET : 조회(Read)
- POST : 생성(Create)
- PUT : 수정(Update) - 전체수정
PATCH :수정(Update) - 일부수정 - DELETE : 삭제(Delete)
CRUD | HTTP Method | URI |
resource 리스트 표시 | GET | /resources |
resource 하나의 세부내용 표시 | GET | /resources/23 |
resource 생성 | POST | /resources |
resource 수정 | PUT | /resources/23 |
resource 삭제 | DELETE | /resources/23 |
REST 특징
- 웹 표준 HTTP 프로토콜을 그대로 사용하므로 기존의 인프라를 그대로 활용가능
- HTTP를 따르는 모든 플랫폼에 사용 가능
1. Server-Client 구조
- 자원을 갖고 있는 쪽 : Server
- API를 제공하고 비즈니스로직을 처리하며 DB에 데이터를 저장한다
- 자원을 요청하는 쪽 : Client
- 사용자 인증이나 context(세션, 로그인정보) 등을 직접 관리한다
- 서로 간의 의존성이 줄어든다
2. Stateless (무상태)
- 상태정보(State)를 따로 저장하고 관리하지 않는다
- 해당 요청만으로 단순 처리가 가능하여 확장성을 갖는다
3. Cacheable (캐시 처리가능)
- HTTP 프로토콜의
Last-Modified
,E-Tag
등을 통한 캐싱 구현 가능 - 캐시를 통해 응답속도가 빨라진다
4. Hierachy (계층구조)
- REST Server를 다중 계층으로 구성 가능하여 로드밸런싱, 보안, 게이트웨이 등 구조를 유연하게 변경가능
- Client는 REST API Server만 호출함
5. Uniform Interface (인터페이스 일관성)
- URI로 지정한 Resource에 대한 조작이 일관되고 한정적인 인터페이스를 수행
-
인터페이스의 일관성으로 HTTP 표준 프로토콜에 따르는 모든 플랫폼에서 사용 가능
- 조건 4가지
- Identification of resources : Resource는 URI로 식별가능
- Manipulation of resources through representation : 표현을 통해 리소스가 조작
- Self-Descriptiove Message : 메시지만 보고 해석이 가능
- Hypermedia As The Engine Of Application State(HATEOAS) : 현재 상태에서 전이 가능한 하이퍼미디어를 제공
REST API
- 도큐먼트 : 객체 인스턴스나 데이터 (단수명사)
- ex) /members/100, /files/star.jpg, /sports/soccer, /sports/soccer/players/13
- 컬렉션 : 서버에서 관리하는 리소스 디렉토리 (복수명사)
- ex) /members, /sports, /sports/soccer/players
- 스토어 : 클라이언트에서 관리하는 리소스 디렉토리 (복수명사)
- ex) /files
URI 규칙
- URI는 명사, 소문자 사용 -> 동사사용 금지
- URI에 HTTP Method가 포함되서는 안됨
- URI에 _(언더스코어) 사용 금지, -(하이폰)은 가독성을 위해 사용 가능
- 확장자 포함금지
- URI는 복수명사/ID 가 표준 ex) products/1
- URI 마지막에 /(슬래시)로 끝내지 않음
설계 규칙
- HTTP헤더에 데이터 포맷을 포함
- Request :
Content-Type
- Response :
Accept
- Request :
- GET이나 쿼리 파라미터를 통한 수정 금지
- 적절한 HTTP Method를 사용해야 한다
- HTTP 응답 코드 사용
- JSON은 카멜 표기법 사용
- 검색, 정렬, 필터링, 페이징 규칙 사용
- 검색 : ?search=digital
- 정렬 : ?sort=rank_asc
- 필터 : ?category=banking&location=asia
- 페이징 : ?page=2
- API 버전 관리
-
v + 정수
로 표현- URI에 포함 :
/v2/member/1
- 쿼리 파라미터에 포함 :
?version=2
- HTTP 헤더에 포함 :
Custom-Header: api-version=2
- URI에 포함 :
-
- 에러 응답처리
- 일관된 에러 객체를 통해 오류메시지를 반환하는 것을 권장한다
{
code: "M01"
message: "Not Found Member"
description: "해당 멤버를 찾을 수 없습니다"
}