Spring Boot-3

유호준·2021년 5월 15일
0

Spring Boot

목록 보기
4/7

객체 각각 링크를 달아보자!


지난 글에서 Hateoas를 통해 링크를 달아보았습니다. 그러나 객체 각각에는 링크가 달리지 않습니다. 이번에는 객체 각각에 모두 링크를 달아보겠습니다.


PostResource 생성

원래의 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 생성

객체 각각에 링크를 달아주는 클래스인 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);
    }

}

PostController 수정

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

0개의 댓글