Post

REST API

REST API

REST API란?

REST (REpresentational State Transfer)

  • 웹 상의 자원을 이름으로 구분하고 해당 자원의 상태를 주고 받는 모든 것
    • 웹 애플리케이션 상에 존재하는 모든 리소스에 대해 고유의 URI를 부여
    • HTTP Method를 통해서 리소스에 대한 작업(CRUD 명령)을 적용
  • 대표 상태 전송
    • URI가 부여된 리소스의 상태를 응답으로 전송 한다는 뜻

REST의 구성 요소

  1. 자원 (Resource)
    • 서버의 존재하는 데이터의 총칭
    • 자원은 고유의 URI를 가지며, 이를 통해서 특정 자원을 식별 가능하다
  2. 행위 (Verb)
    • 클라이언트가 HTTP Method를 이용하여 자원을 조작하는 모든 행위
  3. 표현 (Representation)
    • 클라이언트가 HTTP Method로 자원을 조작하면 서버가 그에 대한 응답을 JSON과 같은 형식으로 보냄

REST architecture에 적용되는 제한 조건

  1. 인터페이스 일관성
    • 일관적인 인터페이스로 분리됨
  2. Cacheable
    • 클라이언트는 응답을 캐싱할 수 있어야함
    • 클라이언트-서버 간의 상호작용을 부분적으로 또는 완전히 제거하여 확장성과 성능을 향상시킬 수 있음
  3. Stateless
    • 각 요청 간 클라이언트의 context가 서버에 저장되어서는 안된다.
  4. Layered System
    • 클라이언트는 보통 서버에 직접 연결 되었는지, 또는 프록시 서버를 통해서 연결되었는지 알 수 없다.
    • 프록시 서버는 로드 밸런싱 기능이나 공유 캐시 기능을 제공함으로써 시스템 규모 확장성을 향상시키는 것에 유용하다.
  5. Code on demand (Optional)
    • 자바 애플릿이나 자바스크립트의 제공을 통해서 서버가 클라이언트가 실행시킬 수 있는 로직을 전송하여 기능을 확장시킬 수 있다.
  6. Client-Server 구조
    • 아키텍처를 단순화시키고 작은 단위로 분리(decoupling)함으로써 클라이언트-서버의 각 파트가 독립적으로 개선될 수 있도록 도와준다.

REST 인터페이스 원칙

  1. 자원의 식별

    • Request내에 기술된 개별 자원을 식별할 수 있어야한다. 자원의 그 자체는 클라이언트가 받는 문서와는 개념적으로 분리되어있다.
    • 예를 들어, 서버는 데이터베이스 내부의 자료를 직접 전송하는 대신, 데이터베이스 레코드를 HTML, XML이나 JSON 등의 형식으로 전송
  2. 메세지를 통한 리소스의 조작

    • 클라이언트가 어떤 자원을 지칭하는 메세지와 특정 메타데이터만 가지고 있다면, 충분하게 서버 상의 해당 자원을 변경, 삭제할 수 있는 정보를 가지는 것
  3. 💡 자기서술적 메세지

    • self-descriptive messages
    1. 각 메세지는 자신을 어떻게 처리해야 하는지에 대한 충분한 정보를 포함
      • MIME type과 같은 인터넷 미디어 타입을 전송할 경우, 메세지는 어떤 파서를 이용해야하는지에 대한 정보도 포함
      • 미디어 타입만 가지고도, 클라이언트는 어떻게 그 내용을 처리해야할 지 알 수 있어야한다.
    2. 메세지를 이해하기 위해서 그 내용까지 살펴봐야 한다면, 그 메세지는 자기서술적이지 않다.
      • application/xml 이라는 미디어 타입은, 실제 내용을 다운로드 받지 않으면 그 메세지를 가지고 무엇을 해야할지에 대해 충분히 알려주지 못함
  4. 애플리케이션 상태에 대한 엔진으로서 하이퍼미디어

    • Hypermedia as the engine of application state (HATEOAS)

    • 만약, 클라이언트가 관련된 리소스에 접근하기를 원한다면 리턴되는 지시자에서 구별될 수 있어야 한다.

    • 1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      
      {
         "account_id": 12345,
          "balance": "312,000",
          "links": [
              {
                  "rel": "self",
                  "href": "http://localhost:8080/accounts/12345"
              },
              {
                  "rel": "transfer",
                  "href": "http://localhost:8080/accounts/12345/transfer"
              }
          ]
      }
      

이러한 원칙을 준수한 API를 RESTful API라고 한다.

REST의 목표

  • 구성 요소 상호작용의 규모 확장성
  • 인터페이스의 범용성
  • 구성 요소의 독립적인 배포

장점

  1. 별도의 인프라 구축 불필요
  2. 클라이언트와 서버의 분리
  3. 플랫폼 독립적
  4. 쉬운 사용

단점

  1. 별도의 명확한 표준이 존재하지 않음
  2. HTTP Method의 한계로 인한, Operation의 모호성
  3. RDBMS와는 맞지 않음
This post is licensed under CC BY 4.0 by the author.