검색 기능(3)

HY·2025년 1월 29일

스프링 웹 애플리케이션의 흐름과 함께 살펴보자.

우선 list.jsp, 즉 웹 브라우저에서 사용자에게 요청을 받는다.

list.jsp와 연결되어있는 컨트롤러에서 사용자의 요청과 일치하는 비즈니스 로직(뒤에 나올 단계인 service, mapper 등 DB와 연결되는 과정)을 이어준다.

Controller에서 이어준 대로 비즈니스 로직을 실행하여 DB에서 데이터를 불러온다.

list.jsp

	<form id="searchForm" action="list" method="get">
			<input type="hidden" name="pageNum">
	    		<select name="type">
				<option value="MARKET_TITLE">제목</option>
				<option value="MARKET_CONTENT">내용</option>
				<option value="MARKET_LOCAL">지역</option>
			</select>
			<input type="text" name="keyword">
	
	    	<button>검색</button>
		</form>

위의 list.jsp 코드는 사용자가 검색 기능을 수행하는 폼이다.
우선 searchForm을 통해 사용자로부터 키워드와 타입을 받을 수 있도록 한다.
히든 타입을 통해 pageNum(현재 페이지 번호)를 전달 받는다.
이 값은 사용자가 입력할 수는 없지만, 기존에 작성해둔 페이지네이션 기능을 통해 자동으로 값이 결정된다.

option value="" 에 들어갈 값은 쿼리문의 것과 같아야 한다.
정확히는 type == ' '.toString() 의 따옴표 안의 것과 같아야 한다.

사용자에게 값을 전부 입력받았으면 이와 연결된 컨트롤러로 이동해보자.
매핑이 "list"로 되어있고, GET 방식으로 매핑하는 컨트롤러의 코드를 살펴보겠다.

MarketController

	@GetMapping("/list")
	public void list(Model model, Pagination pagination) {
		log.info("list");
		log.info(pagination);
		List<MarketVO> marketList = marketService.getPagingMarkets(pagination);
		if(!marketList.isEmpty()) {
			model.addAttribute("marketList", marketList);
			log.info("marketList : " + marketList);
		} else {
			log.info("엥");
		}
		
		PageMaker pageMaker = new PageMaker();
		pageMaker.setPagination(pagination);
		pageMaker.setTotalCount(marketService.getTotalCount(pagination));
		
		log.info(pageMaker);
		model.addAttribute("pageMaker", pageMaker);
		
	}

MarketVO에서 market에 관련된 정보를 받아오고, 페이지네이션 객체를 통해 페이지네이션을 적용시켜 검색 기능을 구현하려고 한다.

만약 불러온 marketList가 비어있지 않다면 model을 통해 객체를 담아오고,
marketList가 비어있다면 log를 출력한다.

아직 완성되지 않아서 로그만 입력해뒀지만 추후에 "검색 결과가 존재하지 않는다"는 걸 알려주는 페이지를 만들고 그를 리턴할 예정이다.

MarketMapper

		<select id="selectListByPagination" resultMap="marketResultMap">
	<!-- 페이지네이션 -->
	SELECT * FROM
	(
		SELECT ROW_NUMBER() OVER(ORDER BY MARKET_ID DESC) AS RN, MARKET.*
		FROM MARKET
	
		<choose>
				<when test="type == 'MARKET_TITLE'.toString()">
					WHERE MARKET_TITLE LIKE '%'||#{keyword}||'%'
				</when>
				<when test="type == 'MARKET_CONTENT'.toString()">
					WHERE MARKET_CONTENT LIKE '%'||#{keyword}||'%'
				</when>
				<when test="type == 'MARKET_LOCAL'.toString()">
					WHERE MARKET_LOCAL LIKE '%'||#{keyword}||'%'
				</when>
			</choose>	   
			) 
			WHERE RN BETWEEN #{start} AND #{end}
	</select>
	

검색 기능의 쿼리문이다.
검색 기능에도 페이지네이션이 적용이 되어야하니, 기존에 구현해뒀던 페이지네이션의 쿼리 문 안에 조건문을 넣어서 사용한다.
이 쿼리문을 통해 사용자에게 입력받은 값을 검색한다.

결과는 다음과 같다.

profile
안녕하세요

0개의 댓글