스프링기반 페이지 검색기능 만들기

728x90

검색기능을 만드는데 핵심적인 포인트는 검색 기능의 form에서 어떻게 데이터를 넘겨주냐가 포인트다.

 

여기서 나 같은 경우는 JS를 사용해서 데이터를 직렬화(serialize)를 하여 ajax로 넘겨준 후 비동기로 처리하려고 했던게 매우 큰 문제였다. 

 

이런식으로 하면 안되고 form에서 action을 board페이지로 설정한 후에 method방식을 get으로 하여 데이터를 java에서 받아와야 한다.

 

일단 코드를 보자

 

1. JSP편

 

잡다한 코드는 보지말고 아래의 action과 method형식을 보자.

method는 get형식, action은 본래 사용하던 보드페이지 url 삽입

그리고 당연히 button의 type은 submit

<form class="d-flex" id="search" method="get" action="/news/stock" style="place-content: end; margin-right: 15px;">
    <input class="form-control me-2" type="search" name="search" placeholder="Search" aria-label="Search" required="required" style="width: 170px; height: 35px;">
    <button class="btn btn-outline-dark" type="submit" style="height: 35px; padding: 6px; font-size: 14px; width: 45px;">검색</button>
</form>

 

2. Controller편

 

get방식으로 받은 데이터, 즉 input의 name값을 requestParam으로 받아온다.

이제 대충 감이 오지 않는가? 나머지는 내가 항상 하던 방식으로 했다. requestparam으로 받은 값을 SQL쿼리 문을 적절히 활용하여 Model로 페이지로 넘겨주면 끝이다.

역시 데이터 받는 방식만 이해해주면 나머지 과정은 항상 하던 것이기 때문에 이해하는 것이 쉽다. 다행이다 휴... 

//	주식뉴스 페이지로 이동
//	뉴스 검색기능 포함
	@GetMapping("/stock")
	public String getnewsPage(Model m ,@RequestParam(value = "num", required = false, defaultValue = "1")String num, @RequestParam(value="search", required = false) String search) {
		String dbName = "newslistspecial";
		
		if(search == null) {
			
			m.addAttribute("pageList", svc.getpageList(Integer.valueOf(num), dbName));
			m.addAttribute("pageNumber", svc.getpageNumber(Integer.valueOf(num), dbName));
			
			return "/stockNews/stockNews";
		}
            else {
                search = "%" + search + "%";

                m.addAttribute("pageList", svc.getSearchPageList(Integer.valueOf(num), dbName, search));
                m.addAttribute("pageNumber", svc.getSearchPageNumber(Integer.valueOf(num), dbName, search));

                return "/stockNews/stockNews";
                }
            }

여기서 검색에 아무런 값이 없을 때, 즉 requestparam값이 null이면 전체 페이지를 출력하고 아닐 시 service에서 sql에서 적절한 데이터를 받아 재출력하면 된다.

 

3.SQL 쿼리 문

 

너무나 간단한 쿼리문이지만 도움이 될까 싶어 포스팅 - 아래의 orderby, group by는 제거해도 무방

<select id="getSearchPageList" resultType="com.tjoeun.midVO.newsVO" parameterType="String">
    SELECT * FROM ${dbName} GROUP BY title HAVING title LIKE #{search} ORDER BY num DESC
</select>

 

한 1시간 걸린 것 같은데 생각보다 시간 대비 배운 것이 많다.

 

알찬 1시간 바이

728x90