고래씌

[Spring] 6-2. 게시판 검색기능 본문

Server/Spring

[Spring] 6-2. 게시판 검색기능

고래씌 2024. 1. 24. 10:01

1. 게시판 검색기능

 

=> paramMap에 condition이랑 keyword, boardCode 가 다 담긴다! 그래서 별도로 BoardController에 추가하지 않아도 된다.

=> 검색창에 작성자로 설정해놓고 "ddd"라는 값을 입력했을 때 log에 값이 담긴 것을 확인할 수 있다.

 

 

=> 그래서 바로 board-mapper.xml로 가서 코드 수정만 하면된다!

 

 

▶ board-mapper.xml

=> 페이징과 게시글 목록을 불러오는 코드를 모두 다음과 같이 수정함

 

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
<mapper namespace="boardMapper">

	<!-- 페이징 -->
	<select id="selectListCount" parameterType="map" resultType="int">
		SELECT COUNT(*)
		FROM BOARD B
		LEFT JOIN MEMBER M ON (BOARD_WRITER = USER_NO) 
		WHERE B.STATUS = 'Y' AND BOARD_CD= #{boardCode}
		<if test="keyword != null and keyword != ''">  
			AND
			<choose>
				<when test="condition == 'title'">
					BOARD_TITLE LIKE '%${keyword}%'
				</when>
				<when test="condition.equals('content')">
					BOARD_CONTENT LIKE '%' || #{keyword} || '%'
				</when>
				<when test="condition.equals('writer')">
					USER_NAME LIKE CONCAT(CONCAT('%', #{keyword}), '%')
				</when>
				<when test="condition.equals('titleAndContent')">
					(BOARD_TITLE LIKE '%${keyword}%')
					OR
					(BOARD_CONTENT LIKE '%' || #{keyword} || '%')
					<!-- 괄호를 써야 한다! OR 연산자를 사용할 때는 -->
				</when>
			</choose>
		</if>
	</select>
	

	
	<!-- 게시글 목록 -->
	<!-- 결과값은 board로 담아줘야함 -->
	<select id="selectList" resultType="board" parameterType="map">  
		SELECT BOARD_NO, BOARD_TITLE, M.USER_NAME AS BOARD_WRITER, BOARD_CONTENT, COUNT, CREATE_DATE
		FROM BOARD B
		LEFT JOIN MEMBER M ON (BOARD_WRITER = USER_NO) 
		WHERE B.STATUS='Y' AND BOARD_CD= #{boardCode}
		<!-- 검색값이 null이 아니라면 -->
		<if test="keyword != null and keyword != ''">  
			AND
			<choose>
				<when test="condition == 'title'">
					BOARD_TITLE LIKE '%${keyword}%'
				</when>
				<when test="condition.equals('content')">
					BOARD_CONTENT LIKE '%' || #{keyword} || '%'
				</when>
				<when test="condition.equals('writer')">
					USER_NAME LIKE CONCAT(CONCAT('%', #{keyword}), '%')
				</when>
				<when test="condition.equals('titleAndContent')">
					(BOARD_TITLE LIKE '%${keyword}%')
					OR
					(BOARD_CONTENT LIKE '%' || #{keyword} || '%')
					<!-- 괄호를 써야 한다! OR 연산자를 사용할 때는 -->
				</when>
			</choose>
		</if>
		ORDER BY BOARD_NO DESC
	</select>

</mapper>

 

 

 

▶ boardListView.jsp

=> 검색을 했을 때 검색한 게시글 목록만 조회되도록 함수 지정

 

 

=> 모두 ${sUrl} 추가

 

 

 

=> keyword 친 값이 저장되도록 input value에 ${param.keyword} 저장하고, form action=${boardCode} 추가

=> 검색을 하고 나서 선택했던 select값이 변하지 않도록 ${param.condition eq '~' ? 'selected' : ''} 추가.(~와 같다면 selected 값이 반환이 되고 아니면 빈값이 반환되도록 설정