객체 각각 링크를 달아보자!
지난 글에서 Hateoas를 통해 링크를 달아보았습니다. 그러나 객체 각각에는 링크가 달리지 않습니다. 이번에는 객체 각각에 모두 링크를 달아보겠습니다.
원래의 Post객체가 아니라 PostResource 객체가 반환되도록합니다.
@Getter
public class PostResource extends RepresentationModel<PostResource> {
private Long id;
private String title;
private String content;
private User user;
private List<File> fileList;
public PostResource(Post post){
this.id = post.getId();
this.title = post.getTitle();
this.content = post.getContent();
this.user = post.getUser();
this.fileList = post.getFileList();
}
}
객체 각각에 링크를 달아주는 클래스인 PostAssembler 클래스를 생성합니다.
@Component
public class PostAssembler extends RepresentationModelAssemblerSupport<Post,PostResource> {
public PostAssembler(){
super(PostController.class,PostResource.class);
}
/*
entity를 resource 객체로 변환
*/
@Override
protected PostResource instantiateModel(Post entity) {
return new PostResource(entity);
}
/*
entity의 id로 링크를 만들고 resource객체로 반환
EX) id 1의 post
/post/1
*/
@Override
public PostResource toModel(Post entity) {
return createModelWithId(entity.getId(),entity);
}
/*
entity 여러개를 한번에 변환하여 CollectionModel로 반환
*/
@Override
public CollectionModel<PostResource> toCollectionModel(Iterable<? extends Post> entities) {
List<PostResource> postList = new ArrayList<>();
for(Post entity : entities)
postList.add(toModel(entity));
return CollectionModel.of(postList);
}
}
PostResource를 반환하도록 수정합니다.
@RestController
@RequiredArgsConstructor
@RequestMapping("/post")
public class PostController {
private final PostService postService;
private final PostAssembler postAssembler;
@GetMapping
public ResponseEntity<?> getPost(@PageableDefault Pageable pageable){
Page<Post> postList = postService.getPostList(pageable);
CollectionModel<PostResource> collectionModel = postAssembler.toCollectionModel(postList);
PageMetadata pageMetadata = new PageMetadata(pageable.getPageSize(),postList.getNumber(),postList.getTotalElements());
PagedModel<PostResource> body = PagedModel.of(collectionModel.getContent(),pageMetadata);
body.add(linkTo(methodOn(PostController.class).getPost(pageable)).withSelfRel());
return ResponseEntity.ok(body);
}
}
"_embedded": {
"postResourceList": [
{
"id": 1,
"title": "test",
"content": "test",
"user": {
"id": 1,
"name": "test",
"email": "test"
},
"fileList": [
{
"id": 1,
"name": "test",
"uuid": "e3296f69-30b2-43b9-965a-95ec60a25c9e",
"upload_path": "/"
}
],
"_links": {
"self": {
"href": "http://localhost:8080/post/1"
}
}
},
{
"id": 2,
"title": "test",
"content": "test",
"user": {
"id": 1,
"name": "test",
"email": "test"
},
"fileList": [
{
"id": 2,
"name": "test",
"uuid": "7713bc4c-798d-470e-8dbf-e1a3766aa381",
"upload_path": "/"
}
],
"_links": {
"self": {
"href": "http://localhost:8080/post/2"
}
}
},
... 중략 ...
]
},
"_links": {
"self": {
"href": "http://localhost:8080/post"
}
},
"page": {
"size": 10,
"totalElements": 10,
"totalPages": 1,
"number": 0
}
}