REST
- Representational State Transfer의 약자
- 자원을 이름으로 구분하여 해당 자원의 상태(또는 정보)를 주고 받는 모든 것을 의미
- 웹의 기존 기술과 HTTP 프로토콜을 그대로 활용 -> 웹의 장점을 최대한 활용할 수 있는 아키텍처 스타일
REST 구성
- 자원(Resource): Data, Meta Data, HATEOAS로 구성
- 행위(Verb): HTTP Method로 표현
- 표현(Representations)
REST 특징
- 구성 요소 사이의 인터페이스는 uniform 해야 함
- 인터페이스의 일반화
- 전체 시스템 아키텍처의 단순화
- 상호작용의 가시성 개선
- 구현과 서비스 분리로 독립적 진화 가능
2) Stateless
- 클라이언트와 서버의 통신에는 상태가 없어야 함
- 모든 요청은 필요한 모든 정보를 담고 있어야 함
- 요청 하나로만 인식 가능
- 가시성 개선
- task 실패 시 복원 용이하여 신뢰성 개선
- 상태 저장할 필요가 없어 규모 확장성 개선
3) Cacheable
- 모든 서버 응답은 캐시가 가능한지 알 수 있어야 함
- 효율, 규모 확장성, 사용자 입장에서의 성능 개선
4) Self-descriptiveness (자체 표현 구조)
- REST API 메시지만 보고도 이를 쉽게 이해 할 수 있는 자체 표현 구조로 되어 있음
5) Client - Server 구조
- 사용자 인터페이스에 대한 관심(concern)을 데이터 저장에 대한 관심으로부터 분리 -> 클라이언트의 이식성과 서버의 규모확장성 개선
6) Layered System(계층형 구조)
- 다중 계층으로 구성
- 보안, 로드 밸런싱, 암호화 계층을 추가해 구조상의 유연성을 둘 수 있음
- PROXY, 게이트웨이 같은 네트워크 기반의 중간매체 사용할 수 있게 함
REST API 설계 가이드
1) URI는 정보의 자원을 표현
- resource는 동사보다는 명사를, 대문자보다는 소문자를 사용
- resource의 도큐먼트 이름으로는 단수 명사를 사용
- resource의 컬렉션 이름으로는 복수 명사를 사용
- resource의 스토어 이름으로는 복수 명사를 사용
- 예 : GET /members/1
2) 자원에 대한 행위는 HTTP Method (GET, POST, PUT, DELETE)로 표현
3) URI에 HTTP Method 포함 불가
- 예) GET /books/delete/1 -> DELETE /books/1
4) URI에 행위에 대한 동사 표현 포함 불가
- 즉, CRUD 기능을 나타내는 것은 URI에 사용하지 않음
- 예) GET /books/show/1 -> GET /books/1
예) GET /books/insert/2 -> POST /books/2
5) 경로 부분 중 변하는 부분은 유일한 값으로 대체
- 즉, id는 하나의 특정 resource를 나타내는 고유값을 의미
- 예) book을 생성하는 URI: POST /students
예) id=10 인 book을 삭제하는 URI: DELETE /students/10
6) 슬래시 구분자(/ )는 계층 관계를 나타내는데 사용
7) URI 마지막 문자로 슬래시(/ ) 포함 불가
8) URI에 포함되는 모든 글자는 리소스의 유일한 식별자로 사용되어야 하며 URI가 다르다는 것은 리소스가 다르다는 것이고, 역으로 리소스가 다르면 URI도 달라져야 합니다.
9) 하이픈(- )은 URI 가독성을 높이는데 사용 가능
10) 밑줄( _ ) 사용 안함
11) URI 경로에는 소문자가 적합함
- URI 경로에 대문자 사용은 피하기, RFC 3986(URI 문법 형식)은 URI 스키마와 호스트를 제외하고는 대소문자를 구별하도록 규정하기 때문.
13) 리소스 간에 연관 관계가 있는 경우 /리소스명/리소스 ID/관계가 있는 다른 리소스명
형태로 표현
- 예) GET : /books/{bookid}/viewers (일반적으로 소유 ‘has’의 관계를 표현할 때)
14) 자원을 표현하는 컬렉션(Collection)과 도큐먼트(Document)
- 컬렉션: 객체의 집합
- 도큐먼트: 객체
- 컬렉션과 도큐먼트 모두 리소스로 표현할 수 있으며 URI로 표현 가능
- 예) http://edwith.org/courses/1
courses는 컬렉션이고, 복수로 표현해야 함. courses/1 은 courses중에서 id가 1인 도큐먼트를 의미
HATEOAS
- Hypermedia As The Engine Of Application State의 약자
- 데이터와 함께 관련된 URL정보를 제공하는 것
- "_links"가 HATEOAS부분에 해당
{
"id" : 1,
"title" : "hello spring",
"author" : "carami"
"price" : 5000,
"_links":{
"self":{
"href":"http://localhost:8080/books/1"
},
"query-books":{
"href":"http://localhost/books"
},
"write-books":{
"href":"http://localhost/books"
}
}
}