티스토리 뷰

Spring/RestAPI

REST API

Bong Gu 2021. 8. 23. 13:58
728x90

Rest API

  • REST 아키텍쳐 아키텍쳐 스타일을 따르는 API
  • RepresenTational State Transfer
    • 아키텍쳐 스타일
    • 제약조건들의 집합
  • 6가지 제약 조건
    • Client-Server
    • Stateless
    • cache
    • uniform interface
    • layered system
    • code-on-demand (optional)
  • Client-Server, Stateless, cache, layerd system은 http만 사용해도 대부분 만족한다.

Client-Server

  • 클라이언트와 서버가 서로 의존하지 않고 별도로 진화할 수 있다.

Stateless

  • 클라이언트에서 서버로의 각 요청에는 그 요청을 이해하는데 필요한 정보가 포함되어야 한다.
  • 서버에 저장된 환경정보를 이용해서 이득(서버에서 클라이언트 정보 유지등)을 취하면 안된다.
  • 세션의 정보는 전적으로 클라이언트가 가지고 있어야 한다.

Cacheable

  • 요청에 대한 응답 내의 데이터에 해당 요청은 캐시가 가능한지 불가능한지 명시해야 한다.
  • 캐시를 사용한다면, 동일한 요청이 왔을 때 응답 데이터를 재사용할 수 있어야 한다.
  • cache-control 헤더를 통하여 캐시 여부 명시

Uniform Interface

  • 전체적인 시스템 아키텍처를 간단하고 잘 파악할 수 있도록 하기 위한 약속된 Interface
  • 4가지 제약조건
    • identification of resources
      • resources가 URI로 식별될 수 있어야 한다.
    • manipulation of resources through representations
      • resource를 만들거나, 수정하거나, 삭제하거나 할 때, http message에 표현을 담는다.
    • self-descriptive message
      • 해당 데이터에 대한 파싱까지는 가능하지만, 이것이 어떤값인지에 대한 명세가 없기때문에 대부분 만족하지 못한다.
      • REST 하게 만드는법
        1. MediaType 추가 : IANA에 등록한다.
          • 누구나 쉽게 사용할 수 있다.
          • 어렵다
        2. Profile : link 헤더에 profile relation으로 명세를 링크한다.
          • 명세를 찾아갈 수 있게된다.
          • 클라이언트가 Link 헤더와 profile을 이해해야 한다.
          • Content negotiation을 할 수 없다.
          • Content negotiation
          • 사용자에게 적절한 리소스를 제공해주는 방법 (언어등)
    • HATEOAS (Hypermedia As The Engine Of Application State)
      • data에 다양한 방법으로 하이퍼 링크를 표현한다.
      • JSON으로 하이퍼링크를 표현하는 방법을 정의한 명세들을 활용한다.
        • JSON API
        • HAL
        • UBER
        • Siren
        • Collection+json
        • ...
      • Link, Location 헤더 활용
      • data와 header를 모두 활용하면 좋다.

Layered System

  • 계층화된 시스템 아키텍처를 사용하여 각 구성들 간의 계층을 마음대로 상호 작용 할 수 없도록 제한함으로써 Interface를 일원화 할 수 있다.

Code on demand(optional)

  • 서버가 네트워크를 통해 클라이언트에 전달한 javascript 등과 같은 프로그램들은 그 자체로 실행이 될 수 있어야 한다.
  • client에 보내는 데이터를 바로 실행 가능한 코드를 보내서 이것을 Client에서 실행하는 것을 말한다.
    • javascript 같이 코드를 실행

결론

  • 대부분의 제약조건은 http를 사용하는것으로 만족된다.
  • Uniform Interface 제약조건의 self-description, hateoas 만 불만족한다.
  • self-description을 만족하려면..
    • Custom Media Type 추가하거나
    • profile link relation을 설정
  • hateoas를 만족하려면..
    • HTTP 헤더나 본문에 링크를 담아 만족할 수 있다.

 

참고

728x90
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday