스프링 부트 - HATEOAS(Hypermedia As The Engine Of Application State)
- 링크에 사용 가능한 URL을 리소스로 전달하여 client가 참고하여 사용할 수 있도록 하는 것
- HATEOAS는 RESTful API를 사용하는 클라이언트가 전적으로 서버에 의해 동적으로 상호작용을 할 수 있다.
- 클라이언트가 서버에 요청시 서버는 요청에 의존되는 URI를 Response에 포함시켜 반환한다.
REST API
- REST API는 Representational State Transfer API의 약자로, 간단히 설명하면 웹 애플리케이션이 제공하는 각각의 데이터를 리소스, 즉 자원으로 간주하고 각각의 자원에 고유한 URI(Uniform Resource Identifier)를 할당함으로써 이를 표현하는 API를 정의하기 위한 소프트웨어 아키텍처 스타일이다.
의존성 추가
1
2
3
4<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-hateoas</artifactId>
</dependency>테스트 코드
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15.class) (SpringRunner
@WebMvcTest(SampleController.class)
public class SampleControllerTest {
MockMvc mockMvc;
public void hello() throws Exception {
mockMvc.perform(MockMvcRequestBuilders.get("/hello"))
.andDo(print())
.andExpect(status().isOk())
.andExpect(jsonPath("$._links.self").exists());
}
}_links
는 HEATEOAS를 구현하기 위해 스프링 부트에서 생성한 JSON name이다. 그 뒤의 self는 자기 참조를 뜻하는 것을 JSON을 통해서 나타낸 것이다.
소스 코드
DemospringhateoasApplication.java
1
2
3
4
5
6
7
8
public class DemospringhateoasApplication {
public static void main(String[] args) {
SpringApplication.run(DemospringhateoasApplication.class, args);
}
}Hello.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27public 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;
}
public String toString() {
return prefix+ " " + name;
}
}SampleController.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
public class SampleController {
"/hello") (
public EntityModel<Hello> hello(){
Hello hello = new Hello();
hello.setPrefix("Hey, ");
hello.setName("Kwon");
EntityModel<Hello> helloEntityModel = new EntityModel<>(hello);
helloEntityModel.add(linkTo(methodOn(SampleController.class).hello()).withSelfRel());
return helloEntityModel;
}
}EntityModel 객체에 HATEOAS를 구현하기 위해
/hello
URL의 링크 정보를 추가한다.withSelfRel 메소드로 해당 URL이 자기 참조인 것을 나타낸다.
Body = {"prefix":"Hey, ","name":"Kwon","_links":{"self":{"href":"http://localhost/hello"}}}
- 테스트를 돌려보면 다음과 같이 추가된 링크 정보가 출력되는 것을 볼 수 있다.
참조
https://www.inflearn.com/course/%EC%8A%A4%ED%94%84%EB%A7%81%EB%B6%80%ED%8A%B8/dashboard