on
스프링 부트 활용 : 스프링 웹 MVC 10부
스프링 부트 활용
HATEOAS
Hypermedia As The Engine Of Application State를 구현하기 위해 편리한 기능들을 제공해주는 tool(라이브러리)이다.
Hypermedia As The Engine Of Application State는 Rest API를 만들 때, 서버가 리소스에 대한 정보를 제공할 때, 그 리소스와 연관이 되어있는 링크 정보들까지 같이 제공하고, 클라이언트는 제공이 된 연관된 링크 정보를 바탕으로 리소스에 접근한다.
예제
pom.xml에 아래의 의존성을 넣어준다.
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-hateoas</artifactId>
</dependency>
@Test 파일을 만들어준다.
@RunWith(SpringRunner.class)
@WebMvcTest(SampleController.class)
public class SampleControllerTest {
@Autowired
MockMvc mockMvc;
@Test
public void hello() throws Exception {
mockMvc.perform(get("/hello"))
.andDo(print())
.andExpect(status().isOk())
.andExpect(jsonPath("$._links.self").exists());
}
}
테스트를 실행하기 위한 SampleController는 아래와 같다. 이렇게 하면 리소스 정보, 즉 Hello라는 객체가 json으로 변환이 되어 응답으로 나간다.
@RestController
public class SampleController() {
@GetMapping("/hello")
public Hello hello() {
Hello hello = new Hello();
hello.setPrefix("hey, ");
hello.setName("grace");
return hello;
}
}
Hello 객체는 다음과 같다.
public class Hello {
private String prefix;
private String name;
public String getPrefix() {
return prefix;
}
public void setPrefix(String prefix) {
this.prefix = prefix;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public String toString() {
return prefix + " " + name;
}
}
하지만 이대로 test를 돌리면 error가 발생한다. 왜 그럴까? 바로 $._links.self
를 주지 않았기 때문이다.
따라서 링크의 정보를 추가해주어야 한다.
우리가 제공할 리소스의 링크정보를 위해 Hateoas에 있는 EntityModel을 선언한다. 그리고 SampleController 클래스에서 제공하는 hello라는 메서드에 대한 링크를 가져와서 Self라는 릴레이션으로 만들어서 추가한다.
@RestController
public class SampleController() {
@GetMapping("/hello")
public EntityModel<Hello> hello() {
Hello hello = new Hello();
hello.setPrefix("hey, ");
hello.setName("grace");
EntityModel<Hello> helloEntityModel = new EntityModel<>(hello);
helloEntityModel.add(linkTo(methodOn(SampleController.class).hello()).withSelfRel());
return helloEntityModel;
}
}
이렇게 한 후 테스트를 실행하면 link가 추가되는 것을 확인할 수 있다.
이렇게 관련된 링크 정보들을 EntityModel에 추가해서 리턴하는 식으로 구현하고, 클라이언트도 그걸 사용하는 방식이 Hateoas(Rest API의 정점)이다.
ObjectMapper
hateoas 의존성을 추가하면, 스프링 부트가 많은 것을 제공해주는데, 그 중 중요한 두가지가 ObjectMapper와 LinkDiscovers이다.
ObjectMapper는 우리가 제공하는 리소스를 json으로 변환할 때 사용하는 인터페이스로 객체를 json으로 변환하거나, json을 객체로 변환하거나 할 때 사용하는 mapper이다.
따로 등록할 필요없이 주입받아 사용할 수 있다.
LinkDiscovers
XPath를 확장해서 만든 HATEOAS 용 클라이언트 API이다.
rest api로 다른쪽 서버 api를 요청해서 받았는데, 그게 hateoas를 지원한다면(링크 정보를 담고 있다면) 메서드를 이용해서 self에 해당하는 링크정보를 가져올 수 있다.
Reference
Comments
SPRING BOOT 의 다른 글
-
스프링 부트 활용 : 스프링 데이터 4부 17 Sep 2021
-
스프링 부트 활용 : 스프링 데이터 3부 16 Sep 2021
-
스프링 부트 활용 : 스프링 데이터 2부 15 Sep 2021
-
스프링 부트 활용 : 스프링 데이터 1부 14 Sep 2021
-
스프링 부트 활용 : 스프링 웹 MVC 11부 13 Sep 2021
-
스프링 부트 활용 : 스프링 웹 MVC 10부 10 Sep 2021
-
스프링 부트 활용 : 스프링 웹 MVC 9부 09 Sep 2021
-
스프링 부트 활용 : 스프링 웹 MVC 8부 08 Sep 2021
-
스프링 부트 활용 : 스프링 웹 MVC 7부 03 Sep 2021
-
스프링 부트 활용 : 스프링 웹 MVC 6부 05 Aug 2021
-
스프링 부트 활용 : 스프링 웹 MVC 5부 27 Jun 2021
-
스프링 부트 활용 : 스프링 웹 MVC 4부 13 Jun 2021
-
스프링 부트 활용 : 스프링 웹 MVC 3부 06 Jun 2021
-
스프링 부트 활용 : 스프링 웹 MVC 2부 05 Jun 2021
-
스프링 부트 활용 : 스프링 웹 MVC 1부 30 May 2021
-
스프링 부트 활용 : Spring-Boot-Devtools 30 May 2021
-
스프링 부트 활용 : 테스트 26 May 2021
-
스프링 부트 활용 : 로깅 2부 25 May 2021
-
스프링 부트 활용 : 로깅 1부 23 May 2021
-
스프링 부트 활용 : 프로파일 23 May 2021
-
스프링 부트 활용 : 외부 설정 2부 21 May 2021
-
스프링 부트 활용 : 외부 설정 1부 15 May 2021
-
스프링 부트 활용 : SpringApplication 11 May 2021
-
스프링 부트 원리 : 정리 06 May 2021
-
스프링 부트 원리 : 독립적으로 실행 가능한 JAR 06 May 2021
-
스프링 부트 원리 : 내장 웹 서버 04 May 2021
-
스프링 부트 원리 : 자동 설정 02 May 2021
-
스프링 부트 원리 : 의존성 01 May 2021
-
스프링 부트 시작하기 01 May 2021