티스토리 뷰

웹개발

[Day2]REST API - HATEOAS

rangrangerang 2019. 7. 2. 18:32


PART 0

REST API의 단점

  1. 엔드포인트 URL 변경 시 모두 수정해야함
  2. 자원의 상태를 고려하지 않음
=> 이러한 단점을 보완한 방식이 HATEOAS



PART 1

REST 구현의 3단계




LEVEL0. REST 도입 전

모든 전송과 응답을 POST로 하며 접근 가능한 엔드 포인트는 하나이다.

HTTP의 body에 정보를 넣어 전송하는 기존의 리소스 전송 방식을 사용한다.


LEVEL1. 리소스 도입

REST를 도입하여 고유의 URI로 각각의 제공하는 자원을 주고 받는다.

모든 자원을 제공함으로써 클라이언트는 다양한 자원과 포맷을 제공 받을 수 있다.

ex)JSON, XML


LEVEL2. HTTP

URL과 HTTP method를 적극적으로 활용한다.

해당 HTTP method로 어떻게 요청 하든 같은 응답을 받을 수 있다.



LEVEL3. Hypermedia Controls

하이퍼 미디어의 링크를 이용하는 방식

서버가 클라이언트에게 자원을 보내면서 다음 작업을 할 수 있는 URL을 링크로 같이 보낸다.

클라이언트는 링크를 확인하고 다음 작업을 할 수 있는 URL을 확인한다.

LEVEL3로 REST API의 URL 변경시 REST API의 단점을 해결할 수 있다.




PART 2

HATEOAS(Hypermedia As The Engine Of Applicaion state)

LINK에 사용 가능한 URL을 리소스로 전달하여 클라이언트가 참고하여 사용할 수 있도록 한다.

예제 코드 1 : 전형적인 REST API의 응답 데이터

{  
  “accountId”:12345,
  “accountType”:”saving”,
  “balance”:350000”,
  “currency”:”KRW”
}

예제 코드 2 : HATEAOS가 도입되어 자원에 대한 추가 정보가 제공되는 응답 데이터

{
  “accountId”:12345,
  “accountType”:”saving”,
  “balance”:350000”,
  “currency”:”KRW”
  “links”: [
       {
       “rel”: “self”
       “href”: “http://localhost:8080/accounts/1”
       },
       {
       “rel”: “withdraw”,
       “href”: “http://localhost:8080/accounts/1/withdraw”
       },
       {
       “rel”:”transfer”,
         “href”:”http://localhost:8080/accounts/1/transfer”
       }
  ]
}

HATEAOS를 통해 표현된 데이터에는 해당 자원의 상태에 따라 접근 가능한 추가 API들이 links라는 이름으로 제공된다. 예제의 경우 해당 계좌에는 현재 350,000원의 잔액이 존재하므로 인출(Withdraw)및 송금(Transfer)을 실행할 수 있는 API의 엔드포인트들이 제공되며 rel 키워드에 의해 각 엔드포인트에 대한 유일한 이름이 할당된다. 따라서 클라이언트는 이 rel 이름만 알면 해당 기능의 실행 가능 여부 및 이를 실행하기 위해 필요한 데이터 역시 손쉽게 판단할 수 있게 된다. 또한 API 개발자들은 최초 진입을 위한 API 엔드포인트를 제외한 나머지 URL들을 얼마든지 수정할 수 있다.







[References]

https://otrodevym.tistory.com/entry/Spring-HATEOAS-%ED%8A%B9%EC%A7%95%EA%B3%BC-%EC%84%A4%EC%A0%95-%EC%A0%95%EB%A6%AC

https://martinfowler.com/articles/richardsonMaturityModel.html https://m.blog.naver.com/PostView.nhn?blogId=tmondev&logNo=220391644590&proxyReferer=https%3A%2F%2Fwww.google.com%2F



'웹개발' 카테고리의 다른 글

JWT  (1) 2019.07.12
쿠키/세션/캐시  (1) 2019.07.12
HTTP vs HTTPS  (1) 2019.07.12
[Day2] REST API  (5) 2019.07.02
[Day1] HTTP request method  (2) 2019.07.01
댓글