🍃 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;
}
