๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ

Springboot

[spring boot] HATEOAS ๊ฐ„๋‹จํ•˜๊ฒŒ ์‚ฌ์šฉํ•ด๋ณด๊ธฐ

HATEOAS ๋ž€?

Hypermedia As The Engine Of Application State ์˜ ์•ฝ์ž์ด๋‹ค.

rest API์—์„œ,

์„œ๋ฒ„๋Š” ํ˜„์žฌ ๋ฆฌ์†Œ์Šค์™€ ์—ฐ๊ด€๋œ ๋งํฌ ์ •๋ณด๋ฅผ ํด๋ผ์ด์–ธํŠธ์—๊ฒŒ ์ œ๊ณตํ•œ๋‹ค.

ํด๋ผ์ด์–ธํŠธ๋Š” ์—ฐ๊ด€๋œ ๋งํฌ ์ •๋ณด๋ฅผ ๋ฐ”ํƒ•์œผ๋กœ ๋ฆฌ์†Œ์Šค์— ์ ‘๊ทผํ•œ๋‹ค.

์—ฐ๊ด€๋œ ๋งํฌ ์ •๋ณด: Relation Hypertext Reference;

 

 HATEOAS ๊ฐ„๋‹จํ•˜๊ฒŒ ์‚ฌ์šฉํ•ด๋ณด๊ธฐ

spring-boot-starter-hateoas ์˜์กด์„ฑ ์ถ”๊ฐ€

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

Entity ์ž‘์„ฑ

@Getter
@Setter
@noargsconstructor
public class Hello {
    private String prefix;
    private String name;
}

Controller ์—์„œ link ์—ฐ๊ฒฐ

@RestController
public class SampleController {

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

        EntityModel<Hello> helloEntity;
        helloEntity = EntityModel.of(hello,
                linkTo(methodOn(SampleController.class).hello()).withSelfRel());
        return helloEntity;
    }
}

 

์ œ์ผ ๊ฐ„๋‹จํ•˜๊ฒŒ ํ˜ธ์ถœ๋œ self์˜ ๋งํฌ๋ฅผ ์—ฐ๊ฒฐํ•ด๋ณด์•˜๋‹ค.

์ถœ๋ ฅ ๊ฒฐ๊ณผ

Test ํ•ด๋ณด๊ธฐ

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

    @Autowired
    MockMvc mockMvc;
    
    // @Autowired
    // ObjectMapper objectMapper;

    @Test
    public void hello() throws Exception {
        mockMvc.perform(get("/hello"))
                .andDo(print())
                .andExpect(status().isOk())
                .andExpect(jsonPath("$._links.self").exists());
    }
}

์ถ”๊ฐ€๋กœ, hateoas๊ฐ€ ์•„๋‹Œ web๋งŒ ์ถ”๊ฐ€ํ•˜๋”๋ผ๋„ ์ œ๊ณตํ•ด์ฃผ๋Š” ObjectMapper ๊ทธ๋ƒฅ ์ฃผ์ž…ํ•ด์„œ ์“ธ ์ˆ˜ ์žˆ๋‹ค.

๊ฐ์ฒด๋ฅผ json์œผ๋กœ ๋ณ€ํ™˜ํ•˜๊ฑฐ๋‚˜ json์„ ๊ฐ์ฒด๋กœ ๋ณ€ํ™˜ํ•  ๋•Œ ์‚ฌ์šฉํ•˜๋Š” ๋งตํผํด๋ž˜์Šค์ด๋‹ค.

์ปค์Šคํ„ฐ๋งˆ์ด์ง•์€ ์„ค์ •ํŒŒ์ผ์—์„œ spring.jackson.* ์ดํ•˜์˜ ์˜ต์…˜๋“ค์„ ํ†ตํ•ด ํ•  ์ˆ˜ ์žˆ๋‹ค.

 

๋งˆ์ง€๋ง‰์œผ๋กœ ๋ง๋ถ™์—ฌ์„œ, HATEOAS๋Š” LinkDiscovers ์ œ๊ณตํ•œ๋‹ค.

ํด๋ผ์ด์–ธํŠธ ์ชฝ์—์„œ ๋งํฌ ์ •๋ณด๋ฅผ Rel ์ด๋ฆ„์œผ๋กœ ์ฐพ์„ ๋•Œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” XPath ํ™•์žฅ ํด๋ž˜์Šค๋ผ๊ณ  ํ•œ๋‹ค.


Building a Hypermedia-Driven RESTful Web Service (๊ณต์‹๋ฌธ์„œ) #

HATEOAS ๋ ˆํผ๋Ÿฐ์Šค #