스프링 부트/[스프링 부트] 게시판 무작정 따라하기

[스프링 부트] 게시판 무작정 따라하기 - 10. 검색 기능 1편

sungw00 2023. 3. 13. 13:39
728x90

JPA Repository

  • findBy(컬럼이름): 컬럼에서 키워드를 넣어서 찾음 -> 정확하게 일치하는 데이터 검색
  • findBy(컬럼이름)Containing: 컬럼에서 키워드가 포함된 것을 찾음 -> 키워드가 포함된 모든 데이터 검색

 

Repository에 내용 추가

@Repository
public interface BoardRepository extends JpaRepository<Board, Integer> { // 엔티티는 Board, PK의 타입은 Integer

    Page<Board> findByTitleContaining(String searchKeyword, Pageable pageable); // 제목에 포함된 키워드를 찾는 메서드
}

Service에 내용 추가

// 게시글 리스트 처리
    public Page<Board> boardList(Pageable pageable) {
        return boardRepository.findAll(pageable);
    }

    public Page<Board> boardSearchList(String searchKeyword, Pageable pageable) { // 검색 기능 추가
        return boardRepository.findByTitleContaining(searchKeyword, pageable);
    }

Controller에 내용 추가

@GetMapping("/board/list")
    public String boardList(Model model,
                            @PageableDefault(page = 0, size = 10, sort = "id", direction = Sort.Direction.DESC) Pageable pageable,
                            String searchKeyword) { // 검색 키워드를 searchKeyword로 전달 받음

        Page<Board> list = null;

        if (searchKeyword == null) {  // 검색할 키워드가 들어오지 않은 경우 전체 리스트 출력
            list = boardService.boardList(pageable);
        } else {  // 검색할 키워드가 들어온 경우 검색 기능이 포함된 리스트 반환
            list = boardService.boardSearchList(searchKeyword, pageable);
        }

        int nowPage = list.getPageable().getPageNumber() + 1; // pageable이 가지고 있는 페이지는 0부터 시작하기때문에 1을 더함
        int startPage = Math.max(nowPage - 4, 1); // 1보다 작은 경우는 1을 반환
        int endPage = Math.min(nowPage + 5, list.getTotalPages()); // 전체 페이지보다 많은 경우는 전체 페이지를 반환

        model.addAttribute("list", list);
        model.addAttribute("nowPage", nowPage);
        model.addAttribute("startPage", startPage);
        model.addAttribute("endPage", endPage);

        return "boardlist";
    }

쿼리 스트링을 사용하여 11이 포함된 게시글의 제목을 검색하기

하지만 2페이지로 넘어가면 다음과 같이 검색이 풀려버리기때문에 &page=1을 추가로 요청해야 정상적으로 나타난다.

 

728x90