
게시글 작성 후 내게시글 조회할때 Page를 썼는데 정상 작동은 하지만 해당 경고가 떴다.
기존 get 메서드
public Page<BoardsDetailResponseDto> getMyBoards(AuthUser authUser, int page, int size) {
//사용자 찾기
User user = userService.findUser(authUser.getUserId());
//페이지 요청 객체 생성 (페이지 숫자가 실제로는 0부터 시작하므로 원하는 숫자 -1을 입력해야 해당 페이지가 나온다)
Pageable pageable = PageRequest.of(page -1, size);
//해당 유저가 쓴 게시글 페이지네이션해서 가져오기
Page<Boards> boards = boardsRepository.findAllByUserId(user.getId(),pageable);
//찾은게시글들 responseDto에 맞춰서 반환하기
return boards.map(BoardsDetailResponseDto::new);
}
해당 경고의 뜻이 뭔지 찾아보니,
이 경고는 Spring Data의 Page 객체를 직접 JSON으로 직렬화하는 방식이 안정적이지 않다는 것을 의미. Spring은 Page 객체를 JSON으로 직렬화할 때, 구조가 변할 수 있기 때문에 이를 피하는 것이 좋고, 이를 해결하기 위해 두 가지 주요 접근 방법이 있다 라고 나왔다.
1.PageModel 사용하기
2.DTO를 사용한 커스텀하기
1.PageModel 사용하기는 최대한 적용해 보려고 했으나 오류가 뜨는데 해결을 못하겠어서 2번으로 노선을 틀었다.
2.DTO를 사용한 커스텀하기
@Getter
public class BoardsDetailResponseDto {
private final Long id;
private final String title;
private final String contents;
private final String images;
public BoardsDetailResponseDto(Boards boards) {
this.id = boards.getId();
this.title = boards.getTitle();
this.contents = boards.getContent();
this.images = boards.getImage();
}
}
기존에 page에 쓰였던 DTO 내용을 LIST 하여 BoardsPageResponseDto에 담아서 Page로 반환하였다.
@Getter
public class BoardsPageResponseDto {
private final List<BoardsDetailResponseDto> content;
private final int totalPages;
private final long totalElements;
private final int size;
private final int number;
public BoardsPageResponseDto(List<BoardsDetailResponseDto> content, int totalPages, long totalElements, int size, int number) {
this.content = content;
this.totalPages = totalPages;
this.totalElements = totalElements;
this.size = size;
this.number = number;
}
}
public BoardsPageResponseDto getMyBoards(AuthUser authUser, int page, int size) {
//사용자 찾기
User user = userService.findUser(authUser.getUserId());
//페이지 요청 객체 생성 (페이지 숫자가 실제로는 0부터 시작하므로 원하는 숫자 -1을 입력해야 해당 페이지가 나온다)
Pageable pageable = PageRequest.of(page -1, size);
//해당 유저가 쓴 게시글 페이지네이션해서 가져오기
Page<Boards> boards = boardsRepository.findAllByUserIdAndStatusEnum(user.getId(), StatusEnum.ACTIVATED,pageable);
// BoardsPageResponseDto 생성
return new BoardsPageResponseDto(
boards.map(BoardsDetailResponseDto::new).getContent(),
boards.getTotalPages(),
boards.getTotalElements(),
boards.getSize(),
boards.getNumber()
);
}

작동도 잘되고 경고문도 사라진것을 확인 하였다.
'java 배우기 > TIL' 카테고리의 다른 글
| S3 사용하면서 RequestPart 로 인한 에러 (0) | 2024.10.24 |
|---|---|
| 게시판 사진등록에 S3 써보기 (0) | 2024.10.24 |
| REST API 네이밍 원칙 (1) | 2024.10.23 |
| List를 Page 화 하기 (0) | 2024.10.22 |
| 카드 조회수에 redis 사용해보기 (0) | 2024.10.17 |