이전에 DAO(Data Access Object - 데이터 접근 객체, 다오) Interface(인터페이스)와 Implements(구현체)를 만들어 study Database에 있는 INT_BOARD_TB(게시판) Table에서 전체 데이터(게시물)를 조회(select)하여 데이터를 가져왔습니다.
이어서 검색 조건에 맞는 데이터만 가져오도록 검색 기능을 추가하겠습니다.
Search
Database에 있는 Table에서 검색 조건에 맞는 데이터만 조회(select) 하기 위해서는 SELECT 할 때 WHERE 절을 사용하면 됩니다.
일반적인 게시판에서 공통적으로 많이 사용하는 검색 조건은 게시물의 제목 또는 내용에 검색하고자 하는 키워드가 있는지입니다.

구분하여 설명하면,
- 검색 타입은 Table에서 검색할 Column 명으로 INT_BOARD_TB(게시판) Table에서는 제목(BRD_SUBJECT), 내용(BRD_CONTENT)이 대상이 됩니다.
- 검색 조건은 검색하고자 하는 키워드가 Column 값과 일치하는지 또는 Column 값에 포함되는지에 대한 조건입니다.
- 검색 키워드는 Column에서 검색할 키워드입니다.
검색 조건을 WHERE 절로 만들면 다음과 같습니다.
// 게시판 제목 검색(일치)
WHERE BRD.BRD_SUBJECT = '검색할 키워드'
// 게시판 제목 검색(포함)
WHERE BRD.BRD_SUBJECT LIKE '%검색할 키워드%'
// 게시판 내용 검색(일치)
WHERE BRD.BRD_CONTENT = '검색할 키워드'
// 게시판 내용 검색(포함)
WHERE BRD.BRD_CONTENT LIKE '%검색할 키워드%'
WHERE 절을 MyBatis Mapper XML에서 조건에 따라 처리되게 만들기 위해서는 <where>를 사용하면 됩니다.
조건문을 만들기 위해서는 검색 타입, 검색 조건, 검색 키워드에 대한 변수가 있어야 합니다. 그래서 검색 타입은 searchType, 검색 조건은 searchCondition, 검색 키워드는 searchKeyword으로 하여 <where>를 만들도록 하겠습니다.
- 검색 키워드가 있어야 검색할 수 있기 때문에 <if>를 사용하여 searchKeyword가 있는지 확인합니다.
- 검색 타입이 제목(subject)인지 내용(content)인지 구분하기 위해서는 <choose><when>를 사용하여 searchType를 비교합니다. (<choose><when> 대신 <if>를 사용하셔도 됩니다. MyBatis Mapper XML에서는 <if>에 대한 <else>가 없기 때문에 if-else 구조일 경우에는 <choose><when>를 많이 사용합니다.)
- 검색 조건이 일치(equal)인지 포함(like)인지 구분하기 위해서는 <choose><when>를 사용하여 searchCondition를 비교합니다. 검색 조건은 포함(like)이 아니면 일치(equal)이기 때문에 <when> 대신 <otherwise>를 사용하였습니다. searchCondition이 없으면 일치(equal)로 처리되게 합니다.
<where>
<if test='searchKeyword != null and searchKeyword != ""'>
<choose>
<when test='searchType != null and searchType == "subject"'>
<choose>
<when test='searchCondition != null and searchCondition == "like"'>
BRD.BRD_SUBJECT LIKE CONCAT('%',#{searchKeyword},'%')
</when>
<otherwise>
BRD.BRD_SUBJECT = #{searchKeyword}
</otherwise>
</choose>
</when>
<when test='searchType != null and searchType == "content"'>
<choose>
<when test='searchCondition != null and searchCondition == "like"'>
BRD.BRD_CONTENT LIKE CONCAT('%',#{searchKeyword},'%')
</when>
<otherwise>
BRD.BRD_CONTENT = #{searchKeyword}
</otherwise>
</choose>
</when>
</choose>
</if>
</where>
또는 검색 조건을 먼저 비교하여 처리할 수도 있습니다. 그리고 검색 타입이 제목(subject)과 내용(content)만 있다면 제목(subject)이 아니면 내용(content)이기 때문에 <when> 대신 <otherwise>를 사용해도 됩니다.
<where>
<if test='searchKeyword != null and searchKeyword != ""'>
<choose>
<when test='searchCondition != null and searchCondition == "like"'>
<choose>
<when test='searchType != null and searchType == "subject"'>
BRD.BRD_SUBJECT LIKE CONCAT('%',#{searchKeyword},'%')
</when>
<otherwise>
BRD.BRD_CONTENT LIKE CONCAT('%',#{searchKeyword},'%')
</otherwise>
</choose>
</when>
<otherwise>
<choose>
<when test='searchType != null and searchType == "subject"'>
BRD.BRD_SUBJECT = #{searchKeyword}
</when>
<otherwise>
BRD.BRD_CONTENT = #{searchKeyword}
</otherwise>
</choose>
</otherwise>
</choose>
</if>
</where>
<select>에 검색 조건을 전달하기 위해서는 parameterType로 Model(모델)을 전달해야 합니다.
<select id="selectBoardList" parameterType="Search" resultMap="BoardMap">
</select>
검색 타입(searchType), 검색 조건(searchCondition), 검색 키워드(searchKeyword)가 포함된 검색 조건 Model(모델)을 만들면 됩니다.
그런데 다른 Table에서도 동일한 검색 조건을 사용한다면 검색 조건 Model(모델)을 만들 때마다 검색 타입, 검색 조건, 검색 키워드를 반복해서 만들어야 하는 번거로움이 있습니다.
그래서 공통의 검색 조건 Model(모델)을 만들고 Table 마다 검색 조건 Model(모델)을 계승(상속) 받아서 사용하게 하면 됩니다. (검색 조건 Model(모델)은 게시판뿐만 아니라 모든 검색에서도 공통적으로 사용할 수 있는 구성으로 되어있기 때문입니다.)
Maven Spring Project에 Common Search Model 추가하기
1. Java Resource > src/main/java에 com.home.study 패키지에 common.search 패키지를 생성합니다.
- 공통 모듈을 위해서 com.home.study 패키지에 common 패키지 생성
- common 패키지에 search 패키지 생성
2. com.home.study.common.search 패키지에 Search 클래스를 생성합니다. (Search.java)
- Search 클래스에 Serializable가 구현(implements)되도록 class에 implements로 Serializable를 입력합니다.
- Search 클래스 위로 마우스를 이동합니다. 콘텍스트 메뉴에서 "Add generated serial version ID"를 클릭하여 serialVersionUID를 생성합니다.
- 검색 타입(searchType), 검색 조건(searchCondition), 검색 키워드(searchKeyword) 변수를 생성하고 Getter, Setter를 생성합니다.
- Table에서 검색된 Row가 사용할 수 없는 Row 이거나 삭제 처리된 Row 일 수 있습니다. 그래서 검색할 때 Row를 제외 처리하기 위해서 사용 여부(useYesNo)를 추가합니다. (지금은 사용하지 않습니다.)
package com.home.study.common.search;
import java.io.Serializable;
public class Search implements Serializable {
/**
* serialVersionUID
*/
private static final long serialVersionUID = 300076093391308064L;
/**
* 검색 타입
*/
private String searchType = "";
/**
* 검색 조건
*/
private String searchCondition = "";
/**
* 검색 키워드
*/
private String searchKeyword = "";
/**
* 사용 여부
*/
private String useYesNo = "";
/**
* 검색 타입을 가져옵니다.
* @return 검색 타입
*/
public String getSearchType() {
return searchType;
}
/**
* 검색 타입을 설정합니다.
* @param searchType 검색 타입
*/
public void setSearchType(String searchType) {
this.searchType = searchType;
}
/**
* 검색 조건을 가져옵니다.
* @return 검색 조건
*/
public String getSearchCondition() {
return searchCondition;
}
/**
* 검색 조건을 설정합니다.
* @param searchCondition 검색 조건
*/
public void setSearchCondition(String searchCondition) {
this.searchCondition = searchCondition;
}
/**
* 검색 키워드를 가져옵니다.
* @return 검색 키워드
*/
public String getSearchKeyword() {
return searchKeyword;
}
/**
* 검색 키워드를 설정합니다.
* @param searchKeyword 검색 키워드
*/
public void setSearchKeyword(String searchKeyword) {
this.searchKeyword = searchKeyword;
}
/**
* 사용 여부를 가져옵니다.
* @return 사용 여부
*/
public String getUseYesNo() {
return useYesNo;
}
/**
* 사용 여부를 설정합니다.
* @param useYesNo 사용 여부
*/
public void setUseYesNo(String useYesNo) {
this.useYesNo = useYesNo;
}
}

공통 검색 조건 Model(모델)을 계승(상속)하여 INT_BOARD_TB(게시판) Table에서 사용할 검색 조건 Model(모델)을 만들겠습니다.
Maven Spring Project에 Board Search Model 추가하기
1. Java Resource > src/main/java에 com.home.study.test1.board.model 패키지에 Search 클래스를 계승(상속) 받아서 BoardSearch 클래스를 생성합니다. (BoardSearch.java)
- BoardSearch 클래스에 Search 클래스가 계승(상속)되도록 class에 extends로 Search를 입력합니다.
- BoardSearch 클래스 위로 마우스를 이동합니다. 콘텍스트 메뉴에서 "Add generated serial version ID"를 클릭하여 serialVersionUID를 생성합니다.
- 지금은 추가로 사용할 검색 조건이 없어 계승(상속)만 하면 됩니다.
package com.home.study.test1.board.model;
import com.home.study.common.search.Search;
public class BoardSearch extends Search {
/**
* serialVersionUID
*/
private static final long serialVersionUID = 8154425410965108205L;
}

Maven Spring Project에 Board Mapper XML 수정하기
1. com.home.study.test1.sqlmapl.mappers.mariadb.board 패키지에 있는 BoardMapper.xml 파일을 오픈합니다.
- <select>의 parameterType 속성에 생성한 BoardSearch 클래스를 입력합니다.
- 검색 조건을 처리하기 위해 위에서 만든 <where>를 FROM 다음에 추가합니다.
<select id="selectBoardList" parameterType="BoardSearch" resultMap="BoardMap">
SELECT BRD.BRD_SEQ,
BRD.BRD_SUBJECT,
BRD.REG_ID,
DATE_FORMAT(BRD.REG_DTM, '%Y-%m-%d %H:%i:%s') AS REG_DTM
FROM INT_BOARD_TB BRD
<where>
<if test='searchKeyword != null and searchKeyword != ""'>
<choose>
<when test='searchType != null and searchType == "subject"'>
<choose>
<when test='searchCondition != null and searchCondition == "like"'>
BRD.BRD_SUBJECT LIKE CONCAT('%',#{searchKeyword},'%')
</when>
<otherwise>
BRD.BRD_SUBJECT = #{searchKeyword}
</otherwise>
</choose>
</when>
<when test='searchType != null and searchType == "content"'>
<choose>
<when test='searchCondition != null and searchCondition == "like"'>
BRD.BRD_CONTENT LIKE CONCAT('%',#{searchKeyword},'%')
</when>
<otherwise>
BRD.BRD_CONTENT = #{searchKeyword}
</otherwise>
</choose>
</when>
</choose>
</if>
</where>
</select>
MyBatis에서 BoardSearch를 <typeAliases>으로 Alias(별칭)으로 등록하지 않고 바로 사용할 수 있는 것은 MyBatis 설정에서 typeAliasesPackage 속성을 사용하여 처리하였기 때문입니다.
<bean id="sqlSessionFactoryMariaDB" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dataSourceMariaDB" />
<property name="configLocation" value="classpath:/com/home/study/test1/sqlmap/mariadb-config.xml" />
<property name="typeAliasesPackage" value="com.home.study.test1.**.model" />
<property name="mapperLocations" value="classpath*:/com/home/study/test1/sqlmap/mappers/mariadb/**/*Mapper.xml"/>
</bean>
Maven Spring Project에 DAO - Board Interface에 BoardSearch 추가하기
1. com.home.study.test1.board.dao 패키지에 있는 IBoardDao Interface(인터페이스)를 오픈합니다. (IBoardDao.java)
- selectBoardList 메서드에 파라미터로 BoardSearch 클래스의 boardSearch 변수를 입력합니다.
package com.home.study.test1.board.dao;
import java.util.List;
import com.home.study.test1.board.model.Board;
import com.home.study.test1.board.model.BoardSearch;
public interface IBoardDao {
List<Board> selectBoardList(BoardSearch boardSearch);
}
Maven Spring Project에 DAO - Board Implement 수정하기
1. com.home.study.test1.board.dao.impl 패키지에 있는 BoardDaoImpl 클래스를 오픈합니다. (BoardDaoImpl.java)
- selectBoardList 메서드에 파라미터로 BoardSearch 클래스의 boardSearch 변수를 입력합니다.
- SqlSession의 selectList 메서드의 두 번째 파라미터에 boardSearch 변수를 입력합니다.
package com.home.study.test1.board.dao.impl;
import java.util.List;
import org.apache.ibatis.session.SqlSession;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Repository;
import com.home.study.test1.board.dao.IBoardDao;
import com.home.study.test1.board.model.Board;
import com.home.study.test1.board.model.BoardSearch;
@Repository("BoardDaoImpl")
public class BoardDaoImpl implements IBoardDao {
protected static final String SQL_FILE_PATH = "com.home.study.test1.board.mapper.mariadb.BoardMapper.";
@Autowired
@Qualifier("sqlSessionMariaDB")
private SqlSession sqlSession;
@Override
public List<Board> selectBoardList(BoardSearch boardSearch) {
return sqlSession.selectList(SQL_FILE_PATH + "selectBoardList", boardSearch);
}
}
Maven Spring Project에 Controller 수정하기
1. Java Resource > src/main/java > com.home.study.test1.main.controller에서 MainController 클래스를 오픈합니다. (MainController.java)
- BoardSearch 클래스로 boardSearch 변수를 생성하고 검색 타입(searchType)은 "subject", 검색 조건(searchCondition)은 "like", 검색 키워드(searchKeyword)는 "테스트 제목 1"을 입력합니다.
- boardSearch 변수를 selectBoardList 메서드의 파라미터로 입력합니다.
@RequestMapping("/index")
public String mainIndex(HttpServletRequest request, HttpServletResponse response, ModelMap model) {
BoardSearch boardSearch = new BoardSearch();
boardSearch.setSearchType("subject");
boardSearch.setSearchCondition("like");
boardSearch.setSearchKeyword("테스트 제목 1");
List<Board> boardList = boardDao.selectBoardList(boardSearch);
model.addAttribute("boardList", boardList);
return "main/main";
}
Maven Spring Project를 실행하여 웹 브라우저로 확인하기
1. "Servers"탭에서 "Tomcat9"를 선택하고 "start"버튼(start the server)을 클릭하면 Tomcat이 실행됩니다.
2. 웹 브라우저에서 "http://localhost:9000/index.do"를 입력합니다.

검색 조건이 "like"이기 때문에 "테스트 제목 1"이 포함되어 있는 "테스트 제목 1"과 "테스트 제목 10"이 조회(select)되어 나오는 것을 확인할 수 있습니다.
검색 조건을 변경하여 테스트해 보시기 바랍니다.
'Spring > Maven Project' 카테고리의 다른 글
Spring에 Service - Interface, Implement 추가 (0) | 2022.10.31 |
---|---|
Spring에 Mapper XML - Search 공통 처리, DAO - 카운트 기능 추가 (0) | 2022.10.23 |
Spring에 DAO - Interface, Implement 추가 (0) | 2022.10.03 |
Spring에 Model, Mapper XML 추가 (0) | 2022.10.02 |
Spring에 MyBatis 적용 (MyBatis 3.5.10, MyBatis-Spring 2.0.7, spring-jdbc 5.2.22) (0) | 2022.09.24 |