로이필딩에 의해 최초로 소개되었는데, 로이필딩은 HTTP의 주요 저자 중 한 사람으로 그 당시 웹(HTTP)설계의 우수성에 비해 제대로 사용되어지지 못하는 모습에 안타까워하며 웹의 장점을 최대한 활용할 수 있는 아키텍처로 REST를 발표했다.
아키텍처
- 시스템 구성 및 동작 원리를 나타낸다.
- 구성 요소 간의 관계 및 시스템 외부 환경과의 관계가 묘사된다.
-> 즉, 서비스의 동작 원리를 나타낸다.
CRUD Operation
CRUD는 대부분의 컴퓨터 소프트웨어가 가지는 기본적인 데이터 처리 기능인 Create(생성), Read(읽기), Update(갱신), Delete(삭제)를 묶어서 일컫는 말로
REST에서의 CRUD Operation 동작 예시는 다음과 같다.
- Create : 데이터 생성(POST)
- Read : 데이터 조회(GET)
- Update : 데이터 수정(PUT, PATCH)
- Delete : 데이터 삭제(DELETE)
-> 즉, REST의 원리를 따르는 API
캐시
데이터나 값을 미리 복사해 놓는 임시 장소
last_Modified 태그와 E-Tag
- last_Modified : HTTP 헤더에 서버가 알고있는 가장 마지막 수정된 날짜와 시각을 담고있다.
-> 이는 저장된 리소스가 이전과 같은지 유효성 검사자로 사용된다.- E-Tag : 특정 버전의 리소스를 식별하는 식별자이다.
웹 서버가 내용을 확인하고 변하지 않았으면, 웹 서버로 full 요청을 보내지 않기 때문에, 캐쉬가 더 효율적이게 되고, 대역폭도 아낄 수 있다. 만약 내용이 변경되었다면, 리소스 간 동시 다발적 수정 및 덮어쓰기 현상을 막는데 유용하게 사용된다.
만약, 특정 URL의 리소스가 변경된다면, 새로운 ETag가 생성된다, 이는 지문과 같은 역할을한다.
로드 밸런싱
서버가 처리해야 할 업무 혹은 요청을 여러 대의 서버로 나누어 처리하는 것.
한 대의 서버로 부하가 집중되지 않도록 트래픽을 관리해 각각의 서버가 최적의 퍼포먼스를 보일 수 있도록 하는것이 목적이다.
REST API 설계 시 가장 중요한 항목 2가지
GET /members/delete/1
DELETE /members/1
GET /members/show/1
(x) -> show 는 행위느낌GET /members/1
(o)GET /members/insert/2
(x) -> GET 메서드는 리소스 생성에 알맞지 않음POST /members/2
(o)+[참고] HTTP Method의 알맞은 역할
POST : 해당 URI요청시, 리소스를 생성한다.
GET : 해당 리소스를 조회한다. 리소스를 조회하고, 해당 도큐먼트에 대한 자세한 정보를 가져온다.
PUT : 해당 리소스를 수정한다.
DELETE : 해당 리소스를 삭제한다.
-> 이처럼, URI는 자원을 표현하는데 집중하고, 행위에 대한 정보는 HTTP Method를 통해 하는것이 REST API를 설계하는 중심규칙!
http://restapi.example.com/houses/apartments
http://restapi.example.com/houses/apartments/
(x)http://restapi.example.com/members/soccer/345/photo.jpg
(x)GET /members/soccer/345/photo HTTP/1.1 Host: restapi.example.com Accept:image/jpg
REST 리소스 간에는 연간관계가 있을 수 있고, 이런 경우에는 다음과 같은 표현법을 사용
/리소스명/리소스ID/관계가 있는 다른 리소스명
ex) GET /users/{usersid}/devices
(일반적으로 소유 'has'의 관계표현)
만약 관계명이 복잡하다면 이를 서브 리소스에 명시적으로 표현가능하다.
예를 들어, 사용자가 '좋아하는' 디바이스 목록을 표현해야 할 경우
GET /users/{userid}/likes/devices
(관계명이 애매하거나 구체적 표현 필요시)
-> 하지만, RESTful하게 구현하려면 GET : /users/{userid}/device-liked
을 추천한다.
Document : 단순히 문서로 이해해도 되고, 한 객체라고 이해해도 된다.
Collection : 문서들의 집합, 객체들의 집합.
-> 둘 다 리소스이며 URI에 표현된다.
http:// restapi.example.com/sports/soccer
: sports라는 컬렉션과 soccer라는 도큐먼트로 표현되고있다.
http:// restapi.example.com/sports/soccer/players/13
:sports, player라는 컬렉션과 soccer, 13이라는 도큐먼트로 URI가 이루어진다.
여기서 중요한 점은 컬렉션은 복수로 사용하고있다는 것이다.
좀 더 직관적인 REST API를 위해 컬렉션과 도큐먼트를 사용할 때 단수/복수도 지켜준다면 이해하기 쉬운 URI를 설계할 수 있다.
잘 설계된 REST API는 URI만 잘 설계된 것이 아닌, 그 리소스에 대한 응답을 잘 내어주는 것까지 포함되어야 한다.
정확한 응답의 상태코드만으로도 많은 정보를 전달할 수가 있기 때문에 응답 상태코드 값을 명확히 돌려주는 것은 생각보다 중요한 일이다.
혹시 200이나 4XX관련 특정 코드 정도만 사용하고 있다면 처리 상태에 대한 좀 더 명확한 상태코드값을 사용할 수 있기를 권장한다.
상태코드에 대해서는 몇가지만 정리하도록 하겠다.
REST의 원리를 따르는 시스템을 의미한다.
하지만 REST를 사용했다 하여, 모두가 RESTful 한 것은 아니다.
REST API의 설계 규칙을 올바르게 지킨 시스템을 RESTful하다 말할 수 있으며, 그렇지 않은것은 REST API를 사용하였지만 RESTful 하지 못한 시스템이라고 할 수 있다.
참고
https://khj93.tistory.com/entry/네트워크-REST-API란-REST-RESTful이란
https://meetup.toast.com/posts/92