[홈페이지 제작] 홈페이지 만들기 1 - 검색 기능 추가하기

Feb 22, 2024
[홈페이지 제작] 홈페이지 만들기 1 - 검색 기능 추가하기
 

1. View

 
<div class="container p-5"> <!-- 검색 --> <div class="row justify-content-end mb-3"> <div class="col-md-4"> <form action="/" method="get" class="form-inline"> <div class="input-group rounded"> <input class="form-control me-2 rounded-end" type="text" placeholder="Search..." name="keyword" required/> <button class="btn btn-primary rounded-start" type="submit">검색</button> </div> </form> </div> </div>
 
검색 버튼을 누르면 /?keyword= 쿼리스트링이 만들어진다.
 
notion image
 
 

2. 컨트롤러

 
@GetMapping("/") public String index( HttpServletRequest request, @RequestParam(defaultValue = "0") Integer page, @RequestParam(defaultValue = "") String keyword) { // isEmpty -> null, 공백 // isBlank -> null, 공백, 화이트 스페이스 if(keyword.isBlank()){ List<Board> boardList = boardRepository.findAll(page); // 전체 페이지 개수 int count = boardRepository.count().intValue(); // 5 -> 2page // 6 -> 2page // 7 -> 3page // 8 -> 3page int namerge = count % 3 == 0 ? 0 : 1; int allPageCount = count / 3 + namerge; request.setAttribute("boardList", boardList); request.setAttribute("first", page == 0); request.setAttribute("last", allPageCount == page + 1); request.setAttribute("prev", page - 1); request.setAttribute("next", page + 1); }else{ List<Board> boardList = boardRepository.findAll(page, keyword); // 전체 페이지 개수 int count = boardRepository.count(keyword).intValue(); // 5 -> 2page // 6 -> 2page // 7 -> 3page // 8 -> 3page int namerge = count % 3 == 0 ? 0 : 1; int allPageCount = count / 3 + namerge; request.setAttribute("boardList", boardList); request.setAttribute("first", page == 0); request.setAttribute("last", allPageCount == page + 1); request.setAttribute("prev", page - 1); request.setAttribute("next", page + 1); } return "index"; }
 
@RequestParam 어노테이션으로 keyword 변수를 만든다.
 

3. 레파지토리

 
//like 절이 있으면 % 를 써야됨 public Long count(String keyword) { Query query = em.createNativeQuery("select count(*) from board_tb where title like ?"); query.setParameter(1, "%"+keyword+"%"); return (Long) query.getSingleResult(); } public List<Board> findAll(Integer page, String keyword) { Query query = em.createNativeQuery("select * from board_tb where title like ? order by id desc limit ?, 3", Board.class); query.setParameter(1, "%"+keyword+"%"); query.setParameter(2, page * 3); return query.getResultList(); }
 
💡
like 는 쿼리문에서 특정 패턴에 포함된 데이터를 찾을 때 사용한다. %keyword% 처럼 % 를 앞 뒤로 사용하면 키워드가 어디에 포함되어 있든 검색이 가능하다.
 
 

4. 결과 보기

 
<ul class="pagination d-flex justify-content-center"> <li class="page-item {{#first}}disabled{{/first}}"><a class="page-link" href="?page={{prevPage}}&keyword={{keyword}}">Previous</a></li> <li class="page-item {{#last}}disabled{{/last}}"><a class="page-link" href="?page={{nextPage}}&keyword={{keyword}}">Next</a></li> </ul>
 
컨트롤러를 통해 전달받은 keyword 를 mustache에 사용한다.
 
notion image
 
4를 검색하면 주소에 쿼리스트링이 표시된다.
 
notion image
 
새로운 더미데이터를 추가해 검색을 해도 정상적으로 검색이 된다.
Share article

{CODE-RYU};