[Spring] 마이바티스 연동하기
오늘은 스프링 마이바티스 연동에 대해서 알아보겠습니다.
일단 마이바티스가 뭔지 알고 넘어가야겠죠?
마이바티스 공식 홈페이지에서 정의한 내용에 따르면
마이바티스는 개발자가 지정한 SQL, 저장프로시저 그리고 몇가지 고급 매핑을 지원하는 퍼시스턴스 프레임워크이다. 마이바티스는 JDBC로 처리하는 상당부분의 코드와 파라미터 설정및 결과 매핑을 대신해준다. 마이바티스는 데이터베이스 레코드에 원시타입과 Map 인터페이스 그리고 자바 POJO 를 설정해서 매핑하기 위해 XML과 애노테이션을 사용할 수 있다.
이라고 정의되어 있습니다.
쉽게말해서 데이터베이스 연동을 하기 위한 프레임워크입니다.
기존에 sql쿼리문을 코드에 직접 작성하는 jdbc방식과 비교해서 마이바티스는 XML에서 쿼리문을 관리하기 때문에
가독성이 좋고, 개발자로 하여금 높은 생산성을 기대하게 해 줍니다.
그럼 마이바티스 세팅에 대해서 자세히 알아보겠습니다.
일단 마이바티스를 쓰기 위한 dependency를 추가해주겠습니다.
pom.xml 파일을 열어서
아래 pom.xml을 클릭해줍니다.
그리고
<!-- mybatis -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>${org.springframework-version}</version>
</dependency>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.4.5</version>
</dependency>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
<version>1.3.1</version>
</dependency>
<dependency>
<groupId>com.oracle</groupId>
<artifactId>ojdbc6</artifactId>
<version>12.1.0.2</version>
</dependency>
<dependency>
<groupId>commons-dbcp</groupId>
<artifactId>commons-dbcp</artifactId>
<version>1.4</version>
</dependency>
그리고 위의 코드를 추가해줍니다.
다음으로 src/java/resource 폴더 밑에 config > spring 폴더를 생성하고 context-datasource.xml 파일을 만들어 줍니다.
그리고 web.xml을 찾아 들어간 뒤 방금 생성한 파일을 읽을 수 있게 아래 코드를 추가해 줍니다.
<!-- The definition of the Root Spring Container shared by all Servlets and Filters -->
<!-- 서버 실행시 읽어들임 -->
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath*:config/spring/com/**/context-*.xml</param-value>
</context-param>
서버가 실행되면 config/spring/com/**/context-*.xml 이 경로에 있는 형식의 모든 파일을 읽어온다는 뜻입니다.
그리고 다시 context-datasource.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:tx="http://www.springframework.org/schema/tx"
xmlns:aop="http://www.springframework.org/schema/aop"
xsi:schemaLocation="http://www.springframework.org/schema/jdbc http://www.springframework.org/schema/jdbc/spring-jdbc-4.3.xsd
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.3.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.3.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.3.xsd">
<!-- set DB Mysql -->
<!-- <bean id="dataSourceProxy" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName" value="com.mysql.jdbc.Driver"></property>
<property name="url" value="jdbc:mysql://아이피 주소:포트/bmw"></property>
<property name="username" value="계정명"></property>
<property name="password" value="패스워드"></property>
</bean> -->
<!-- set DB Mssql -->
<!-- <bean id="dataSourceProxy" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName" value="com.microsoft.sqlserver.jdbc.SQLServerDriver"/>
<property name="url" value="jdbc:sqlserver://114.201.252.73:7978;DatabaseName=skysky"/>
<property name="username" value="계정명"></property>
<property name="password" value="패스워드"></property>
</bean> -->
<!-- set DB Oracle -->
<!-- <bean id="dataSourceProxy" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName" value="oracle.jdbc.driver.OracleDriver"/>
<property name="url" value="jdbc:oracle:thin:@112.155.175.204:1521:ORCL" />
<property name="username" value="계정명"></property>
<property name="password" value="패스워드"></property>
</bean>
<bean id="dataSource" class="net.sf.log4jdbc.Log4jdbcProxyDataSource">
<constructor-arg ref="dataSourceProxy" />
<property name="logFormatter">
<bean class="net.sf.log4jdbc.tools.Log4JdbcCustomFormatter">
<property name="loggingType" value="MULTI_LINE" />
</bean>
</property>
</bean> -->
입맛에 맞는걸로 가져다 쓰시면 되겠습니다.
그리고 다음으로 동일한 폴더 내에 context-sqlMapper.xml 을 만들어 주겠습니다.
위에서 언급했듯 context-**.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"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.3.xsd">
<!-- set Mybatis query xml -->
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dataSource" />
<!-- <property name="mapperLocations">
<list>
<value>classpath:/sql/**/*Mapper.xml</value>
<value>classpath:/sql/**/*Mapper.xml</value>
</list>
</property> 여러개 지정할시 사용함. -->
<property name="configLocation" value="classpath:META-INF/mybatis/mybatis-config.xml" />
<!-- <property name="mapperLocations" value="classpath:/sql/**/*_SQL.xml" /> -->
<!-- <property name="mapperLocations" value="classpath:/mapper/**/*_SQL.xml" /> -->
<property name="mapperLocations" value="classpath:/sql/**/*Mapper.xml" />
</bean>
<!-- destroy-method="clearCache" 추가 해주면 톰켓 끌때 WARNING이 발생하지 않는다 -->
<!-- SqlSessionTemplate sqlSessionTemplate = new SqlSessionTemplate(); -->
<bean id="sqlSessionTemplate" class="org.mybatis.spring.SqlSessionTemplate" destroy-method="clearCache">
<constructor-arg index="0" ref="sqlSessionFactory"/>
</bean>
</beans>
그리고 위의 내용을 추가해주시면 되겠습니다.
여기까지 하셨으면 다음은 common패키지를 생성하고 dao에 AbstractDAO를 생성해줍니다.
파일을 생성하셨으면 아래 코드를 작성해주겠습니다.
package com.co.kr.common.dao;
import java.util.HashMap;
import java.util.List;
import javax.annotation.Resource;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.mybatis.spring.SqlSessionTemplate;
import org.springframework.beans.factory.annotation.Autowired;
public class AbstractDAO {
protected Log log = LogFactory.getLog(AbstractDAO.class);
@Autowired
@Resource(name="sqlSession")
private SqlSessionTemplate sqlSession;
protected void printQueryId(String queryId) {
if(log.isDebugEnabled()){
log.debug("\t QueryId \t: " + queryId);
}
}
public Object insert(String queryId, Object params){
printQueryId(queryId);
return sqlSession.insert(queryId, params);
}
public Object update(String queryId, Object params){
printQueryId(queryId);
return sqlSession.update(queryId, params);
}
public Object delete(String queryId, Object params){
printQueryId(queryId);
return sqlSession.delete(queryId, params);
}
public Object selectOne(String queryId){
printQueryId(queryId);
return sqlSession.selectOne(queryId);
}
public Object selectOne(String queryId, Object params){
printQueryId(queryId);
return sqlSession.selectOne(queryId, params);
}
public String selectString(String queryId, Object params){
printQueryId(queryId);
return sqlSession.selectOne(queryId, params);
}
public int getSelect(String paramString, Object paramObject){
return sqlSession.selectOne(paramString, paramObject);
}
public <E> List<E> selectList(String queryId){
printQueryId(queryId);
return sqlSession.selectList(queryId);
}
public <E> List<E> selectList(String queryId, Object params){
printQueryId(queryId);
return sqlSession.selectList(queryId,params);
}
public HashMap<String, String> selectHashStringOne(String queryId){
printQueryId(queryId);
return sqlSession.selectOne(queryId);
}
public HashMap<String, Object> selectHashObjectOne(String queryId){
printQueryId(queryId);
return sqlSession.selectOne(queryId);
}
}
여기까지 마이바티스 연동에 대해 알아보았습니다.