작성
·
660
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 인턴입니다.
유요한님의 질문과 유사한 상황에 대한 답변을 찾았습니다. 페이지 처리에서 1부터 시작하는 방법에 대해 궁금하시다면 아래 링크에서 김영한 강사님의 답변을 참고하실 수 있습니다.
실전! 스프링 데이터 JPA - Page를 1부터 시작하기(Pageable, Page 커스텀) 질문 있습니다.
강사님의 답변 중 일부를 요약하자면, 다른 부분은 더 최적화하기 어려우며, PageableCustom
클래스의 생성자를 Page
인터페이스를 구현한 객체를 받도록 하는 것이 좋을 것 같다고 조언하셨습니다. 자세한 내용은 링크를 통해 확인해보시면 좋을 것 같습니다.