쌓고 쌓다

[스프링 부트] 게시글 검색 - 11 본문

프로그래밍/spring

[스프링 부트] 게시글 검색 - 11

승민아 2023. 7. 15. 17:07

SpringDataJpaPosterRepository

public interface SpringDataJpaPosterRepository extends JpaRepository<Poster, Long> {
    Page<Poster> findByTitleContaining(String title, Pageable pageable);
}

SpringDataJpa에 findBy 형식으로 메소드명을 작성하면 적절한 JPQL 쿼리를 생성해준다.

쿼리 메소드에 페이징을 원한다면 파라미터로 Pageable을 넘겨주자.

LIKE %단어% 형태는 Containing 메소드를 작성해주면 된다.

 

PosterService

@Service
@Transactional
public class PosterService {

    public Page<Poster> searchPageList(String title, Pageable pageable) {
        return posterRepository.findByTitleContaining(title, pageable);
    }

/*  검색 조건이 없는 페이징
    public Page<Poster> pageList(Pageable pageable) {
        return posterRepository.findAll(pageable);
    }
*/

}

검색 조건이 없는 전체 페이징 메소드와 달리

검색 제목 title이 함께 넘겨 받아 Repository의 메소드를 실행한다.

 

PosterController

@Controller
public class PosterController {

    @GetMapping("/posters")
    public String list(Model model, @PageableDefault(sort="id", value=5, direction = Sort.Direction.DESC) Pageable pageable, String searchTitle) {
        Page<Poster> pageList;
        if(searchTitle==null)
            pageList = posterService.pageList(pageable);
        else
            pageList = posterService.searchPageList(searchTitle, pageable);
            
        ...
    }

}

게시글 목록을 보여주는 Controller이다.

여기에 기존에는 보여줄 게시글을 페이징 처리하여 pageList에 담아 뿌렸다.

이제 검색어가 있다면 URL 형태 /posters로 검색할 제목 searchTitle을 함께 넘겨 받는다.

searchTitle이 있다면 searchPageList 메소드를 통해 게시글을 받아온다.

 

posterList.html

검색 부분

<form action="/posters" method="get">
	<input type="text" name="searchTitle">
	<button type="submit">검색</button>
</form>

게시글 제목 입력 부분과 버튼을 위한 태그이다.

name="searchTitle"을 통해 "/posters?searchTitle=제목" 형태로 URL을 통해 GET 요청을 보낸다.

 

페이지 이동 부분

<a class="page-link" th:if="${param.searchTitle != null}" th:text="${num}" th:href="@{/posters(page=${num}-1, searchTitle=${param.searchTitle})}"></a>
<a class="page-link" th:if="${param.searchTitle == null}" th:text="${num}" th:href="@{/posters(page=${num}-1)}"></a>

타임리프는 param 기본 객체를 제공한다.

 

http 요청 파라미터를 가져올 수 있다.

"localhost:8080/posters?searchTitle=하하" -> ${param.searchTitle}에 "하하"가 담긴다.

 

페이지 이동 부분에 타임리프 th:if를 통해 검색어가 존재하냐 안하냐로 검색어 유지를 한다.

 

이전 다음 페이지 이동

<li class="page-item" th:if="${hasNext} and ${param.searchTitle != null}"><a class="page-link" th:href="@{/posters(page=${next}, searchTitle=${param.searchTitle})}">다음</a>
<li class="page-item" th:if="${hasNext} and ${param.searchTitle == null}"><a class="page-link" th:href="@{/posters(page=${next})}">다음</a></li>

페이지 이동 부분과 동일하게 검색어 유지를 위해 th:if를 사용했다.

 

 

동작 결과

 

Comments