인프런 커뮤니티 질문&답변

유요한님의 프로필 이미지

작성한 질문수

실전! 스프링 데이터 JPA

Web 확장 - 페이징과 정렬

페이징 처리에서 1부터 시작하기

23.12.21 10:36 작성

·

604

0

학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.

1. 강의 내용과 관련된 질문을 남겨주세요.
2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.
(자주 하는 질문 링크: https://bit.ly/3fX6ygx)
3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.
(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)

질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.
=========================================
[질문 템플릿]
1. 강의 내용과 관련된 질문인가요? (예)
2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (아니오)
3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예)

[질문 내용]
페이지처리에서 1부터 하는거에 대해서 질문이 있습니다.

  data:
    web:
      pageable:
        default-page-size: 10
        max-page-size: 2000
        one-indexed-parameters: true

이렇게 처리를 하고

    // 상품에 대한 문의글 보기
    @Transactional(readOnly = true)
    @Override
    public Page<BoardDTO> getBoards(Pageable pageable,
                                    Long itemId,
                                    String email) {

        // 회원 조회
        MemberEntity findUser = memberRepository.findByEmail(email);
        log.info("유저 : " + findUser);

        // 상품 조회
        ItemEntity findItem = itemRepository.findById(itemId)
                .orElseThrow(EntityNotFoundException::new);
        log.info("상품 : " + findItem);

        // 조회해올 게시글을 넣을 곳
        Page<BoardEntity> findAllBoards = boardRepository.findAllByItemItemId(itemId, pageable);
        // 댓글이 있으면 답변완료, 없으면 미완료
        for(BoardEntity boardCheck : findAllBoards) {
            if(boardCheck.getCommentEntityList().isEmpty()) {
                boardCheck.changeReply(ReplyStatus.REPLY_X);
            } else {
                boardCheck.changeReply(ReplyStatus.REPLY_O);
            }
        }

        for (BoardEntity boardEntity : findAllBoards) {
            // 파라미터로 받아온 이메일이 있다면
            if (email != null) {
                // 해당 게시글을 만들때 이메일과 조회한 이메일을 체크
                // 그리고 맞다면 읽을 권한주고 없으면 잠가주기
                if (boardEntity.getMember().getEmail().equals(findUser.getEmail())) {
                    boardEntity.changeSecret(BoardSecret.UN_LOCK);
                } else {
                    boardEntity.changeSecret(BoardSecret.LOCK);
                }
            } else {
                boardEntity.changeSecret(BoardSecret.LOCK);
            }
        }
        log.info("조회된 게시글 수 : {}", findAllBoards.getTotalElements());
        log.info("조회된 게시글 : {}", findAllBoards);

        return findAllBoards.map(board -> BoardDTO.toBoardDTO(
                board,
                board.getMember().getNickName(),
                board.getItem().getItemId()));
    }
// 상품에 대한 문의글 전체 보기
    @GetMapping("")
    @Tag(name = "board")
    @Operation(summary = "문의글 전체 보기", description = "모든 상품에 대한 문의글을 봅니다.")
    public ResponseEntity<?> getBoards(
            // SecuritConfig에 Page 설정을 한 페이지에 10개 보여주도록
            // 설정을 해서 여기서는 할 필요가 없다.
            @PageableDefault(sort = "boardId", direction = Sort.Direction.DESC)
            Pageable pageable,
            @PathVariable(name = "itemId") Long itemId,
            @RequestParam(value = "email", required = false) String email) {
        try {
            log.info("email : " + email);
            // 검색하지 않을 때는 모든 글을 보여준다.
            Page<BoardDTO> boards = boardService.getBoards(pageable, itemId, email);
            Map<String, Object> response = new HashMap<>();
            // 현재 페이지의 아이템 목록
            response.put("items", boards.getContent());
            // 현재 페이지 번호
            response.put("nowPageNumber", boards.getNumber()+1);
            // 전체 페이지 수
            response.put("totalPage", boards.getTotalPages());
            // 한 페이지에 출력되는 데이터 개수
            response.put("pageSize", boards.getSize());
            // 다음 페이지 존재 여부
            response.put("hasNextPage", boards.hasNext());
            // 이전 페이지 존재 여부
            response.put("hasPreviousPage", boards.hasPrevious());
            // 첫 번째 페이지 여부
            response.put("isFirstPage", boards.isFirst());
            // 마지막 페이지 여부
            response.put("isLastPage", boards.isLast());

            return ResponseEntity.ok().body(response);
        } catch (Exception e) {
            return ResponseEntity.badRequest().build();
        }
    }

여기서 현재페이지를 response.put("nowPageNumber", boards.getNumber()+1);로 +1해서 0부터 시작이 아니라 1부터 시작으로 했는데 여기서 나머지 정보들은 0을 기준으로 한다는건가요?

답변 1

0

인프런 AI 인턴님의 프로필 이미지

2023. 12. 21. 10:41

안녕하세요, 인프런 AI 인턴입니다.

유요한님의 질문과 유사한 상황에 대한 답변을 찾았습니다. 페이지 처리에서 1부터 시작하는 방법에 대해 궁금하시다면 아래 링크에서 김영한 강사님의 답변을 참고하실 수 있습니다.

  • 강의 제목: 실전! 스프링 데이터 JPA
  • 질문 제목: Page를 1부터 시작하기(Pageable, Page 커스텀) 질문 있습니다.

실전! 스프링 데이터 JPA - Page를 1부터 시작하기(Pageable, Page 커스텀) 질문 있습니다.

강사님의 답변 중 일부를 요약하자면, 다른 부분은 더 최적화하기 어려우며, PageableCustom 클래스의 생성자를 Page 인터페이스를 구현한 객체를 받도록 하는 것이 좋을 것 같다고 조언하셨습니다. 자세한 내용은 링크를 통해 확인해보시면 좋을 것 같습니다.