HATEOAS 에 대해서 알아보자
우선, HATEOAS 의 약자는 아래와 같음.
Hypermedia As The Engine Of Application State
HATEOAS 의 특징
REST 어플리케이션 아키텍처의 제약 중 하나.
주어진 자원에 대한 관련 Link 를 RESTful 서비스에 표시하는 개념을 제공함.
즉, 특정 리소스의 세부 정보를 반환할때, 리소스를 수행할 수 있는 작업에 대한 Link 와 관련 리소스에 대한 Link 도 반환함.
서비스 소비자가 응답에서 Link를 사용해 트랜잭션을 수행할 수 있으면,
모든 Link를 하드 코딩할 필요가 없는 장점.
다시말해서, HATEOAS는 서비스공급자와 소비자간의 결합을 줄이는데 유용함.
참고페이지
https://en.wikipedia.org/wiki/HATEOAS
로이 필딩에 의해 제시된 HATEOAS 와 관련된 제약 조건
참고 블로그
https://roy.gbiv.com/untangled/2008/rest-apis-must-be-hypertext-driven
주요 내용
A REST API must not define fixed resource names or hierarchies (an obvious coupling of client and server). Servers must have the freedom to control their own namespace. Instead, allow servers to instruct clients on how to construct appropriate URIs, such as is done in HTML forms and URI templates, by defining those instructions within media types and link relations.
A REST API should be entered with no prior knowledge beyond the initial URI (bookmark) and set of standardized media types that are appropriate for the intended audience (i.e., expected to be understood by any client that might use the API). From that point on, all application state transitions must be driven by client selection of server-provided choices that are present in the received representations or implied by the user’s manipulation of those representations. The transitions may be determined (or limited by) the client’s knowledge of media types and resource communication mechanisms, both of which may be improved on-the-fly (e.g., code-on-demand).
그럼, HATEOAS 에 대한 예시를 한번 알아보자.
요청
응답
설명
응답에는 아래 Link 가 포함돼어 있음.
/accounts/12345/deposit
/accounts/12345/withdraw
/accounts/12345/transfer
/accounts/12345/close
즉, 서비스 소비자가 입금을 원한다면, 응답에서 입금 URL을 가져와 입금요청을 전송할 수 있음.
다시말해서, 서비스 공급자 / 서비스 소비자간의 결합을 감소시키는 장점이 있음을 알 수 있음.
그럼, HATEOAS관련 샘플코드를 작성해보자.
우선, 아래 의존성을 pom.xml 파일에 추가함.
그리고, 컨트롤러에 아래 소스를 코딩한다.
ThubUserController.java
...(생략)... @RestController public class ThubUserController { ...(생략)... @GetMapping("/thubusers/rank/{rank}") public EntityModel<ThubUser> retrieveThubUserResource(@PathVariable int rank){ ThubUser thubUser = thubUserService.retrieveThubUserRank(rank); if(thubUser == null) { throw new ThubUserNotFoundException("User not found!"); } EntityModel<ThubUser> thubUserResource = new EntityModel<ThubUser>(thubUser); ControllerLinkBuilder linkTo = ControllerLinkBuilder.linkTo(ControllerLinkBuilder.methodOn(this.getClass()).retrieveThubUser(thubUser.getNickname())); thubUserResource.add(linkTo.withRel("parent")); return thubUserResource; } ...(생략)... }
설명
rank 을 통해서 User 를 찾고,
_links 절에는 parent 에 "http://localhost:8080/thubusers/magic1" 로 연결된 href 를 갖고 있는 예시임.
그럼, 서버를 다시 기동한 후 정상적으로 응답에 HATEOAS 링크 정보가 보내지는 지를 테스트 해보자
서버가 정상 기동됨을 확인함.
Postman 을 통해서 8080 포트로 서비스를 요청해보자.
설명
위와 같이 정상적으로 HATEOAS 링크 정보가 전송됨을 확인할 수 있음.
결론
HATEOAS 의 약자는 아래와 같음.
Hypermedia As The Engine Of Application State
HATEOAS는 서비스공급자와 소비자간의 결합을 줄이는데 유용함.
오늘도, HATEOAS 란 개념과 지식에 대한 마술(?) 한가지 획득완료! 감사합니다. ^^
오늘의 명언 한마디
목표를 달성한 사람들, 성공한 사람들에게는 하나의 중요한 공통점이 있다.
바로 인내하는 습관이다. 아무리 화가 나도, 도저히 수긍하지 못해도, 죽을 만큼 힘이 들어도 꾹 참고 목표에 도달할 때까지 굳센 마음으로 초지일관하는 인내심이다.
막연한 두려움과 동요 그리고 조바심은 금물이다.
전옥표지음, "슴관부터 바꿔라" 중에서.
오늘의 영어 한마디
My friend turned against me after I argued with him.
나의 친구는 / 반대했다 / 나를 / 내가 말다툼한 후에 / 그와
설명
"turn against" 는 ~을 반대하다라는 의미
"argue with" 는 ~와 논쟁하다, 말다툼하다라는 뜻을 지님.
오늘의 민법 한마디
제1편 총칙 / 제5장 법률행위 /제4절 무효와 취소
제138조(무효행위의 전환)
무효인 법률행위가 다른 법률행위의 요건을 구비하고, 당사자가 그 무효를 알았더라면, 다른 법률행위를 하는 것을 의욕하였으리라고 인정될 때에는 다른 법률행위로서 효력을 가진다.
나의 목표 및 다짐을 항상 내곁에 두기.
목표
나의 강점을 바탕으로 나의 일을 잘해냄으로써 타인과 사회를 아릅답게 만든다.
현재 내가 가진 능력으로 누군가에 도움이 될 수 있을까? 에 대해서 항상 생각하기
목표를 이루기 위한 실천방안
꾸준한 블로깅/기록법/독서법으로 넘버원이 아닌 온리원이 되보자.
천사불여일행(千思不如一行)을 항상생각하며 체화 및 각인시키자.
"천번 생각하는것보다 한번 행동하는 것이 더 중요하다."
기기일약 불능십보(騏驥一躍 不能十步) / 노마십가 공재불사(駑馬十駕 功在不舍)
천리마도 한번에 열걸음을 뛸 수 없고, 느리고 둔한말이라도 열흘이면 하룻길을 간다.
'좋아하는 것_매직IT > 1.spring' 카테고리의 다른 글
30.Spring, 서비스의 문서화에 대한 필요성을 알아보고 간단한 샘플프로그램을 만들어 보자. (0) | 2021.02.06 |
---|---|
29.Spring, 데이터 유효성체크에 대해서 알아보고 간단한 샘플프로그램을 만들어 보자. (0) | 2021.02.06 |
27.Spring, 예외처리(Exception)에 대해서 알아보고 간단한 샘플 프로그램을 만들어보자. (0) | 2021.02.06 |
26.Spring, REST(Representational State Transfer)에 대해서 알아보고 간단한 샘플 프로그램을 만들어보자. (0) | 2021.02.06 |
25.Spring, Spring Boot 의 주요 스타터 프로젝트를 알아보자. (0) | 2021.02.06 |