본문 바로가기
학습/Spring

[spring] 스프링 부트의 Hateoas 지원

by KKambi 2020. 5. 3.

Hateoas?

Hypermedia As The Engine Of Application State

 

- REST 아키텍쳐의 구성 요소

- REST API에서 리소스를 제공할 때, 연관된 링크 정보를 함께 제공

- 클라이언트는 연관 링크 정보를 바탕으로 리소스에 접근

- 다른 상태로 전이할 수 있는 링크 레퍼런스를 제공

 

 

의존성 추가 필요

spring-boot-starter-hateoas 추가

 

- ObjectMapper 사용

    • spring-boot-starter-web 추가 시, Bean으로 등록되는 ObjectMapper
    • json으로 변환할 때 사용하는 인터페이스
    • spring.jackson.* 프로퍼티로 커스터마이징 가능

- LinkDiscovers 제공

  • xPath를 확장해서 만든 hateoas용 클라이언트 API
  • 유틸리티성 클래스

 

 

반환하는 json에 링크정보 ($._links)를 추가하는 방법

EntityModel<T>를 반환하는 컨트롤러 맵핑 메소드 구현

  1. 담고싶은 객체를 인자로 받은 EntityModel 객체 생성
  2. EntityModel에 링크 추가
1
2
3
4
5
6
7
8
9
10
11
12
13
@RestController
public class SampleController {
    
    @GetMapping
    public EntityModel<Sample> sample(){
        Sample sample = new Sample();
        sample.setName("sam");
 
        EntityModel<Sample> sampleEntityModel = new EntityModel<>(sample);
 
        sampleEntityModel.add(linkTo(methodOn(SampleController.class).sample()).withSelfRel();
    }
}
cs

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
@RunWith(SpringRunner.class)
@WebMvcTest
public class SampleControllerTest{
    
    @Autowired
    MockMvc mockMvc;
 
    @Test
    public void sample(){
        mockMvc.perform(get("/sample"))
            .andDo(print())
            .andExpect(status().isOk())
            .andExpect(jsonPath("$_links.self").exist());
    }
}
cs

해당 이미지는 hello()로 테스트

 

코드 설명

EntityModel<T>

  • RepresentationModel을 extend
  • 도메인 객체를 감싸고, 그에 링크를 추가하는 객체
  • add( ) : 링크 추가 메소드
  • sampleEntityModel.add(new Link("https://myhost/people/42")); 처럼 링크 인스턴스 추가 가능

 

WebMvcLinkBuilder의 linkTo( )

  • 컨트롤러 클래스를 가리키는 WebMvcLinkBuilder 객체를 반환

 

WebMvcLinkBuilder의 methodOn( )

  • 타겟 메소드(sample())의 가짜 메소드 콜이 있는 컨트롤러 프록시 클래스를 생성
  • 직접 메소드 객체를 만드는 것보다 유연한 표현이 가능

 

LinkBuilderSuppoert의 withSelfRel( )

  • 빌더의 build( ) 역할
  • 현재 빌더 인스턴스를 self relationship으로 하여 링크 객체 생성

 

백기선님의 강의에서 사용된 메소드들은 deprecated

이유 : 리소스 자체를 나타내기보단, 하이퍼미디어 정보가 담길 수 있는 Representation model이기 때문에 변경

즉, 우리가 제공할 리소스에 링크 정보를 추가할 수 있는 객체들!

  • ResourceSupport → RepresentationModel
  • Resource → EntityModel
  • Resources → CollectionModel
  • PagedResources → PagedModel

 

 

 

참고

https://docs.spring.io/spring-hateoas/docs/current/reference/html/

댓글