[Spring Boot #19] 스프링 부트 Spring HATEOAS

2021. 3. 24. 19:06 Spring Framework/Spring boot #2

| HATEOAS란?

 

HATEOAS Hypermedia As The Engine Of Application State의 약자로 하이퍼미디어 REST API의 상태 정보를 관리하기 위한 매커니즘으로 활용하는 것을 말합니다. REST API에서 클라이언트에 리소스를 넘겨줄 때 특정 부가적인 리소스의 링크 정보를 넘겨주게 되며 이를 통해 REST API의 리소스 상태에 따른 관리를 진행하게 됩니다.

 

HATEOAS를 쓰는 이유는 다음과 같은 기존 REST API의 단점을 보완하기 위해서입니다.

 

1. REST API는 앤드포인트 URL이 정해지고 나면 이를 변경하기 어렵다는 단점이 있습니다. 만일 API URL을 변경하게 되면 모든 클라이언트의 URL까지 수정해야하기 때문에 번거로워지므로 기존 다른 API를 지속적으로 추가하게 됩니다. 따라서 URL 관리가 어렵게 됩니다. 

2. 전달받은 정적 자원의 상태에 따른 요소를 서버 단에서 구현하기 어렵기 때문에 클라이언트 단에서 이 부분에 대한 로직을 처리해야 합니다.

 

위 단점들을 links 요소를 통해 href 값의 형태로 보내주기 때문에 자원 상태에 대한 처리를 링크에 있는 URL을 통해 처리할 수 있게됩니다.

 

| 샘플 코드

 

의존성 추가

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-hateoas</artifactId>
</dependency>

 

테스트 코드

@RunWith(SpringRunner.class)
@WebMvcTest(SampleController.class)
public class SpringBootTutorialApplicationTests {

    @Autowired
    MockMvc mockMvc;

    @Test
    public void hello() throws Exception {
        mockMvc.perform(get("/hello"))
                .andDo(print())
                .andExpect(status().isOk())
                .andExpect(jsonPath("$._links.self").exists());
    }
}
  • _links는 HATEOAS를 구현하기 위해 스프링 부트에서 생성한 JSON name입니다. 그리고 그 뒤의 self는 자기 참조를 뜻하는 것을 JSON을 통해서 나타낸 것입니다.

 

소스 코드

@SpringBootApplication
public class SpringBootTutorialApplication {

    public static void main(String[] args) {
        SpringApplication.run(SpringBootTutorialApplication.class, args);
    }

}
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;
    }
}
@RestController
public class SampleController {

    @GetMapping("/hello")
    public Resource<Hello> hello(){
        Hello hello = new Hello();
        hello.setPrefix("Hey,");
        hello.setName("saelobi");

        Resource<Hello> helloResource = new Resource<>(hello);
        helloResource.add(linkTo(methodOn(SampleController.class).hello()).withSelfRel());

        return helloResource;
    }
}
  • Resource 객체에 HATEOAS를 구현하기 위해 /hello URL의 링크 정보를 추가하는 것을 볼 수 있습니다.
  • withSelfRel 메서드를 통해서 해당 URL이 자기 참조인 것을 나타내고 있습니다.

 

결과 화면

 

 

참고자료 : https://www.inflearn.com/course/스프링부트



출처: https://engkimbs.tistory.com/780?category=767865 [새로비]