29. jpa 페이징처리

강재영's avatar
Dec 18, 2024
29. jpa 페이징처리
 

1.컨트롤러

// localhost:8080?title=제목 @GetMapping("/") public String list( @RequestParam(name = "title", required = false) String title, @RequestParam(name = "page", required = false, defaultValue = "0") Integer page, HttpServletRequest request) { BoardResponse.PageDTO pageDTO = boardService.게시글목록보기(title, page); request.setAttribute("model", pageDTO); return "board/list"; }
 

1.1 메서드 매개변수

💡
@RequestParam 애노테이션은 요청 파라미터를 컨트롤러 메서드의 매개변수로 바인딩할 때 사용한다.
 
  • @RequestParam(name = "title", required = false) String title : title이라는 쿼리 파라미터가 있을 경우 해당 값을 title 변수에 저장합니다. required = false로 설정되어 있어, 이 파라미터가 없어도 에러가 발생하지 않고, titlenull이 될 수 있습니다.
  • @RequestParam(name = "page", required = false, defaultValue = "0") Integer page : page라는 쿼리 파라미터가 있을 경우 해당 값을 page 변수에 저장합니다. 이 파라미터가 없으면 page는 기본값인 0으로 설정됩니다.
 

2.서비스

public BoardResponse.PageDTO 게시글목록보기(String title, int page) { Pageable pageable = PageRequest.of(page, 3, Sort.Direction.DESC, "id"); if (title == null) { Page<Board> boardPG = boardRepository.findAll(pageable); return new BoardResponse.PageDTO(boardPG, ""); } else { Page<Board> boardPG = boardRepository.mFindAll(title, pageable); return new BoardResponse.PageDTO(boardPG, title); } }

2.1 Pageable 객체 생성

페이징을 위해서 jpa에게 넘겨줘야하는 객체
 
  • PageRequest.of(page, 3, Sort.Direction.DESC, "id")는 페이지 번호, 페이지당 항목 수, 정렬 기준을 설정합니다.
  • page: 페이지 번호, 여기서는 메서드로 전달받은 page 값을 사용합니다.
  • 3: 한 페이지당 보여줄 게시글 수를 3으로 지정합니다.
  • Sort.Direction.DESC: 게시글을 내림차순으로 정렬합니다.
  • "id": 정렬 기준이 되는 필드는 id입니다. 즉, id가 큰 순서대로 게시글을 정렬합니다.
 

2.2title이 null일 경우

검색시 키워드를 넣지않고 검색을 할 수 있어야하므로 키워드가 올떄와 오지 않을때를 나누어 처리하였다.
 

2.3BoardResponse.PageDTO 객체

넘겨주는 값은 안전하게 DTO로 넘겨줘야하며 이 DTO설계를 잘해야 프론트가 받을때 편하게 작업을 할 수 있다.
 
@Data public static class PageDTO { private Integer number; // 현재페이지 private Integer totalPage; // 전체페이지 개수 private Integer size; // 한페이지에 아이템 개수 private Boolean first; private Boolean last; private Integer prev; // 현재페이지 -1 private Integer next; // 현재페이지 +1 private String keyword; //검색 제목 private List<Content> contents = new ArrayList<>(); public PageDTO(Page<Board> boardPG, String title) { this.keyword= title; this.number = boardPG.getNumber(); this.totalPage = boardPG.getTotalPages(); this.size = boardPG.getSize(); this.first = boardPG.isFirst(); this.last = boardPG.isLast(); this.prev = boardPG.getNumber()-1; this.next = boardPG.getNumber()+1; for (Board board : boardPG.getContent()){ contents.add(new Content(board)); } } @Data class Content { private Integer id; private String title; public Content(Board board) { this.id = board.getId(); this.title = board.getTitle(); } } }
 
 

3. Repository

public interface BoardRepository extends JpaRepository<Board, Integer> { @Query("select b from Board b where b.title like %:title% order by b.id desc") Page<Board> mFindAll(@Param("title") String title, Pageable pageable);
 
jpa에 pageable을 파라미터로 넘겨 페이지가 가능하게 하였고 쿼리문에 title을 넣어 필터링을 진행하였다.
 

페이징결과-title이 없는경우

notion image

페이징결과 -title에 a를 넣은 경우

notion image
주의해야하는건 프론트에 널(null)을 주면안된다.
그렇기에 “” 이런식으로 공백을 줘야한다.
Share article

강재영 블로그