java 배우기/TIL

게시글 조회시 페이지 사용할때 생기는 경고 문구

checkuu 2024. 10. 23. 19:38

 

게시글 작성 후 내게시글 조회할때 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