HATEOAS 는 Hypermedia As the Engine Of Application State 의 약자로 리소스와 연관된 또는 호출 가능한 자원 상태 정보를 제공해주는 기능을 말한다.
클라이언트가 서버로부터 어떠한 요청을 할 때, 요청에 필요한 URI를 응답에 포함시켜 반환하는 것을 말한다.
REST API 개발을 할 때 가장 기본적인 Level 0번째 단계는 REST API 라고 볼 수는 없고 컴퓨터가 가지고 있는 자원을 의미없이 전달해주는 단계라고 볼 수 있다.
컴퓨터 자원 전달 -> 리소스 -> HTTP 메서드 상태 -> 추가적으로 다른 정보도 전달
HATEOAS 기능을 사용하기 위해선 pom.xml 에 라이브러리를 추가해줘야 한다.
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-hateoas</artifactId>
</dependency>
스프링 버전에 따라 코드가 조금 다르니 찾아봐야 할 것 같다.
Spring 2.1.8.RELEASE | Spring 2.2 이상 |
Resource | → EntityModel |
ControllerLinkBuilder | → WebMvcLinkBuilder |
나는
버전이 2.7.3으로 2.2 이상 버전으로 사용하면 된다.
[ Hateoas 적용 전 ]
//GET /users/1 or /users/10 -> String 형태로 전달
@GetMapping("/users/{id}")
//사용자 1명 반환 메서드
public User retrieveUser(@PathVariable int id){
User user = service.findOne(id);
if(user == null){
throw new UserNotFoundException(String.format("ID[%s] not found",id));
}
return user;
}
[ Hateoas 적용 ]
//GET /users/1 or /users/10 -> String 형태로 전달
@GetMapping("/users/{id}")
//사용자 1명 반환 메서드
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));
}
//HATEOAS
// EntityModel<User> model = EntityModel.of(user,linkTo(methodOn(this.getClass()).retrieveAllUsers()).withRel("all-users"));
//매개변수에 위에서 검색된 user변수를 지정
EntityModel<User> entityModel = EntityModel.of(user);
//user 반환시 추가시킬 수 있는 링크를 추가
WebMvcLinkBuilder linkBuilder = WebMvcLinkBuilder
.linkTo(WebMvcLinkBuilder.methodOn(this.getClass()).retrieveAllUsers());
entityModel.add(linkBuilder.withRel("all-users"));
return entityModel;
}
linkBuilder2에 보면 WebMvcLinkBuilder를 지우면 linkTo에 빨간색 표시가 되는데 Alt + Enter 로 보면 static method 를 import 하라는 문구를 볼 수 있다. static method 를 가져오기위해서 사용할 수 있다.
WebMvcLinkBuilder linkBuilder2 = linkTo(methodOn(this.getClass()).retrieveAllUsers());
그러면 코드가 이렇게 수정된 것을 볼 수있고,
import static org.springframework.hateoas.server.mvc.WebMvcLinkBuilder.linkTo;
import static org.springframework.hateoas.server.mvc.WebMvcLinkBuilder.methodOn;
위에 import 부분에 이렇게 static import 가 추가된 것을 볼 수 있다.
WebMvcLinkBuilder 클래스를 사용하지 않은채 LinkTo와 methodOn을 사용할 수 있다.
retrieveUser 라는 이름의 전체사용자 목록보기 메서드를 Link에 가져다 놓을 것이고 link작업을 해서 하이퍼미디어로 연결할 수 있도록 작업을 한 것이다.
서버를 실행시킨 후 포스트맨에서 확인을 해보았더니
PropertyFilter 를 사용할 수 없다는 오류가 발생하였다. => Filtering 작업 설정
이전에 설정해둔 @JsonFilter 를 주석처리 후 서버를 재기동시켜보았다.
다시 포스트맨에서 확인해보니 정상적으로 200번 코드를 볼 수 있다.
https://haruhiism.tistory.com/200
실습을 하면서 조금 어려운 부분이나 헷갈리는 부분은 위의 게시글을 참고해서 정리를 해보려고 했다.
링크들을 같은 패턴으로 추가를 하거나, 파생할 수 있는 추가적인 작업도 확인해 볼 수 있다.
'프로그래밍 > SPRING BOOT' 카테고리의 다른 글
[인프런 : spring-boot] Swagger 구현 방법 (0) | 2022.09.02 |
---|---|
[인프런 : spring-boot] Swagger 사용 (0) | 2022.09.02 |
[인프런 : spring-boot] REST API Version 관리 (2) (0) | 2022.09.02 |
[인프런 : spring-boot] REST API Version 관리 (1) (1) | 2022.09.01 |
[인프런 : spring-boot] 프로그래밍으로 제어하는 Filtering (1) | 2022.09.01 |