지금까지 프로젝트 생성, web.xml 설명, Interceptor 설정, logger 설정 등에 대해알아보았다.
이제부터 생성했던 프로젝트에 Mybatis를 연동하여 DB에서 데이터를 조회해 오는테스트를 해보고자 한다.
<<최종구조>>
최종 구조는 위와 같다. 차근차근 따라해 본다 ㅎㅎ
1. mybatis lib 추가
STS maven 프로젝트에서는 pom.xml을 사용하여 라이브러리를 관리하기 때문에
http://mkil.tistory.com/192 을 참고하여 다음과 같은 dependency를 pom.xml에 추가한다.
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.2.2</version>
</dependency>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
<version>1.2.0</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>${org.springframework-version}</version>
</dependency>
<dependency>
<groupId>commons-dbcp</groupId>
<artifactId>commons-dbcp</artifactId>
<version>1.4</version>
</dependency>
2. DB 연동 lib 추가 (Oracle사용)
(1) 다음 디펜던시를 추가한다.
<dependency>
<groupId>com.oracle</groupId>
<artifactId>ojdbc14</artifactId>
<version>10.2.0.4.0</version>
</dependency>
(2) <dependencies> 앞에 해당 repositories 추가
위의 ojdbc 디펜던시만으로는 해결이 안난다. 따라서 ojdbc를 직접 받을 수 있는 repository를 참조할 수 있도록 수동으로 등록해 준다.
<repositories>
<repository>
<id>mvn2</id>
<url>http://repo1.maven.org/maven2/</url>
<releases>
<enabled>true</enabled>
</releases>
<snapshots>
<enabled>true</enabled>
</snapshots>
</repository>
<repository>
<id>oracle</id>
<name>ORACLE JDBC Repository</name>
<url>http://mesir.googlecode.com/svn/trunk/mavenrepo</url>
</repository>
</repositories>
혹시 여기까지 했는데..........이 방법이 안된다면!!!
그래서... Cannot load JDBC driver class 'oracle.jdbc.OracleDriver' 가 난다면.... tomcat을 다운받은 곳의 lib 디렉토리에 직접 ojdbc14.jar를 넣어주면 깔끔히 해결된다 -_-;;;
아. 그리고 뭔진 모르겠는데 STS에 내장된 tomcat으로는 안되더라... (이유가뭐지?)
그래서 필자는 톰캣을 추가하고 해당 프로젝트를 올려주었다...
(내가 잘못 알고 있는게 있는걸까 ㅜㅜ)
3. jdbc 설정 파일 context-jdbc.xml 생성
src/java/resources 폴더 밑에 config 디렉토리를 생성 후
jdbc 설정을 관리할 xml 파일을 만든다. 파일 이름은 마음대로……..필자는 context-jdbc.xml로 생성했다.
4. context-jdbc.xml 설정 / DB 연결
DB 설정정보를 적어준다. url / username / password 를 작성해주면 된다.
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/jdbc http://www.springframework.org/schema/jdbc/spring-jdbc-3.0.xsd">
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource">
<property name="driverClassName" value="oracle.jdbc.OracleDriver" />
<property name="url" value="jdbc:oracle:thin:@IP주소입력하세요:PORT입력하세요:DB스키마명적어주세요" />
<property name="username" value="USERNAME입력하세요”/>
<property name="password" value="PASSWORD입력하세요”/>
</bean>
</beans>
5. web.xml에서 jdbc 설정 파일을 읽도록 설정
<!-- jdbc 설정 -->
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath*:config/*.xml</param-value>
</context-param>
서버가 기동될 때 해당 위치에 있는 xml파일을 읽으라는 의미이다.
보통은, config 디렉토리 생성 후, spring에 관련한 여러 설정파일인 xml을 만들어 넣고
해당 구문에서 classpath*:config/*.xml 이런 식으로 config 아래 모든
xml 확장자파일을 읽으라고 지정할 수 있다.
(설정파일을 하나하나 등록하는 것보다 한꺼번에 읽을 수 있도록 하기 위함이다.)
특정 xml만 지정하려면 classpath*:config/XXX-context.xml과 같이 사용할수도 있다.
6. Mybatis와 Spring 연결
src/java/resources/config 에 context-mapper.xml을 생성하고 다음과 같이 작성한다.
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">
<bean id="sqlSessionTemplate" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dataSource" />
<property name="mapperLocations" >
<list>
<value>classpath*:com/common/sql/*.xml</value>
</list>
</property>
<property name="configLocation">
<value>classpath:config/mybatis-env-setting.xml</value>
</property>
</bean>
<bean id="sqlSession" class="org.mybatis.spring.SqlSessionTemplate">
<constructor-arg index="0" ref="sqlSessionTemplate"/>
</bean>
</beans>
!! 설정이 중요하다.
(1) dataSource 설명
<property name="dataSource" ref="dataSource" />
처음 name값은 context-mapper.xml 에서 사용할 id 같은 값을 의미한다.
중요한 것은 ref값이다. 잘 보면 ref에 작성한 값과 4번에서 작성한 context-jdbc.xml 에서의 bean id값이 같은 것을 확인 할 수 있다.
이것은 ref의 dataSource가 context-jdbc.xml에서 정의한 bean을 참조한 것을 의미한다.
(2) mapperLocations 설명
<property name="mapperLocations" >
<list>
<value>classpath*:com/common/sql/*.xml</value>
</list>
</property>
이 부분은 앞으로 작성해나갈 SQL문들이 위치할 장소를 지정해주는 부분이다.
com.common.sql 이라는 패키지를 생성했고 그 안에서 생성한 모든 -.xml 파일들을 읽어드리라는 의미가 된다.
(3) sqlSessionTemplate 설명
<bean id="sqlSession" class="org.mybatis.spring.SqlSessionTemplate">
>constructor-arg index="0" ref="sqlSessionTemplate"/>
</bean>
mybatis spring 연동 모듈의 핵심 부분이다.
SqlSessionTemplate라는 클래스가 SqlSession을 구현해준다.
7. servlet-context.xml에 스캔 설정
WEB-INF\spring\appServlet\servlet-context.xml 에 다음으 추가한다.
<!-- component scan (Controller) -->
<context:component-scan base-package="com.common.*">
<context:include-filter type="annotation" expression="org.springframework.context.annotation.Configuration"/>
<context:include-filter type="annotation" expression="org.springframework.stereotype.Service"/>
<context:include-filter type="annotation" expression="org.springframework.stereotype.Repository"/>
<context:include-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
<context:include-filter type="regex"
expression="(service|controller|dao)\..*" />
</context:component-scan>
이거 설정안해주면 Caused by: org.springframework.beans.factory.BeanCreationException: Could not autowire field:
가 날수도. autowired에 대한 어노테이션 설정을 해주는 것 같다 (확실하진...않다)
8 Controller, DAO, Service ,SQL 생성 및 작성
test 용이라.. namespace들이 엉망진창이다….
HomeController에서 testSql에서 common까지…………. 중구난방 이구만 -_-;;
다음과 같이 4개의 파일을 생성해준다.
(1) HomeController
@Controller
public class HomeController {
private static final Logger logger = LoggerFactory.getLogger(HomeController.class);
@Autowired
private commonService commonService;
@RequestMapping(value = "/", method = RequestMethod.GET)
public String home(Locale locale, Model model) {
Map map = new HashMap();
map.put("docnum", "108");
List list=commonService.selectList(map);
logger.info("결과 logger:::::::::::::::: "+list);
return "home";
}
}
(2) commonService
@Service
public class commonService {
@Autowired
private commonDao commonDao;
public List selectList(Map param){
List list=commonDao.selectList(param);
return list;
}
}
(3) commonDao
@Repository
public class commonDao {
@Autowired
@Resource(name="sqlSession")
private SqlSessionTemplate sqlsession;
@SuppressWarnings("unchecked")
public List selectList(Map param) {
List result = sqlsession.selectList("testSql.selectList",param);
return result ;
}
}
(4) testSql
<?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="testSql">
<select id="testSql.selectList" parameterType="java.util.HashMap" resultType="java.util.HashMap">
SELECT * FROM PT_ABRD_MAIN where DOCNUM= #{docnum}
</select>
</mapper>
9. 서버 기동 후, 결과 확인
controller에서 data를 잘 가져오는지 앞서 설정했던 logger로 찍어봤더니 잘 가져온다.
2016-10-12 16:34:30,876 INFO [com.core.spring.HomeController] 결과 logger:::::::::::::::: [{INSTIME=2016-09-05 09:48:39.0, INSUSER=portaladmin, VIEWCOUNT=34, DOCNUM=102, UPDTIME=2016-09-0 ………………………. (많아서 생략)
10. Mybatis 확인
그럼 파라미터를 넘겨서 mybatis가 잘 설정 되었는지도 확인해볼까?
컨트롤러에서 하드코딩으로 파라미터 하나를 넘겨보았다.
Map map = new HashMap();
map.put("docnum", "108");
List list=commonService.selectList(map);
그리고 xml에서 파라미터를 매핑시켜줬다.
<select id="testSql.selectList" parameterType="java.util.HashMap" resultType="java.util.HashMap">
SELECT * FROM PT_ABRD_MAIN where DOCNUM= #{docnum}
</select>
2016-10-12 16:49:15,635 INFO [com.core.spring.HomeController] 결과 logger:::::::::::::::: [{INSTIME=2016-09-07 13:26:43.0, INSUSER=portaladmin, ATTACH=N, VIEWCOUNT=3, TITLE=히히히히ㅣㅎ,…. (생략) }]
잘나옴! mybatis 연동도 이렇게 끝.