RSET(Representational State Transfer)는 API 작동 방식에 대한 조건을 부과하는 소프트웨어 아키텍처이다.

REST는 처음에 인터넷과 같은 복잡한 네트워크에서 통신을 관리하기 위한 지침으로 만들어졌다. REST 기반 아키텍처를 사용하여 대규모의 고성능 통신을 안정적으로 지원할 수 있다. 기본적으로 웹의 기존 기술과 HTTP 프로토콜을 그대로 활용하기 때문에 웹의 장점을 최대한 활용할 수 있는 아키텍처 스타일이다.쉽게 구현하고 수정할 수 있어 모든 API 시스템을 파악하고 여러 플랫폼에서 사용할 수 있다.

[1] REST 구성 요소

  1. 리소스(resource): REST의 핵심이다. 식별자(URI)와 표현(Representation)으로 구성된다.
  2. URI(Uniform Resource Identifier): 각 리소스는 고유한 URI를 가지고 있다. URI는 클라이언트가 특정 리소스에 접근하는 데 사용된다.
  3. 표현(Representation): 리소스의 상태를 나타내는 데이터의 형식이나 형태이다. 다양한 형식으로 제공될 수 있으며, 일반적으로 JSON이나 XML 형식을 사용한다.
  4. HTTP Method: 주요 HTTP 메서드로는 GET(조회), POST(생성), PUT(수정), DELETE(삭제) 등이 있다.

[2] REST의 주요 원칙

  1. 클라이언트-서버 구조(Client-Server)

    1. 자원이 있는 쪽이 Server, 자원을 요청하는 쪽이 Client가 되는 구조이다.
      1. 클라이언트: 사용자 인터페이스 및 사용자 경험을 담당. 클라이언트는 사용자의 요청을 생성하고 서버로 보내며, 서버로부터 받은 데이터를 표시한다. 일반적으로 사용자가 직접 상호작용하는 부분으로, 웹 브라우저, 모바일 앱, 데스크톱 애플리케이션 등이 될 수 있다.
      2. 서버: 비즈니스 로직, 데이터 처리, 데이터베이스와 같은 백엔드 작업을 담당한다. 클라이언트의 요청을 받아 처리하고, 필요한 데이터를 검색하여 클라이언트에게 전송한다. 서버는 데이터를 관리하고 업데이트하며, 여러 클라이언트에 대한 동시 요청을 처리한다.
    2. 클라이언트와 서버는 역할을 분리하여 시스템을 구축함으로서 독립적으로 발전하고 변경될 수 있도록 설계한다. 이로 인해 시스템의 유지보수성과 확장성을 향상시킨다. ⇒ 서로 간의 의존성이 없게 역할을 명확히 구분함
  2. 일관된 인터페이스(Uniform interface)

    1. 일관된 인터페이스는 모든 RESTful 웹 서비스 디자인의 기본이다. REST의 일관된 인터페이스는 클라이언트와 서버 간의 상호 작용을 단순하고 일관성 있게 만들어 시스템을 이해하기 쉽게 만든다. 사용자, 클라이언트, 서버 등이 서로 독립적으로 발전할 수 있도록 지원하여 시스템의 확장성과 유지보수성을 향상시킨다.
    2. 일관된 인터페이스는 4가지의 아키텍처 제약 조건이 있다.
      1. 리소스 식별(Resource Identification): 요청은 리소스를 식별해야 한다. 이를 위해서 일관된 리소스 식별자를 사용한다.
      2. 리소스 조작을 통한 표현(Resource Manipulation through Representations): 클라이언트는 원하는 경우 리소스를 수정하거나 삭제하기에 충분한 정보를 리소스 표현에서 가지고 있다. 서버는 리소스를 자세히 설명하는 메타데이터를 전송하여 이 조건을 충족한다.
      3. 자체 서술적 메시지(Self-descriptive Messages): 클라이언트는 표현을 추가로 처리하는 방법에 대한 정보를 수신한다. 이를 위해 서버는 클라이언트가 리소스를 적절하게 사용할 수 있는 방법에 대한 메타데이터가 포함된 명확한 메시지를 전송한다.
      4. HATEOAS(Hypermedia as the Engine of Applicaion State): 클라이언트는 작업을 완료하는 데 필요한 다른 모든 관련 리소스에 대한 정보를 수신한다. 이를 위해 서버는 클라이언트가 더 많은 리소스를 동적으로 검색할 수 있도록 표현에 하이퍼링크를 넣어 전송한다.
  3. 무상태(Stateless )

    1. 무상태란 시스템이 특정 상태를 저장하지 않고, 이전의 모든 요청과 모든 클라이언트 요청을 독립적으로 처리하며 서버가 이전 요청에 대한 정보를 유지하지 않는 특성을 지닌다. 이는 각 요청이 서버에 대한 이전 상태를 기억하지 않고, 서버 또한 클라이언트의 상태를 계속 추적하지 않는 것을 의미한다.
    2. 무상태의 특징으로는 4가지가 있다.
      1. 독립성: 각각의 요청은 서로 독립적으로 처리되며, 이전 요청에 대한 정보를 가지고 있지 않는다.
      2. 간편성: 서버가 특정 상태를 저장하지 않기 때문에 시스템 설계가 간단하고 유지보수가 쉽다.
      3. 확장성: 서버는 각 요청을 별도의 단위로 처리하므로, 시스템이 더 많은 사용자나 요청을 처리할 수 있도록 확장하기 용이하다.
      4. 신뢰성: 에러가 발생해도 각 요청이 독립적으로 처리되기 때문에 전체 시스템이 계속해서 동작할 수 있다.
    3. 무상태의 특성은 주로 웹 애플리케이션과 웹 서비스에서 사용된다. 여러 사용자가 동시에 서비스에 접속하고 상호작용하는 웹 환경에서 무상태성은 중요한 원칙 중 하나이다.
  4. 계층화된 시스템(Layered System)

    1. 시스템을 여러 계층으로 나누어 각 계층이 특정 역할을 수행하도록 하는 것을 의미한다. 각 계층은 하위 계층과 상위 계층 간의 인터페이스를 통해 통신한다.
    2. 계층화된 시스템의 특징으로는 5가지가 있다.
      1. 모듈성(Modularity): 시스템이 계층으로 나누어져 있기 때문에 각 계층은 특정 기능 또는 역할을 수행하며, 모듈화를 촉진한다. 각 계층은 독립적으로 개발, 유지보수, 테스트를 할 수 있다.
      2. 재사용성(Reusability): 각 계층은 재사용이 가능한 모듈로서 동작하며, 다른 시스템에서도 사용할 수 있다. 이는 개발 생산성을 향상시키고, 코드의 중복을 줄인다.
      3. 유연성(Flexibility): 시스템의 특정 부분을 변경하거나 업그레이드하기 쉽다. 한 계층의 변경이 다른 계층에 미치는 영향이 최소화되기 때문에 유연성이 증가한다.
      4. 확장성(Scalability): 새로운 기능이나 요구사항이 발생하면 해당 기능을 처리하기 위한 새로운 계층을 추가할 수 있다. 또한, 각 계층을 별도로 확장할 수 있어서 전체 시스템의 성능을 향상시키기 용이하다.
      5. 이해성(Understandability): 각 계층이 특정 기능에 집중하므로 시스템 전체를 이해하고 유지보수하기가 더 쉬워진다. 각 계층은 자체적으로 동작하며 다른 계층에 대한 내용을 추상화한다.
    3. 예를 들어, 웹 애플리케이션에서는 클라이언트, 서버, 데이터베이스와 같은 계층이 있을 수 있다. 클라이언트는 사용자와 상호작용하고, 서버는 비즈니스 로직을 처리하며, 데이터베이스가 데이터를 저장하는 식으로 계층화될 수 있다.
  5. 캐시 가능성(Cacheability)

    1. RESTful 웹 서비스는 서버 응답 시간을 개선하기 위해 클라이언트나 중간 캐시 서버의 일부 응답을 저장하는 프로세스인 캐싱(caching)을 지원한다. 이는 리소스를 캐시하여 이후에 동일한 요청에 대해 빠르게 응답할 수 있도록 하는 능력을 나타낸다.
    2. 예를 들어, 모든 페이지에 common header(공통 헤더)와 footer images(바닥글 이미지)가 있는 웹 사이트에 방문한다고 하면 새로운 웹 사이트 페이지를 방문할 때마다 서버는 동일한 이미지를 다시 전송해야 한다. 이를 피하기 위해 클라이언트는 첫 번째 응답 후에 해당 이미지를 캐싱하거나 저장한 다음 캐시에서 직접 이미지를 사용한다.
    3. 캐시 가능성을 적절하게 활용하면 웹 성능을 향상시키고 반복적이고 중복된 요청에 대한 서버 및 네트워크 부하를 줄일 수 있다.
    4. cacheability의 주요 방법
      1. HTTP 캐시 헤더 활용
      2. ETag 및 Last-Modified 헤더 활용
      3. 캐시 제어 정책 구현
      4. 조건부 요청 처리
      5. 캐시 무효화(캐시 프러그마 등)
  6. 온디맨드 코드(Code on demand) (optional)

    1. 필요한 순간에만 실행되는 코드를 나타낸다. 이는 특정 작업이나 함수가 호출되기 전까지는 실행되지 않으며, 필요한 시점에 동적으로 로드되고 실행되는 코드이다.
    2. 예를 들어, 웹 사이트에서 등록 양식을 작성할 때 잘못된 전화번호를 작성하면 브라우저는 즉시 강조 표시를 한다.
    3. 모바일 앱이나 웹 애플리케이션에서 사용자가 특정 화면이나 기능을 요청했을 때 해당 코드를 로드해서 렌더링하거나 실행함으로써 사용자 경험을 최적화하는 데에도 사용된다.