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
로 설정되어 있어, 이 파라미터가 없어도 에러가 발생하지 않고,title
은null
이 될 수 있습니다.
@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이 없는경우

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

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