March 16, 2022
REST는 Representational State Transfer라는 용어의 약자로서 2000년도에 로이 필딩 (Roy Fielding)의 박사학위 논문에서 최초로 소개되었습니다. 로이 필딩은 HTTP의 주요 저자 중 한 사람으로 그 당시 웹(HTTP) 설계의 우수성에 비해 제대로 사용되어지지 못하는 모습에 안타까워하며 웹을 장점을 최대한 활용할 수 있는 아키텍처로써 REST를 발표했다고 합니다.
쉽게 말해 REST API는 다음의 구성으로 이루어져있습니다. 자세한 내용은 밑에서 설명하도록 하겠습니다.
REST API 설게시 가장 중요한 항목은 다음의 2가지로 요약할 수 있습니다.
첫 번째,
URL는 정보의 자원을 표현해야 합니다.
두 번째,
자원에 대한 행위는 HTTP Method(GET,POST,PUT,DELETE)로 표현한다.
GET /members/delete/1
위와 같은 방식은 REST를 제대로 적용하지 않은 URI입니다. URI는 자원을 표현하는데 중점을 두어야 합니다. delete와 같은 행위에 대한 표현이 들어가서는 안됩니다.
DELETE /member/1
으로 수정해야합니다. 회원정보를 가져올 떄는 GET, 회원 추가 시의 행위를 표현하고자 할 때는 POST METHOD를 사용하여 표현합니다.
회원 정보를 가져오는 URI
GET /members/show/1 (x) GET /members/1 (o)
회원을 추가할 때
GET /members/insert/2 (x) POST /members/2 (o)
http://restapi.example.com/houses/apartments http://restapi.example.com/animals/mammals/whales
http://restapi.example.com/houses/apartments/ (x) http://restapi.example.com/houses/apartments/ (o)
http://restapi.example.com/members/soccer/345/photo.jpg (X)
REST API에서는 메시지 바디 내용의 포맷을 나타내기 위한 파일 확장자를 URI안에 포함시키지 않습니다. Accept header를 사용하도록 합시다.
GET / members/soccers/345/photo HTTP/1.1 Host: restapi.example.com Accept: image/jpg
REST 리소스간의 연관 관계가 있을 수 있습니다
/리소스명/리소스 ID/관계가 있는 다른 리소스명 ex) GET : /users/{userid}/devices
Collection과 Document에 대해 알면 URI 설계가 한 층 더 쉬워집니다. DOCUMENT는 단순히 문서로 이해해도 되고, 한 객체라고 이해하셔도 될 것 같습니다. 컬렉션은 문서들의 집합, 객체들의 집합이라고 생각하시면 이해하시는데 좀 더 편하실 것 같습니다. 컬렉션과 도큐먼드는 모두 리소스라고 표현할 수 있으며 URI에 표현됩니다.
http:// restapi.example.com/sports/soccer
위 URI는 sports라는 컬렉션과 soccer라는 도큐먼드로 표현되고 있다고 생각하면됩니다. 좀 더 예를 들어보자면
http:// restapi.example.com/sports/soccer/players/13
sports, players 컬렉션과 soccer, 13(13번인 선수)를 의미하는 도큐먼트로 URI가 이루어지게 됩니다. 여기서 중요한 점은 컬렉션은 복수로 사용되고 있다는 점입니다. 좀 더 직관적인 REST API를 위해서는 컬렉션과 도큐먼트를 사용할 때 단수복수도 지켜준다면 좀 더 이해하기 쉬운 URI를 설계할 수 있습니다.
마지막으로 응답 상태코드를 간단히 살펴보겠습니다. 잘 설계뙨 REST API는 URI만 잘 설계된 것이 아닌 그 리소스에 대한 응답을 잘 내어주는 것까지 포함되어야 합니다. 정확한 응답의 상태코드만으로도 많은 정보를 전달할 수가 있기 떄문에 응답의 상태코드 값을 명확히 돌려주는 것은 생각보다 중요한 일이 될수도 있습니다. 혹시 200이나 4xx관련 특정 코드 정도만 사용하고 있다면 처리 상태에 대한 좀 더 명확한 상태코들 값을 사용할 수 있기를 권장하는 바입니다.
200 | 클라이언트의 요청을 정상적으로 수행 |
201 | 클라이언트가 어떠한 리소스 생성을 요청, 해당 리소스가 성공적으로 생성됨 |
400 | 클라이언트의 요청이 부적절할 경우 사용하는 응답 코드 |
401 | 클라이언트가 인증되지 않은 상태에서 보호된 리소스를 요청 했을 때 사용하는 응답 코드(로그인 하지 않은 유저가 로그인 했을 때 요청 가능한 리소스를 요청했을 때) |
403 | 유저 상태와 관계 없이 응답하고 싶지 않은 리소스를 클라이언트가 요청했을 때 사용하는 응답 코드(403 보다는 400이나 404를 사용할 것을 권고. 403 자체가 리소스가 존재한다는 뜻이기 때문에) |
405 | 클라이언트가 요청한 리소스에서는 사용 불가능한 Method를 이용했을 경우 사용하는 응답 코드 |
301 | 클라이언트가 요청한 리소스에 대한 URI가 변경 되었을 때 사용하는 응답 코드(응답시 Location header에 변경된 URIㄹ르 적어주어야 합니다.) |
500 | 서버에 문제가 있을 경우 사용하는 응답 코드 |