1997년에 http 1.1버전이 발표되면서 GET, POST, PUT, DELETE 등 여러 메소드들이 표준이 되었습니다.
그로부터 3년뒤인 2000년. Roy T. Fielding의 논문을 통해 6개의 REST속성이 발표되었고, 이것이 널리 퍼지면서 RESTful api라는 용어와 4단계의 REST API 성숙도 모델이 나왔습니다.
--REST-- 먼저 REST의 6가지 속성은 다음과 같습니다.
:Client-Server (클라이언트-서버 구조) “사용자 인터페이스와 데이터 저장을 분리함으로써, 사용자 인터페이스의 이식성을 높이고 서버 컴포넌트의 단순화로 확장성을 향상시킨다.”
클라이언트는 서버의 여러 구성요소에 대해 알 필요가 없도록 하는 속성입니다. 이 속성을 제대로 적용하면 클라이언트는 서버의 구성요소들과 관련된 의존성을 제거할 수 있습니다.
Layered System (계층화 구조) “클라이언트는 중간 계층의 존재를 알 필요 없이 서버와 통신할 수 있다.”
클라이언트는 서버가 외부에 노출한 경로로 접속한 이후의 과정들을 알 필요가 없도록 하는 속성입니다.
이 속성을 제대로 적용하면 실제 하드웨어적인 서버가 아닌 논리적으로 구성된 서버에 접근할 수 있게 되어 클라이언트는 네트워크 하드웨어에 대한 의존성을 제거할 수 있습니다.
Stateless (무상태성) “각 요청은 독립적이어야 하며, 서버는 클라이언트의 상태를 저장하지 않는다.”
ID, 비밀번호 같이 영구 저장되는 정보가 아닌, 클라이언트의 이전 요청에 대한 정보등을 저장하지 않도록 하는 속성입니다.
이 속성을 제대로 적용하면 서버가 클라이언트의 상태에 의존하는 상황과, 각 요청들의 상호 의존성을 제거할 수 있습니다.
Uniform Interface (일관된 인터페이스) “일관된 인터페이스는 시스템 전체의 단순성과 분리성을 극대화한다.”
이 속성은 클라이언트가 서버의 리소스를 사용하는 방법을 표준화하는 속성입니다. 정해진 표준에 따라 클라이언트와 서버가 요청을 주고받으며, 서로가 각자의 변경사항에 영향받지 않고 요청을 수행할 수 있도록 하는 속성입니다.
이 속성은 -URI의 표준화, -응답 데이터의 표준화, -요청과 응답마다 외부 정보가 필요하지 않도록 모든 정보를 주고받는 자기 서술형 메시지, -현재 리소스에서 어떠한 동작들을 할 수 있는지 클라이언트에게 알려주는 HATEOAS 의 4가지 하위 원칙들을 포함하고 있습니다.
이 속성을 제대로 적용하면 클라이언트와 서버는 하나의 논리적인 인터페이스로 연결되어 서로가 서로의 구조 변화와 무관하게 독립적으로 개발될 수 있도록 합니다. 특히 HATEOAS를 제대로 적용하면 이론적으로는 동적으로 필요한 동작들을 수행할 수 있어 API문서 등의 고정적인 설계가 필요하지 않게 됩니다.
Cacheable (캐시 가능성) “서버의 응답은 캐시 가능 여부를 명확히 지정해야 하며, 클라이언트는 이를 활용해 효율성을 높일 수 있다.”
서버의 응답에 테이터를 신뢰할 수 있는 조건, 기간 등을 명시하여 클라이언트가 이를 믿고 이전 데이터들을 재사용 할 수 있도록 하는 속성입니다.
이 속성을 제대로 적용하면 유효한지 검사하고 재활용 할 수 있어 네트워크 트래픽 사용량을 줄일 수 있습니다.
Code on Demand (요청 시 코드 전송, 선택적) “서버는 클라이언트에게 실행 가능한 코드를 전송하여 기능을 확장할 수 있다.”
단순히 사이트 접속 시 제공되는 HTML, JS, CSS 정도가 아니라, 언제 어느때든 서버는 추가적인 실행 코드를 클라이언트에게 줄 수 있도록 하는 속성입니다.
이 속성을 제대로 적용하면 처음부터 모든 경우의 수에 따른 기능을 제공하는 대신, 필요에 따라 클라이언트의 기능을 확장 할 수 있습니다.
--Rest API-- 이러한 6가지 속성들에서 필요한 속성들을 차용하여 Rest API라는 구조가 탄생했습니다.
RestAPI 는 크게 4가지의 Rest 속성을 기본으로 3가지의 요구사항을 만족하는 구조를 가지고 있습니다.
그러나 일관된 인터페이스의 세부 속성인 HATEOAS 는 잘 쓰이지 않는데, 제대로 쓰기위해서는 많은 노력이 필요하기 때문입니다.