반응형

 

 

HATEOAS

(Hypermedia As the Enging Of Application State)

 

현재 리소스와 연관된(호출 가능한) 자원 상태 정보를 제공 -> 결국 하이퍼미디어 mapping !

 

RESTful API를 사용하는 클라이언트가 전적으로 서버와 동적인 상호작용이 가능하도록 하는데,

하나의 리소스에서 파생할 수 있는 여러가지 추가 작업의 정보들을 한번에 얻을 수 있다.

 

 

 

링크를 통해서 다른 페이지로 가는 것을 다른 상태로 전이한다고 보고

이 링크들에 대한 레퍼런스를 서버 측에서 전송한다.
그럼으로서 클라이언트가 명시적으로 링크를 작성하지 않고도 

서버 측에서 받은 링크의 레퍼런스를 통해 어플리케이션의 상태 및 전이를 표현할 수 있다. 
이것이 바로 올바른 REST 아키텍처에서의 HATEOAS 구성법이다.

 

장점
- 요청 URI가 변경되더라도 클라이언트에서 동적으로 생성된 URI를 사용함으로써, 

   클라이언트가 URI 수정에 따른 코드를 변경하지 않아도 되는 편리함을 제공한다.
- URI 정보를 통해 들어오는 요청을 예측할 수 있게 된다.
- Resource가 포함된 URI를 보여주기 때문에, Resource에 대한 확신을 얻을 수 있다

 

HATEOAS란? 

 

Hateoas란 REST Api를 사용하는 클라이언트가 전적으로 서버와 동적인 상호작용이 가능하도록 하는 것을 의미합니다. 이러한 방법은 클라이언트가 서버로부터 어떠한 요청을 할 때, 요청에 필요한 URI를 응답에 포함시켜 반환하는 것으로 가능하게 할 수 있습니다

라고 위키에 정의 되어 있다. 

 

HATEOAS를 사용해보자 

 

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

우선 디펜던스를 폼.xml에 추가 해보자 

 

이렇게 되면 우선 사용이 가능하다. 

 

 

@GetMapping("/users/{id}")
public Resource<User> retrieveUser(@PathVariable int id) {
    User user = service.findOne(id);

    if (user == null) {
        throw new UserNotFoundException(String.format("ID[%s] not found", id));
    }

    // HATEOAS
    Resource<User>  resource = new Resource<>(user);
    ControllerLinkBuilder linkTo = linkTo(methodOn(this.getClass()).retrieveAllUsers());
    resource.add(linkTo.withRel("all-users"));

    return resource;
}

우선 User 객체를 반환한다. 

user 객체가 추가적으로 사용할 수 있는 정보(링크)를 하이퍼미디어 타입으로 넣어준다. 

이때 static 메소드를 사용하면 아래의 코드를 길게 쓰지 않아도 된다.

 

//ControllerLinkBuilder linkTo = ControllerLinkBuilder.linkTo(
        //ControllerLinkBuilder.methodOn(this.getClass()).retrieveAllUsers());

retrieveAllUsers() 메소드와 "all-users" 이름으로 링크를 작업한다. 

 

link작업이 완료 되었다.

반응형

+ Recent posts