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>를 반환하는 컨트롤러 맵핑 메소드 구현
- 담고싶은 객체를 인자로 받은 EntityModel 객체 생성
- 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 |
코드 설명
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/
'학습 > Spring' 카테고리의 다른 글
[spring] 스프링 부트에서 JDBC와 In-memory DB 사용하기 (0) | 2020.05.05 |
---|---|
[spring] 스프링 웹 MVC의 CORS 지원 (0) | 2020.05.03 |
[spring] 스프링 웹 MVC의 ExceptionHandler (0) | 2020.04.26 |
[spring] 스프링 웹 MVC의 동적 리소스 지원 (Thymeleaf) (0) | 2020.04.25 |
[spring] 스프링에서 WebJars 이용하기 (0) | 2020.04.23 |
댓글