1997년에 http 1.1버전이 발표되면서 GET, POST, PUT, DELETE 등 여러 메소드들이 표준이 되었습니다.

그로부터 3년뒤인 2000년. Roy T. Fielding의 논문을 통해 6개의 REST속성이 발표되었고, 이것이 널리 퍼지면서 RESTful api라는 용어와 4단계의 REST API 성숙도 모델이 나왔습니다.

--REST-- 먼저 REST의 6가지 속성은 다음과 같습니다.

  1. :Client-Server (클라이언트-서버 구조) “사용자 인터페이스와 데이터 저장을 분리함으로써, 사용자 인터페이스의 이식성을 높이고 서버 컴포넌트의 단순화로 확장성을 향상시킨다.”

    클라이언트는 서버의 여러 구성요소에 대해 알 필요가 없도록 하는 속성입니다. 이 속성을 제대로 적용하면 클라이언트는 서버의 구성요소들과 관련된 의존성을 제거할 수 있습니다.

  2. Layered System (계층화 구조) “클라이언트는 중간 계층의 존재를 알 필요 없이 서버와 통신할 수 있다.”

    클라이언트는 서버가 외부에 노출한 경로로 접속한 이후의 과정들을 알 필요가 없도록 하는 속성입니다.

    이 속성을 제대로 적용하면 실제 하드웨어적인 서버가 아닌 논리적으로 구성된 서버에 접근할 수 있게 되어 클라이언트는 네트워크 하드웨어에 대한 의존성을 제거할 수 있습니다.

  3. Stateless (무상태성) “각 요청은 독립적이어야 하며, 서버는 클라이언트의 상태를 저장하지 않는다.”

    ID, 비밀번호 같이 영구 저장되는 정보가 아닌, 클라이언트의 이전 요청에 대한 정보등을 저장하지 않도록 하는 속성입니다.

    이 속성을 제대로 적용하면 서버가 클라이언트의 상태에 의존하는 상황과, 각 요청들의 상호 의존성을 제거할 수 있습니다.

  4. Uniform Interface (일관된 인터페이스) “일관된 인터페이스는 시스템 전체의 단순성과 분리성을 극대화한다.”

    이 속성은 클라이언트가 서버의 리소스를 사용하는 방법을 표준화하는 속성입니다. 정해진 표준에 따라 클라이언트와 서버가 요청을 주고받으며, 서로가 각자의 변경사항에 영향받지 않고 요청을 수행할 수 있도록 하는 속성입니다.

    이 속성은 -URI의 표준화, -응답 데이터의 표준화, -요청과 응답마다 외부 정보가 필요하지 않도록 모든 정보를 주고받는 자기 서술형 메시지, -현재 리소스에서 어떠한 동작들을 할 수 있는지 클라이언트에게 알려주는 HATEOAS 의 4가지 하위 원칙들을 포함하고 있습니다.

    이 속성을 제대로 적용하면 클라이언트와 서버는 하나의 논리적인 인터페이스로 연결되어 서로가 서로의 구조 변화와 무관하게 독립적으로 개발될 수 있도록 합니다. 특히 HATEOAS를 제대로 적용하면 이론적으로는 동적으로 필요한 동작들을 수행할 수 있어 API문서 등의 고정적인 설계가 필요하지 않게 됩니다.

  5. Cacheable (캐시 가능성) “서버의 응답은 캐시 가능 여부를 명확히 지정해야 하며, 클라이언트는 이를 활용해 효율성을 높일 수 있다.”

    서버의 응답에 테이터를 신뢰할 수 있는 조건, 기간 등을 명시하여 클라이언트가 이를 믿고 이전 데이터들을 재사용 할 수 있도록 하는 속성입니다.

    이 속성을 제대로 적용하면 유효한지 검사하고 재활용 할 수 있어 네트워크 트래픽 사용량을 줄일 수 있습니다.

  6. Code on Demand (요청 시 코드 전송, 선택적) “서버는 클라이언트에게 실행 가능한 코드를 전송하여 기능을 확장할 수 있다.”

    단순히 사이트 접속 시 제공되는 HTML, JS, CSS 정도가 아니라, 언제 어느때든 서버는 추가적인 실행 코드를 클라이언트에게 줄 수 있도록 하는 속성입니다.

    이 속성을 제대로 적용하면 처음부터 모든 경우의 수에 따른 기능을 제공하는 대신, 필요에 따라 클라이언트의 기능을 확장 할 수 있습니다.

--Rest API-- 이러한 6가지 속성들에서 필요한 속성들을 차용하여 Rest API라는 구조가 탄생했습니다.

RestAPI 는 크게 4가지의 Rest 속성을 기본으로 3가지의 요구사항을 만족하는 구조를 가지고 있습니다.

  1. Client-Server와 Layered System. 두가지 속성을 만족하는 엔드포인트 설계를 통해 클라이언트를 서버의 구조에 의존하지 않도록 설계합니다
  2. Stateless(무상태성)속성을 만족하는 설계를 통해 서버를 클라이언트의 상태에 의존하지 않도록 설계합니다
  3. 일관된 인터페이스와 세부 속성들을 통해 요청과 응답을 표준화하여 클라이언트와 서버가 서로 독립적으로 개발, 운영될 수 있도록 설계합니다.

그러나 일관된 인터페이스의 세부 속성인 HATEOAS 는 잘 쓰이지 않는데, 제대로 쓰기위해서는 많은 노력이 필요하기 때문입니다.