[프로젝트] Mybatis를 통한 필터 기능 구현
JSP 프로젝트때 java로 구현했던 필터기능을 Mybatis로 버전업 해보았다.
JSP Java를 이용한 필터기능 구현 : https://hhyyyjun.tistory.com/240
[프로젝트] 필터 검색을 통해 원하는 정보 출력하기(ft. FrontController)
프로젝트의 메인 기능인 필터 기능을 구현해보았다. 필터는 연료/지역/가격/주행거리/연식 총 5개의 카테고리로 분류하여 검색하도록 하였다. 연료와 지역의 경우에는 각 항목에서 다중선택
hhyyyjun.tistory.com
필터에 사용되는 CarVO와 searchVO는 모두 동일하다.
1. 마이바티스 라이브러리를 사용하기 위해 pom.xml에 라이브러리를 추가해주었다.
<!-- Mybatis -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.3.1</version>
</dependency>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
<version>1.2.4</version>
</dependency>
2. 스프링 설정파일인 applicationContext.xml 에서 객체화 진행
<!-- Mybatis를 Spring에 연동 -->
<bean id="sqlSession" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="configLocation" value="classpath:sql-map-config.xml" />
<property name="dataSource" ref="dataSource" />
</bean>
<bean class="org.mybatis.spring.SqlSessionTemplate">
<constructor-arg ref="sqlSession" />
</bean>
3. 필터기능에 사용할 SearchDAO 생성
package com.koala.biz.dao;
import java.util.List;
import org.mybatis.spring.SqlSessionTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Repository;
import com.koala.biz.vo.CarVO;
import com.koala.biz.vo.SearchVO;
//Mybatis 버전
@Repository("searchDAO")
public class SearchDAO2 {
@Autowired
private SqlSessionTemplate mybatis;
public List<CarVO> selectAll(SearchVO svo){
return mybatis.selectList("SearchDAO.searchCar", svo);
}
}
4. SearchService 인터페이스 생성
package com.koala.biz.service;
import java.util.List;
import com.koala.biz.vo.CarVO;
import com.koala.biz.vo.SearchVO;
public interface SearchService {
public List<CarVO> selectAll(SearchVO svo);// 검색 결과 전체 조회
}
5. 비즈니스 메서드로 사용할 SearchServiceImpl 클래스 생성
package com.koala.biz.serviceimpl;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.koala.biz.dao.SearchDAO;
import com.koala.biz.dao.SearchDAO2;
import com.koala.biz.service.SearchService;
import com.koala.biz.vo.CarVO;
import com.koala.biz.vo.SearchVO;
@Service("searchService")
public class SearchServiceImple implements SearchService{
@Autowired
private SearchDAO2 searchDAO;
@Override
public List<CarVO> selectAll(SearchVO svo) {
return searchDAO.selectAll(svo);
}
}
6. filter-mapping.xml
<mapper namespace="SearchDAO"> <!-- namespace는 mapper 파일의 클래스명과 같다. -->
<resultMap type="Car" id="searchResult"> <!-- type : 별칭, id : resultMap의 이름 -->
<id property="cnum" column="CNUM"/> <!-- id태그의 property : vo에서 설정한 멤버변수명, column : pk 컬럼명 -->
<result property="ctitle" column="CTITLE"/> <!-- result태그의 property : vo에서 설정한 멤버변수명, column : 컬럼명 -->
<result property="csubtitle" column="CSUBTITLE"/>
<result property="cyear" column="CYEAR"/>
<result property="cfuel" column="CFUEL"/>
<result property="ckm" column="CKM"/>
<result property="cprice" column="CPRICE"/>
<result property="ccity" column="CCITY"/>
<result property="cimg" column="CIMG"/>
</resultMap>
6-1) 초기 SQL문

id는 호출될 메서드 명이다. DAO에서 호출할 때 사용되며 이를 searchCar로 설정하였다.
칼럼명과 멤버변수명이 달라 6번에서 resultMap 태그를 통해 각각 멤버변수명과 컬럼명을 연동하였고, 이를 사용하였다.
sql문을 동적으로 사용하기 위해 WHERE 1=1 조건식을 사용하였다.
6-2) 배열 파라미터 값을 받은 경우(다중선택)

다중선택을 통해 들어온 값들을 VO에서 설정한 배열객체에 담았고, mapper.xml에서 if문을 사용하여 해당 배열에 데이터가 존재하는 경우
sql문이 이어 붙여지도록 하였다. 이 때 배열 조건식에 size() 메서드와 isEmpty() 메서드를 통해 데이터 존재를 비교할 수 있다.
<foreach> 태그
for문과 같다.
속성
item : 전달받은 인자 값을 대체할 이름
index : 항목의 인덱스 값을 꺼낼 때 사용할 변수 이름
collection : 전달받은 인자 값
separator : 구분자, for문이 반복될 때마다 속성에 지정한 값을 넣어준다.
open : sql문이 시작할 때 들어갈 구문
close : sql문이 종료될 때 들어갈 구문
ex) 연료에 {전기, 가솔린, 하이브리드} 를 선택한 경우
AND CFUEL IN ( 전기, 가솔린, 하이브리드 )

이전 프로젝트때 사용했던 java식 dao와 비교했을 때 각 색깔 칸에 해당하는 부분이다.(위 사진과 칸 색깔 비교)
6-3) 단일 파라미터 값을 받은 경우

단일 파라미터 값을 받은 경우는 간단하다.
정수형으로 데이터를 받기 때문에 값이 0 이상일 때 sql문이 이어지도록 하였다.
6-4) 정렬하기

정렬하기의 경우는 각 조건식이 다르기 때문에 하나하나 작성해줘야 했다.
해당 조건일 때도 간단하게 해당 컬럼명에 따라 내림차순/오름차순으로 정렬되도록 하였다.
6-5) 보여줄 데이터 개수 지정

자동차 검색 페이지에서 더보기 기능을 통해 12개씩 추가하여 출력할 예정이기 때문에 searchVO에서 dataList라는 정수형 멤버변수를 생성하였고, 기본생성자에 초기값을 -1로 지정하였다.
Controller를 통해 dataList 값이 변하게 되면 해당 sql문이 붙게 된다.
7. 마이바이트 설정파일 sql-map-config.xml 생성
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<settings>
<setting name="jdbcTypeForNull" value="NULL" />
</settings>
<!-- 별칭(alias) 설정 -->
<typeAliases>
<typeAlias type="com.koala.biz.vo.CarVO" alias="Car" />
</typeAliases>
<!-- SQL Mapper 파일 연결 -->
<mappers>
<mapper resource="mappings/filter-mapping.xml" /> <!-- mapping 파일의 경로 입력 -->
</mappers>
</configuration>
8. SearchController.java

비즈니스 메서드를 통해 DAO를 사용하기 때문에 DI 해주었다.
filter.do 요청으로 인해 Controller가 해당 핸들러를 찾아 기능을 수행한다.
다중선택의 파라미터 값들을 @RequestParam 을 통해 가져왔다.
단일 파라미터 값들은 Command 객체를 통해 set 해주었다.

checkbox를 통해 가져오는 파라미터 값의 경우 다중선택이 가능하기 때문에 해당 파라미터 값을 저장할 배열 객체를 선언하였다.
또한 파라미터 값이 존재할 시 for문을 통해 배열객체에 삽입하였고 VO 멤버객체에 set 해주었다.
마지막으로 view에서 데이터를 출력하기 위해 model 객체에 fList 명으로 저장하였다.

단일 파라미터 값의 경우 해당 데이터가 0이 아닐 때 model 객체에 저장하였다.

하나의 SelectAll 메서드만 사용하기 때문에 view에서 자동차 매물의 총 개수를 안내하기 위해 먼저 DB에 저장된 총 매물의 개수를 멤버변수에 저장한 후 페이지에서 보여줄 12개의 데이터를 따로 List 객체에 담았다.

아주 이쁘게 잘 출력된다.
필터 검색 데이터 유지하기
https://hhyyyjun.tistory.com/241
[프로젝트] 정렬기능 추가&필터검색 후 필터검색 값 유지하기
필터 기능 외에 데이터들의 최신순/가격순/주행거리순/이름순에 대한 정렬 기능을 추가하였다. 1. SearchVO.java 먼저 VO에 정렬 데이터가 저장될 변수를 추가하였다. 2. filterSearch.jsp (filter.jsp
hhyyyjun.tistory.com
기존 jsp 프로젝트에서 설명한 것과 완전 동일하다.