RESTful

 Date: 2022-02-25

1. RESTful 이란?

REST는 Representational State Transfer 의 약어로, 클라이언트과 서버가 데이터를 주고 받는 방식에 대한 아키텍처 스타일이다. REST에는 여섯 가지의 기본 원칙이 있고, 이 가이드를 준수한 인터페이스는 RESTful 하다고 표현한다.

  • REST는 프로토콜이나 표준이 아닌 아키텍처 제약 조건의 집합이다.
  • 구체적인 정의로써 REST는 HTTP URI + HTTP Method 라고 할 수 있다.
    URI로 대상 자원을 명시하고 Method로 해당 자원에 대한 행위를 정의한다.

2. REST API

  • REST API는 REST 아키텍처 스타일을 따르는 API를 말한다.
  • API 개발자는 다양한 방법으로 REST를 구현할 수 있다.
  • REST API를 통해 서버로 요청하면 클라이언트에 리소스 상태를 전송한다.
  • 헤더와 매개변수는 REST API 요청의 HTTP 메소드에서 중요하다.
    • 헤더와 매개변수에는 요청의 메타데이터, 권한 부여, URI(Uniform Resource Identifier), 캐싱, 쿠키 등에 관한 중요한 식별자 정보를 포함하고 있기 때문이다.
    • 헤더에는 요청 헤더와 응답 헤더가 있으며, 각 헤더에는 자체 HTTP 연결 정보와 상태 코드가 있다.

3. REST 6가지 원칙

1) 인터페이스 일관성(Uniform Interface)

  • URI로 지정된 리소스에 균일하고 통일된 인터페이스를 제공해야 한다.
  • 아키텍처를 단순하게 분리하여 특정 언어나 기술에 종속되지 않고 **독립적으로 만들 수 있다.
  • Uniform Interface 조건
    • Identification of resources
    • Manipulation of resources thorough representations
    • Self-descriptive message
    • Hypermedia as the engine of application state (HATEOS)

2) 무상태(Stateless)

  • 서버는 HTTP 요청에 대한 어떤 것도 저장하지 않는다.
  • 클라이언트의 모든 요청에는 해당 요청을 이해할 수 있는 모든 정보가 포함되어야 한다.
  • 컨텍스트를 유지해야 하는 세션, 인증과 인가에 대한 정보 또한 클라이언트에만 보관되며, 각 요청 시 해당 정보를 모두 포함하여 서버에 요청한다.

3) 캐시 처리 가능(Cacheable)

  • 서버는 Cache-Control 헤더에 해당 요청이 캐싱이 가능한 지에 대한 여부를 제공해야 한다.
  • 캐싱이 가능하다면 클라이언트는 응답을 캐싱하여 서버와 클라이언트 간의 상호작용을 줄이고, 성능과 서버 가용성을 늘릴 수 있다.

4) 계층화(Layered System)

  • REST는 다중 계층 구조를 가질 수 있도록 허용한다. (예를 들어 API 서버와 DB서버 그리고 인증 서버를 따로 둘 수 있다.)
  • 각 레이어는 자기와 통신하는 컴포넌트 외 레이어에 대해서는 정보를 얻을 수 없다.
  • 클라이언트는 REST 서버와 상호작용할 뿐, REST가 상호작용하는 레이어나 그 외 중간 레이어들, end server에 직접적으로 요청할 수 없으며 이들의 상호작용 또한 볼 수 없다.

5) 클라이언트/서버 구조(Client-Server)

  • 클라이언트와 서버는 서로 독립적이어야 하며, 클라이언트는 오직 URIs 리소스만 알아야한다.
  • 클라이언트와 서버의 인터페이스가 변경되지 않는 한, 이 둘은 독립적으로 개발되거나 대체될 수 있게 유지해야한다.

6) Code on demand

  • 서버가 클라이언트에서 실행시킬 수 있는 로직을 전송하여 클라이언트의 기능을 확장시킬 수 있다.
  • 이를 통해 클라이언트가 사전에 구현해야하는 기능의 수를 줄여 간소화시킬 수 있다.


Reference

REST What is a REST API? RESTful API 이란 RESTful API를 위한 6가지 원칙과 네이밍 RESTful 에 대한 이해 REST를 사용할 때 주의해야할 점