πŸ’‘ κ²Œμ‹œνŒ - 검색 κΈ°λŠ₯

박상민·2023λ…„ 9μ›” 9일
0

findBy(컬럼 이름)

  • μ»¬λŸΌμ—μ„œ ν‚€μ›Œλ“œλ₯Ό λ„£μ–΄μ„œ μ°Ύκ² λ‹€.
    • μ •ν™•ν•˜κ²Œ ν‚€μ›Œλ“œκ°€ μΌμΉ˜ν•˜λŠ” λ°μ΄ν„°λ§Œ 검색

findBy(컬럼 이름)Containing : 였늘 μ‚¬μš©ν•  κΈ°λŠ₯

  • μ»¬λŸΌμ—μ„œ ν‚€μ›Œλ“œκ°€ ν¬ν•¨λœ 것을 μ°Ύκ² λ‹€.
    • ν‚€μ›Œλ“œκ°€ ν¬ν•¨λœ λͺ¨λ“  데이터 검색

RoardRepository

@Repository
public interface BoardRepository extends JpaRepository<Board, Integer> {

	Page<Board> findByTitleContaining(String searchKeyword, Pageable pageable);
}

μš°μ„  JpaRepository의 검색 κΈ°λŠ₯을 μ‚¬μš©ν•˜κΈ° μœ„ν•΄μ„œ BoardRepository에 λŒ€μ†Œλ¬Έμžλ₯Ό μœ μ˜ν•΄μ„œ Page<Board> findByTitleContaining(String searchKeyword, Pageable);λ₯Ό μΆ”κ°€ν•΄μ€λ‹ˆλ‹€. μ΄λ•Œ Pageable을 λ°›λŠ” μ΄μœ λŠ” 검색 κ²°κ³Ό λ˜ν•œ νŽ˜μ΄μ§• 처리λ₯Ό ν•΄μ€˜μ•Όν•˜κΈ° λ•Œλ¬Έμž…λ‹ˆλ‹€.

λ˜ν•œ 기쑴의 BoardServiceμ—λŠ” 검색 κΈ°λŠ₯이 μ—†κΈ° λ•Œλ¬Έμ— ν•΄λ‹Ή λ©”μ†Œλ“œλ₯Ό λ§Œλ“€μ–΄μ€λ‹ˆλ‹€.

BoardService

public Page<Board> boardSearchList(String searchKeyword, Pageable pageable) {
     return boardRepository.findByTitleContaining(searchKeyword, pageable);
    }

μœ„ 처럼 boardSearchList λ©”μ„œλ“œλ₯Ό λ§Œλ“€μ–΄μ£ΌλŠ”λ° κ²€μƒ‰ν•˜λŠ” λ‚΄μš©λ„ νŽ˜μ΄μ§• 처리λ₯Ό ν•΄μ€˜μ•Όν•˜κΈ° λ•Œλ¬Έμ— Pageable도 λ°›μ•„μ€λ‹ˆλ‹€. λ©”μ„œλ“œμ—μ„œ 받은 searchKeyword와 pageable은 이전에 생성해둔 boardRepository.findByTitleContaining에 λ„˜κ²¨μ€λ‹ˆλ‹€.

이제 컨트둀러둜 κ°€μ„œ 컨트둀러λ₯Ό μˆ˜μ •ν•΄μ£Όκ² μŠ΅λ‹ˆλ‹€.

BoardController - κΈ°μ‘΄ μ½”λ“œ

@GetMapping("/board/list")
public String boardListForm(Model model, @PageableDefault(page = 0, size = 9, sort = "id",
            direction = Sort.Direction.DESC) Pageable pageable) {

    Page<Board> list = boardService.boardList(pageable;

    int nowPage = list.getPageable().getPageNumber() + 1;
    int startPage = Math.max(nowPage - 4, 1); //Math.maxλ₯Ό μ΄μš©ν•΄μ„œ start νŽ˜μ΄μ§€κ°€ 0μ΄ν•˜λ‘œ λ˜λŠ” 것을 방지
    int endPage = Math.min(nowPage + 5, list.getTotalPages()); //endPageκ°€ 총 νŽ˜μ΄μ§€μ˜ 개수λ₯Ό λ„˜μ§€ μ•Šλ„λ‘

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


    return "boardList";
}

κΈ°μ‘΄ μ½”λ“œλŠ” νŽ˜μ΄μ§• 처리 κΈ°λŠ₯이 μΆ”κ°€λœ μ½”λ“œλ‘œ λͺ¨λ“  데이터λ₯Ό κ°€μ Έμ™”μ—ˆμŠ΅λ‹ˆλ‹€. ν•˜μ§€λ§Œ 검색 κΈ°λŠ₯이 μΆ”κ°€λœλ‹€λ©΄ 검색 ν–ˆμ„ λ•Œμ™€ κ²€μƒ‰ν•˜μ§€ μ•Šμ•˜μ„ λ•Œ 데이터λ₯Ό κ°€μ Έμ˜€λŠ” λ°©μ‹μ˜ ꡬ별을 λ‘¬μ•Όν•©λ‹ˆλ‹€.

BoardController - λ³€κ²½ ν›„ μ½”λ“œ

@GetMapping("/board/list")
public String boardListForm(Model model, @PageableDefault(page = 0, size = 9, sort = "id",
            direction = Sort.Direction.DESC) Pageable pageable, String searchKeyword) {

    Page<Board> list = null;

    if (searchKeyword == null) { // 검색X
        // κΈ°μ‘΄κ³Ό λ™μΌν•˜κ²Œ λͺ¨λ“  데이터 뢈러였기
        list = boardService.boardList(pageable);
    } else { // 검색 O
        // κ²€μƒ‰ν•œ λ°μ΄ν„°λ§Œ κ°€μ Έμ˜€κΈ°
        list = boardService.boardSearchList(searchKeyword, pageable);
    }

    int nowPage = list.getPageable().getPageNumber() + 1;
    int startPage = Math.max(nowPage - 4, 1); //Math.maxλ₯Ό μ΄μš©ν•΄μ„œ start νŽ˜μ΄μ§€κ°€ 0μ΄ν•˜λ‘œ λ˜λŠ” 것을 방지
    int endPage = Math.min(nowPage + 5, list.getTotalPages()); //endPageκ°€ 총 νŽ˜μ΄μ§€μ˜ 개수λ₯Ό λ„˜μ§€ μ•Šλ„λ‘

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


    return "boardList";
}

μš°μ„  λ§€κ°œλ³€μˆ˜λ‘œ String searchKeywordλ₯Ό λ°›μ•„μ€λ‹ˆλ‹€.

검색을 ν•˜μ§€ μ•Šμ€ 경우 - searchKeyword==null

  • boardService.boardList(pageable) -> BoardRepository의 findAll λ©”μ„œλ“œ μ‹€ν–‰

검색을 ν•œ 경우 - searchKeyword!=null

  • boardService.boardSearchList(searchKeyword, pageable) -> BoardRepository의 findByTitleContaining λ©”μ„œλ“œ μ‹€ν–‰

κΈ°λŠ₯ λ‘œμ§μ€ μ–΄λŠμ •λ„ λ˜μ—ˆμœΌλ‹ˆ 이제 html 뢀뢄을 μˆ˜μ •ν•΄μ„œ 검색창을 λ§Œλ“€μ–΄μ£Όκ² μŠ΅λ‹ˆλ‹€.

boardList.html

<!-- νŽ˜μ΄μ§• λΆ€λΆ„ -->
    <div class="pagination">
        <th:block th:each="page : ${#numbers.sequence(startPage, endPage)}">
            <a th:if="${page != nowPage}" th:href="@{/board/list(page=${page - 1}, searchKeyword=${param.searchKeyword})}" th:text="${page}" class="page-link"></a>
            <strong th:if="${page == nowPage}" th:text="${page}" class="current-page"></strong>
        </th:block>
    </div>

κ²Œμ‹œκΈ€ 리슀트 νŽ˜μ΄μ§€μ˜ νŽ˜μ΄μ§• λΆ€λΆ„ html μ½”λ“œμž…λ‹ˆλ‹€. κΈ°μ‘΄ μ½”λ“œμ—μ„œ searchKeyword=${param.searchKeyword}κ°€ μΆ”κ°€λ˜μ—ˆμŠ΅λ‹ˆλ‹€. μ΄λŠ” 검색 ν›„ νŽ˜μ΄μ§€λ₯Ό 변경해도 검색 κ²°κ³Όκ°€ μœ μ§€λ˜λŠ” κΈ°λŠ₯을 ν•©λ‹ˆλ‹€.
λ§Œμ•½ 이 μ½”λ“œκ°€ μ—†λ‹€λ©΄ 검색 ν›„ νŽ˜μ΄μ§€λ₯Ό λ³€κ²½ν•˜λ©΄ 검색 κ²°κ³Όκ°€ μ—†μ–΄μ§€λŠ” λ¬Έμ œκ°€ λ°œμƒν•©λ‹ˆλ‹€.

검색 input, button html

<form th:action="@{/board/list}" method="get">
     <div class="search-container">
         <label class="search-label" for="searchKeyword">검색어:</label>
         <input class="search-input" type="text" id="searchKeyword" name="searchKeyword" />
         <button class="search-button" type="submit">검색</button>
     </div>
</form>

μ™„μ„± ν›„ κ²Œμ‹œκΈ€ 리슀트 νŽ˜μ΄μ§€

GPTλ₯Ό μ΄μš©ν•΄μ„œ λ””μžμΈμ„ ν•œ κ²Œμ‹œκΈ€ 리슀트 νŽ˜μ΄μ§€μž…λ‹ˆλ‹€. html에 μΆ”κ°€ν•œ κ²ƒμ²˜λŸΌ 검색창이 μΆ”κ°€λ˜μ—ˆμŠ΅λ‹ˆλ‹€. 이제 κΈ°λŠ₯이 잘 λ™μž‘ν•˜λŠ”μ§€ ν™•μΈν•΄λ³΄κ² μŠ΅λ‹ˆλ‹€.


μˆ˜μ • 검색 κ²°κ³Ό

검색 창에 'μˆ˜μ •'을 κ²€μƒ‰ν•œ κ²°κ³Όμž…λ‹ˆλ‹€. 'μˆ˜μ •'이 λ“€μ–΄κ°„ λͺ¨λ“  κ²Œμ‹œκΈ€μ΄ μ •μƒμ μœΌλ‘œ 검색이 된 것을 μ•Œ 수 μžˆμŠ΅λ‹ˆλ‹€.


λ‹€μŒ 글은 파일 μ—…λ‘œλ“œμ— λŒ€ν•΄μ„œ μž‘μ„±ν•˜κ² μŠ΅λ‹ˆλ‹€. κΈ€μ—μ„œ λΆ€μ‘±ν•œ 뢀뢄이 λ§Žμ„ 것 κ°™μŠ΅λ‹ˆλ‹€. λͺ¨λ“  지적을 ν™˜μ˜ν•©λ‹ˆλ‹€!!

더 μžμ„Έν•œ μ½”λ“œλŠ” κΉƒν—ˆλΈŒλ₯Ό μ°Έκ³ ν•΄μ£Όμ„Έμš”!

κΉƒν—ˆλΈŒ: https://github.com/pp8817/ToyProjectBoard

profile
μŠ€ν”„λ§ λ°±μ—”λ“œλ₯Ό 곡뢀쀑인 λŒ€ν•™μƒμž…λ‹ˆλ‹€!

0개의 λŒ“κΈ€