오봉이와 함께하는 개발 블로그

게시판 검색 페이징 - 쿼리스트링 본문

Artineer 리뉴얼 프로젝트

게시판 검색 페이징 - 쿼리스트링

오봉봉이 2022. 10. 27. 15:35
728x90

문제

공지사항 게시판에 들어가면 페이징은 되었지만, 검색 조건(제목, 작성자)을 넣고 검색 하면 view에서 다시 랜더링 했을 때 검색 조건에 따라 페이징 링크가 만들어지지 않아 다음 페이지를 클릭하면 엉뚱한 페이지가 나왔다.

  1. http://localhost:8080/noticePage 접속
  2. 검색 조건 - 제목 : pring
  3. 검색 성공
  4. 다음 페이지(2페이지) 클릭 시 http://localhost:8080/noticePage/?page=1로 접속되는 문제.

해결

form을 통해 검색 조건과 내용을 넘겨주고 같은 주소로 매핑된 컨트롤러에서 검색 조건(selectorParam)과 내용(Param)을 넘겨받아서 model에 값을 추가해서 view로 다시 넘겨준다.
view에서 전달 받은 검색 조건과 내용이 공백이 아니면 새로운 페이징 리스트를 만들고 총 페이지와(totalPages) 검색 조건, 내용를 담은 링크를 생성한다.

코드

@GetMapping("/notice")
public String viewNoticePageBoard(@PageableDefault(size = 15) Pageable pageable, NoticeCondition condition, Model model,
                                  @RequestParam(value = "selectorParam", required = false, defaultValue = "")  String selectorParam,
                                  @RequestParam(value = "parameter", required = false, defaultValue = "") String parameter) {

    if (selectorParam.equals("writer")) {
            condition.setId(parameter);
    } else {
            condition.setTitle(parameter);
    }

    Page<NoticePageDto> noticeTitleOrId = noticeService.findNoticeTitleOrId(pageable, condition);

    int totalPages = noticeTitleOrId.getTotalPages();

    log.info("totalPages = {}", totalPages);

    model.addAttribute("pageDto", noticeTitleOrId);
    model.addAttribute("totalPages", totalPages);
    model.addAttribute("selectorParam", selectorParam);
    model.addAttribute("parameter", parameter);

    return "notice/noticeBoard";
}
<!-- 검색 조건이 없을 때 -->
<div class="pagination" th:if="${selectorParam} == ''  and ${parameter} == ''">
        <ul>
            <li th:each="page : ${#numbers.sequence(0, totalPages - 1)}">
                <a th:href="@{/noticePage/(page=${pageStat.index})}" th:text="${pageStat.index + 1}"></a>
            </li>
        </ul>
    </div>
<!-- 검색 조건이 있을 때 -->
    <div class="pagination" th:if="${selectorParam} != '' and ${parameter} != ''">
        <ul>
            <li th:each="page : ${#numbers.sequence(0, totalPages - 1)}">
                <a th:href="@{/noticePage(page=${pageStat.index}, selectorParam=${selectorParam}, parameter=${parameter})}" th:text="${pageStat.index + 1}"></a>
            </li>
        </ul>
    </div>
<!-- form -->
    <div class="search-area">
        <form action="noticeBoard.html" th:action method="get">
            <select class="form-control" id="selector" name="selector">
                <option value="title">제목</option>
                <option value="writer">작성자</option>
            </select>
            <input type="hidden" id="selectorParam" name="selectorParam">
            <input type="text" id="parameter" name="parameter">
            <input type="submit" value="검색" id="search-btn">
        </form>
    </div>
728x90
Comments