본문 바로가기
Programming/SpringBoot

[Spring Boot] RESTful Service 강의 정리 (6) - Implementing HATEOAS / level3단계의 REST API 구현

by prinha 2020. 8. 25.
반응형

 

 

[Spring Boot] RESTful Service 강의 정리 (5) - REST API Version 관리(URI, Request Parameter, Header, Mime Type 이용)

[Spring Boot] RESTful Service 강의 정리 (4) - Response 데이터 제어를 위한 Filtering / 사용자 조회 예제 [Spring Boot] RESTful Service 강의 정리 (3) - Response 데이터 형식 변환(XML format) [Spring Boo..

prinha.tistory.com


 

HATEOAS

(Hypermedia As the Enging Of Application State)

 

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

 

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

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

 

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

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

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

 

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

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


HATEOAS 구현 방법

1) pom.xml에 add dependency

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

 

2) Controller에 Code 추가

필자의 경우 2.1 버전 사용중이라 첫번째 코드 작성

 

// UserController

    @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));
        }

        // User 객체 반환
        Resource<User> resource = new Resource<>(user);

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

        //static method 사용하면 아래의 코드 처럼 길게 쓰지 않아도 됨
        //ControllerLinkBuilder linkTo = ControllerLinkBuilder.linkTo(
        //ControllerLinkBuilder.methodOn(this.getClass()).retrieveAllUsers());
        
       	//import static org.springframework.hateoas.mvc.ControllerLinkBuilder.linkTo;
        //import static org.springframework.hateoas.mvc.ControllerLinkBuilder.methodOn;
        ControllerLinkBuilder linkTo = linkTo(methodOn(this.getClass()).retrieveAllUsers());

        // retrieveAllUsers() 메소드와 "all-users" 이름 링크 작업
        resource.add(linkTo.withRel("all-users"));

        return resource;
    }

 

link작업 완료 (all-users, users 유심히 보기)

 

all-users, retrieveAllUsers

 

경로-> /users

 


출처 및 참고

https://engkimbs.tistory.com/866

https://wallees.wordpress.com/2018/04/19/rest-api-hateoas/

 

 

 

 

반응형