🍃 Spring/🌱 Spring Boot를 이용한 RESTful Web Service

[Spring Boot를 이용한 RESTful Web Services 개발] 27~28강

락꿈사 2022. 2. 11. 14:46

HATEOAS 설명

  • HATEOAS : Hypermedia As the Engine Of Application State의 약자로 현재 사용하고 있는 RESTful의 리소스와 연관된, 또는 호출 가능한 추가적인 자원의 상태 정보를 함께 제공해주는 기능
  • 하나의 Resource에서 파생하는 여러가지 추가 data 전달 작업 가능

  • 리처드슨의 REST 성숙도 모델 (https://jinson.tistory.com/190 <- 링크 참고 )
    • Level 0 : REST API라고 보기 어려움. 네트워크를 통해서 컴퓨터가 가지고 있는 자원을 의미 없이 전달해주는 단계
    • Level 1 : Resources 만을 이용하는 단계
    • Level 2 : HTTP 상태를 이용하는 단계
    • Level 3: Resource의 정보를 추가로 새로운 요소와 함께 전달해주는 단계

 

Level3 단계의 REST API 구현을 위한 HATEOAS 적용

  • pom.xml 파일에 의존성 추가
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-hateoas</artifactId>
</dependency>
  • UserCotroller 클래스의 retrieveUser 메소드에 적용
  • 현재 가지고 있는 전체 사용자 목록 보기 메소드인 retrieveAllUsers() 메소드와 "all-users"라는 이름을 링크하여 하이퍼미디어로 연결
  • 이 값을 user 데이터와 함께 클라이언트에게 반환함
  • User DTO의 @JsonFilter 어노테이션 주석처리
import org.springframework.hateoas.EntityModel;
import org.springframework.hateoas.server.mvc.WebMvcLinkBuilder;

import static org.springframework.hateoas.server.mvc.WebMvcLinkBuilder.linkTo;
import static org.springframework.hateoas.server.mvc.WebMvcLinkBuilder.methodOn;

@GetMapping("/users/{id}")
public EntityModel<User> retrieveUser(@PathVariable int id){
    User user = service.findOne(id);
    if (user == null){
        throw new UserNotFoundException(String.format("ID[%s] not found", id));
    }

    // EnityModel 객체 생성하여 위에서 받아온 user 객체를 매개변수로 넣어줌
    EntityModel<User> model = EntityModel.of(user);
    // user값을 반환할 때 클라이언트가 사용할 수 있는 추가적인 정보 링크를 하이퍼미디어 타입으로 넣어줌
    // 이 클래스가 가지고 있는 data 중에서 retrieveAllUsers()이라는 메소드를 넣어줌
    WebMvcLinkBuilder linkTo = linkTo(methodOn(this.getClass()).retrieveAllUsers());
    // 위에서 생성했던 model 객체에 "all-users"라는 이름으로 링크 추가
    model.add(linkTo.withRel("all-users"));

    return model;
}

user DTO 내의 정보와 함께 _links 항목에 "all-users"라는 이름으로 서버 주소, 서버의 포트번호, users 등이 적인 전체 사용자 조회 링크가 전달된 것 확인