쌓고 쌓다
[스프링 부트] 게시글 검색 - 11 본문
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를 사용했다.
동작 결과
'프로그래밍 > spring' 카테고리의 다른 글
빈 스코프 (singleton, prototype, request) (0) | 2023.07.17 |
---|---|
빈 생명주기 콜백 (0) | 2023.07.16 |
@Autowired 조회 빈이 2개 이상일때 해결 방법 (0) | 2023.07.15 |
의존관계 주입 방법 4가지 (0) | 2023.07.14 |
컴포넌트 스캔과 의존관계 주입 (0) | 2023.07.13 |
Comments