프로젝트 & 실습/VarChar_Spring_ver_Proj

[프로젝트] Mybatis를 통한 필터 기능 구현

hhyyyjun 2023. 1. 10. 23:44

 

필터에 사용되는 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 객체에 담았다.

기존 jsp 프로젝트에서 설명한 것과 완전 동일하다.