API는 알겠는데, API를 만들때 RESTful하게 만들면 REST API라고?
그럼 REST가 무엇을 뜻하는 지 알아보려고 한다
: REST는 프로토콜이나 표준이 아닌 아키텍쳐 제약 조건으로 아래의 조건들을 만족시켜 설계되었다면 RESTful한 설계라고 칭할 수 있다.
Client-Server: 클라이언트와 서버가 서로 독립적으로 분리되어 있어야 한다.
-> 같은 서버 내에서 데이터를 주고 받는 것은 REST한 설계가 아니다.
Stateless: 요청에 대한 클라이언트의 상태를 서버에 저장하지 않는다.
-> 클라이언트가 이전에 요청한 내용에 상관없이 서버는 동일한 응답을 해야한다.
Cache: 클라이언트는 서버의 응답을 캐시를 통해 재사용 할 수 있어야 한다.
-> 서버에 과도한 요청을 방지하기 위해 지정되었지만, 서버의 성능에 따라 Cacheless로 운영할 수도 있다.
Layered System: 서버와 클라이언트 사이에 방화벽, 게이트웨이, 프록시 등 다계층 형태를 구성할 수 있어야 하며, 확장 할 수 있어야 한다.
Uniform Interface: 일관된 인터페이스를 제공하며, 클라이언트와 서버가 독립적으로 개선될 수 있어야 함.
슬래시 구분자는 계층 관계를 나타나는 데에 사용한다.
ex. https://foo.co.kr/vehicles/suv/q6
URI 마지막 문자로 슬래시를 포함하지 않는다.
ex. https://foo.co.kr/vehicles/suv/q6/
하이픈은 URI 가독성을 높이는 용도로 사용한다.
ex. https://foo.co.kr/vehicles/suv/q-series/6
밑줄은 사용하지 않는다.
ex. https://foo.co.kr/vehicles/suv/q_series/6
URI 경로에는 대문자를 사용하지 않는다.
ex. https://foo.co.kr/Vehicles/SUV/Q6
파일 확장자는 URI에 포함하지 않는다.
ex. https://foo.co.kr/vehicles/suv/q6.jsp
프로그래밍 언어에 의존적인 확장자를 사용하지 않는다.
ex. https://foo.co.kr/vehicles/suv/q6.do
구현에 의존적인 경로를 사용하지 않는다.
ex. https://foo.co.kr/servlet/vehicles/suv/q6
세션 ID를 포함하지 않는다.
ex. https://foo.co.kr/vehicles/suv/q6?session-id=asdf
프로그래밍 언어의 Method명을 사용하지 않는다.
ex. https://foo.co.kr/vehicles/suv/q6?action=intro
명사에 단수형 보다는 복수형을 사용한다.
ex. https://foo.co.kr/vehicles/suv/q6
컨트롤러의 이름으로는 동사나 동사구를 사용한다.
ex. https://foo.co.kr/vehicles/suv/q6/re-order
경로 부분 중 변하는 부분은 유일한 값을 사용한다.
ex. https://foo.co.kr/vehicles/suv/q6/{car-id}/users/{user-id}
CRUD 기능을 나타내지 않는다.
ex. https://foo.co.kr/vehicles/suv/q6/delete/{car-id}
- REST API란 REST 조건을 맞추어 설계된 API를 뜻한다.
- URI를 설계할 때도 다양한 원칙이 존재한다.