전자정부 프레임워크 Mybatis 사용하기
=> xml 설정
context-datasource.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"> -->
<!-- Document root element "beans", must match DOCTYPE root "mapper" => mapper용 bean 에 써줘야할 root 문을 썼다는 의미 config 용으로 바꿔야함 -->
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:jdbc="http://www.springframework.org/schema/jdbc"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.0.xsd
http://www.springframework.org/schema/jdbc http://www.springframework.org/schema/jdbc/spring-jdbc-4.0.xsd">
<!-- Mysql (POM에서 commons-dbcp, mysql-connector-java 관련 라이브러리 설정 )
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
<property name="driverClassName" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://127.0.0.1:3306/example" />
<property name="username" value="user"/>
<property name="password" value="password"/>
</bean>
-->
<!-- oracle (POM에서 commons-dbcp, ojdbc(라이센스 사항으로 별도로 배포되지 않음) 관련 라이브러리 설정)
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
<property name="driverClassName" value="oracle.jdbc.driver.OracleDriver"/>
<property name="url" value="jdbc:oracle:thin:@127.0.0.1:1521:example" />
<property name="username" value="user"/>
<property name="password" value="password"/>
</bean>
-->
<!-- cubrid -->
<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName" value="cubrid.jdbc.driver.CUBRIDDriver"/>
<property name="url" value="jdbc:cubrid:DB_IP:PORT:DB_NAME:::?charset=utf8" />
<property name="username" value="USERNAME"/>
<property name="password" value="USERPASSWORD"/>
</bean>
</beans>
DB에 접근할 수 있는 connection 마련
context-datasource.xml은 별도의 설정 파일입니다. web.xml 부분에
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath*:spring/context-*.xml</param-value>
</context-param>
이런식으로 외부에 설정 파일을 사용하겠다는 명시가 있으면 사용이 가능한 외부의 설정파일입니다.
context-sqlMap.xml
(원래 context-sqlMap.xml는 ibatis에 사용. context-mapper.xml 에 설정해줘야하는데 기본 설정이 context-mapper대신 sqlMap을 바라보고 있었고, 그대로 사용했음)
<?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.0.xsd">
<!-- SqlSession setup for MyBatis Database Layer -->
<bean id="sqlSession" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dataSource" />
<property name="configLocation" value="classpath:/egovframework/sqlmap/example/sql-mapper-config.xml" />
<property name="mapperLocations" value="classpath:/egovframework/sqlmap/example/mappers/*.xml" />
</bean>
<!-- sql-mapper-config.xml 의 설정을 참고해서 mappers/*.xml 위치의 매퍼를 실행해달라는 말. 이때 사용할 DB 연결은 dataSource(context-datasource.xml 에서 사용한 것)
<!-- MapperConfigurer setup for MyBatis Database Layer with @Mapper("deptMapper") in DeptMapper Interface -->
<bean class="egovframework.rte.psl.dataaccess.mapper.MapperConfigurer">
<property name="basePackage" value="egovframework.example.sample.service.impl" />
</bean>
</beans>
context-sqlMap.xml 도 마찬가지로 외부 설정파일입니다. 보시면 sqlSession을 만드는 부분인데, dataSource는 뭘 사용하고 설정파일은 뭘사용할지 적는 부분이 보입니다.
sql-mapper-config.xml
<?xml version="1.0" encoding="UTF-8"?>
<!-- 이 부분이 mybatis config 파일이라는 사실을 알려주는 부분이므로 반드시 적는다 -->
<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<typeAliases>
<typeAlias alias="egovMap" type="egovframework.rte.psl.dataaccess.util.EgovMap"/>
<typeAlias alias="searchVO" type="egovframework.example.sample.service.SampleDefaultVO"/>
<typeAlias alias="sampleVO" type="egovframework.example.sample.service.SampleVO"/>
<typeAlias alias="UserVO" type="egovframework.example.sample.service.UserVO"/>
<typeAlias alias="BoardVO" type="egovframework.example.sample.service.BoardVO"/>
<typeAlias alias="Criteria" type="egovframework.example.sample.service.Criteria"/>
<typeAlias alias="FileVO" type="egovframework.example.sample.service.FileVO"/>
</typeAliases>
</configuration>
VO를 특정이름으로 사용 가능하도록 별칭을 붙여주는 부분입니다.
*Mapper.xml
<?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">
<!-- <!DOCTYPE sqlMap PUBLIC "-//iBATIS.com//DTD SQL Map 2.0//EN" "http://www.ibatis.com/dtd/sql-map-2.dtd"> sqlMap을 사용하려면 이 버전 -->
<!-- boardMapper 라는 이름으로 bean에 등록된다. 경로와 이름이 중요. -->
<mapper namespace="egovframework.example.sample.service.impl.BoardMapper">
<!-- 컬럼을 특정 이름으로 binding 시키고 싶을 때 사용 -->
<!--
<resultMap type="egovframework.example.sample.service.BoardVO" id="boardVO">
<result property="seq" column="SEQ" />
<result property="userId" column="USER_ID" />
<result property="title" column="TITLE" />
<result property="content" column="CONTENT" />
<result property="regDt" column="REG_DT" />
<collection property="fileList" resultMap="fileVO"/>
</resultMap>
-->
<select id="selectDupl" resultType="int" parameterType="UserVO">
SELECT
COUNT(*) AS duplCount
FROM
test_user tu
WHERE
tu.user_id = #{userId}
</select>
</mapper>
매퍼파일의 일부입니다.
BoardMapper.java
package egovframework.example.sample.service.impl;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Set;
import org.springframework.stereotype.Repository;
import egovframework.example.sample.service.BoardVO;
import egovframework.example.sample.service.Criteria;
import egovframework.example.sample.service.FileVO;
import egovframework.example.sample.service.SearchCriteria;
import egovframework.example.sample.service.UserVO;
import egovframework.example.util.CommonUtil;
import egovframework.rte.psl.dataaccess.EgovAbstractMapper;
@Repository("boardMapper")
public class BoardMapperImpl extends EgovAbstractMapper {
/*
* @Repository("boardMapper")
* EgovAbstractMapper 추상클래스를 상속한 Mapper
* 스프링 DI가 생성해준 boardMapper id를 사용
*/
public int selectDupl(UserVO user) {
// TODO Auto-generated method stub
return selectOne("selectDupl", user);
}
}
위 파일은 이름은 매퍼이지만 사실상 스프링의 dao의 역할을 하고 있습니다.
한편 EgovAbstractMapper 을 상속하는 부분은 필수 입니다. 전자정부 프레임워크에서 자동으로 객체화 시킨 매퍼는 boardMapper 이란 이름으로 객체화 되어있고, 해당 객체를 위 클래스에 넣어줍니다.
dao 대신 interface를 이용한 방법도 있습니다. 위치는 자유롭게 만들어도 되나, 잘 모르시겠으면 일단은 서비스 옆에 만들어주세요!
package egovframework.example.sample.service.impl;
import egovframework.example.sample.service.UserVO;
@Mapper("boardMapper")
public interface BoardMapper {
/*
이렇게 명시만 해주고 BoardService에서
@Resource(name = "boardMapper")
private BoardMapper boardMapper;
이런식으로 사용하면 됩니다.
*/
public int selectDupl(UserVO user) throws Exception;
}