REST API는 REST 아키텍처를 기반으로 구현되는 API로서 자원, 행위, 표현의 세 가지 요소로 구성되어 있습니다. 또한 REST API를 올바르게 구현하기 위해서는 6가지 제약조건을 준수해야 합니다. 그렇다면 3가지 구성 요소 와 6가지 제약조건에 대해서 자세히 살펴보겠습니다.
위 사진은 구글 Gmail의 Label API문서를 가져왔습니다. Label API문서를 통해 3가지 구성요소를 작성해보겠습니다.
자원 : https://gmail.googleapis.com/gmail/v1/users/{userId}/labels/{id}
행위 : GET
표현 : JSON
클라이언트와 서버가 서로 분리되어 있어야 함을 의미합니다.
서버는 클라이언트의 정보를 저장, 관리하지 않으며 요청만을 처리합니다.
클라이언트가 서버로부터 받은 응답을 캐시에 저장하여 재사용할 수 있음을 의미합니다.
클라이언트는 최종 서버에 직접 연결되었는지 중개 서버에 연결되었는지 알 수 없습니다.
통일된 Interface를 통해 어떤 플랫폼에서도 사용이 가능해야 하며 이를 위해 4가지 제약 조건을 만족해야 합니다.
서버의 자원은 URI로 식별되어야 합니다.
클라이언트가 HTTP 메서드를 사용해 서버의 자원을 조작(CRUD) 할 수 있으며 조작을 위해 JSON, XML 등의 표현 형식을 사용해야 합니다.
메시지가 스스로를 설명할 수 있는 구조를 가져야 함을 의미합니다.
위 사진은 카카오의 Open API 문서입니다. 클라이언트는 api 명세만으로 api를 알 수 있습니다.
애플리케이션 상태를 이동할 때 하이퍼링크를 통해 가능한 행동들을 파악하고 그에 따라 요청을 보낼 수 있어야 한다를 의미합니다.
GET /users/123 HTTP/1.1
Host: https://api.example.com
다음과 같은 API 명세가 있다고 가정해보겠습니다. HATEOAS를 적용한 API 응답결과는 다음과 같습니다.
{
"id": 123,
"name": "John Doe",
"email": "john.doe@example.com",
"links": {
"self": {
"href": "https://api.example.com/users/123"
},
"friends": {
"href": "https://api.example.com/users/123/friends"
},
"edit": {
"href": "https://api.example.com/users/123",
"method": "PUT"
},
"delete": {
"href" : "https://api.example.com/users/123" ,
"method" : "DELETE"
}
}
}
links 객체 안에 사용자 정보를 조회, 수정 등의 관련된 작업을 수행할 수 있는 링크 정보들이 포함되어 있습니다. 이를 통해 클라이언트는 각 링크가 어떤 작업에 대응되는지 알 수 있고 이러한 정보를 바탕으로 동적으로 애플리케이션 상태를 변경할 수 있습니다.
서버는 클라이언트에 실행 가능한 코드를 제공할 수 있어야 합니다. (이 규칙은 선택 사항입니다.)
예를 들어 Swagger를 사용해 클라이언트는 서버가 제공하는 API를 확인하고 테스트할 수 있습니다.
마지막으로 Restful API 디자인 가이드를 소개하며 글을 마치겠습니다.