Representational State Transfer의 약자이며,
REST는 간단히 아래와 같이 구성됩니다.
자원(Resource) - URI
REST에서 가장 중요한 부분은 Resource 입니다. REST에서는 데이터를 얻기 위해 기능을 어떻게 구현했는지에 집중하지 않습니다. REST에서 집중하는 것은 구현이 아닌 데이터입니다.
URI는 URL를 포함하는 개념입니다.
URI > URL
(Uniform Resource Identifier) > (Uniform Resource Locator)
- URL로는 Locator가 지시하는 경로까지만 따라 들어갈 수 있지만 그 이상은 어렵다.
- 하지만 URI로는 그 경로의 Resource까지도 접근할 수 있다. (Identifier가 Resource를 구별해준다)
행위(Verb) - HTTP Method
표현(Representations)
로이 필딩의 논문 '네트워크 기반 소프트웨어 아키텍처의 구조적 스타일과 설계(Architectural Styles and the Design of Network-based Software Architectures)'에 정의된 것처럼 RESTful 시스템의 다음 6가지 주요 제약 조건을 준수했을 때 RESTful API라고 간주할 수 있습니다.
시스템의 구성 요소는 해당 계층 너머를 볼 수 없습니다. 따라서 로드 밸런서 및 프록시를 쉽게 추가하여 보안 또는 성능을 향상시킬 수 있습니다.
보안, 로드 밸런싱, 암호화 계층을 추가할 때 구조를 유연하게 할 수 있고, Proxy, 게이트 웨이와 같은 네트웨크 기반의 중간매체를 사용할 수 있습니다.
REST API 설계 시 가장 중요한 항목은 크게 2가지로 요약할 수 있습니다.
- URI는 정보의 자원을 표현해야 한다.
- 자원에 대한 행위는 HTTP Method (GET, POST, PUT, DELETE)로 표현한다.
1) URI는 정보의 자원을 표현해야 한다. (리소스명은 동사보다는 명사를 사용한다.)
잘못된 예시
GET /members/show/1
올바른 예시
GET /members/1
2) 자원에 대한 행위는 HTTP Method (GET, POST, PUT, DELETE)로 표현한다.
잘못된 예시
GET /members/delete/1
올바른 예시
DELETE /members/1
참고로, HTTP 메소드를 올바르게 사용할 수 있어야 합니다. 모든 행위를 GET으로 표현하는 식으로 상황에 맞지 않는 메소드를 사용해서는 안 됩니다.
HTTP 메소드 (GET, POST, PUT, DELETE)를 사용하여 CRUD를 할 수 있습니다.
메소드 | 역할 |
---|---|
GET | 해당 리소스를 조회하여 (자세한) 정보를 가져옵니다. |
POST | 해당 리소스를 생성합니다. |
PUT | 해당 리소스를 수정합니다. |
DELETE | 해당 리소스를 삭제합니다. |
REST API의 중심 규칙을 다시 상기해보면, URI는 자원을 표현하는 데 집중하고, 자원에 대한 행위는 HTTP 메소드를 사용하여 표현한다 입니다.
1) 슬래시 구분자(/
)는 계층 관계를 나타낼 때 사용합니다.
http://restapi.example.com/animals/mammals/whales
2) URI 마지막 문자로 슬래시(/
)를 포함하지 않습니다.
/
)를 사용하지 않습니다. http://restapi.example.com/animals/mammals/whales/
3) 대시(-
)은 URI 가독성을 높이는 데 사용합니다.
4) 언더스코어(_
)은 사용하지 않습니다.
-
) 사용을 권장합니다.5) URI 경로에는 소문자가 적합합니다.
URI 경로에 대문자 사용은 피하도록 합니다. 대소문자에 따라 다른 리소스를 인식하므로 두 가지를 혼용하면 복잡성이 커집니다. RFC 2986(URI 문법 형식)은 URI 스키마와 호스트를 제외하고는 대소문자를 구별하도록 규정하고 있습니다.
RFC 3986 is the URI (Unified Resource Identifier) Syntax document
6) 파일 확장자는 URI에 포함시키지 않습니다.
잘못된 예시
http://restapi.example.com/members/soccer/345/photo.jpg
REST API에서는 메시지 바디 내용의 포맷을 나타내기 위한 파일 확장자를 URI에 포함시키지 않습니다. 대신 Accept header를 사용합니다.
GET /members/soccer/10/photo HTTP/1.1 Host: restapi.example.com Accept: image/jpg
REST 리소스 간에는 연관 관계가 있을 수 있습니다. 이 경우 아래와 같이 표현합니다.
/리소스명/리소스 id/관계가 있는 다른 리소스명
GET /users/{userid}/devices (일반적으로 소유 'has'의 관계를 표현할 때)
만약 관계명이 복잡하다면 이를 서브 리소스에 명시적으로 표현하는 방법이 있습니다. 예를 들어 사용자가 '좋아하는' 디바이스 목록을 표현해야 할 경우 아래와 같이 표현할 수 있습니다.
GET /users/{userid}/likes/devices (관계명이 애매하거나 구체적 표현이 필요할 때)
컬렉션은 문서들의 집합 또는 객체들의 집합입니다. 그리고 도큐먼트는 하나의 문서 또는 객체입니다. 이 두 가지를 모두 리소스라고 표현하며, 이들은 URI에 표현됩니다.
http://restapi.example.com/sports/soccer
위의 URI에서는 sports
라는 컬렉션이 있고, soccer
라는 도큐먼트가 있습니다. 한 가지 더 예를 들어보겠습니다.
http://restapi.example.com/sports/soccer/players/7
이 경우, sports
, players
라는 컬렉션이 있고, soccer
, 7
(id가 7인 선수) 라는 도큐먼트가 있습니다. 여기서 중요한 점은 컬렉션은 복수를 사용하고, 도큐먼트는 단수를 사용한다는 점입니다.
상태 코드 | 설명 |
---|---|
200 | 클라이언트의 요청을 정상적으로 수행합니다. |
201 | 클라이언트가 리소스 생성을 요청할 시, 해당 리소스가 성공적으로 생성되었음을 나타냅니다. (POST 메소드를 통한 리소스 생성 시) |
상태 코드 | 설명 |
---|---|
400 | 클라이언트가 적절하지 않은 요청을 한 경우에 사용합니다. |
401 | 클라이언트가 인증되지 않은 상태에서 보호된 리소스를 요청했을 때 사용합니다. (로그인 하지 않은 유저가, 로그인 이후 요청 가능한 리소스를 요청했을 때) |
403 | 유저의 인증 상태와 관계 없이 응답하고 싶지 않은 리소스를 클라이언트가 요청했을 때 사용합니다. (403 자체는 리소스가 존재한다는 것을 의미하기 때문에, 403 보다는 400이나 404 사용을 권고합니다.) |
405 | 클라이언트가 요청한 리소스에서는 사용할 수 없는 HTTP 메소드를 호출할 경우 사용합니다. |
상태 코드 | 설명 |
---|---|
301 | 클라이언트가 요청한 리소스에 대한 URI가 변경되었을 경우에 사용합니다. (응답시 Location header에 변경된 URI를 적어주어야 합니다.) |
500 | 서버에 문제가 있을 경우에 사용합니다. |