데이터 저장소를 MySQL을 사용하며 CRUD를 위하여 MyBatis를 사용한다. Spring 프레임워크에서 사용하기 위한 설정과 사용법을 알아보자
1. JDBC Pool 설정
- tomcat 7을 사용하므로 tomcat의 jdbc-pool을 사용한다 (참조)
- maven pom.xml : 이미 $TOMCAT_HOME/lib 밑에 라이브러리가 존재할 경우 provided 설정
<!-- spring jdbc dependency spring-tx -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>${spring.version}</version>
</dependency>
<!-- tomcat jdbc -->
<dependency>
<groupId>org.apache.tomcat</groupId>
<artifactId>tomcat-jdbc</artifactId>
<version>${tomcat.jdbc.version}</version>
<!--scope>provided</scope-->
</dependency>
- spring context 와 properties 설정하기
// web.xml 에서 dbpool-context.xml을 인식하기 위하여 설정변경
<!-- root-context.xml, mybatis-context.xml -->
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>
/WEB-INF/*-context.xml
</param-value>
</context-param>
// dbpool-context.xml 에서 properties 에서 환경값을 읽어서 설정한다
// common-jdbc, c3po보다 tomcat의 jdbc-pool 성능이 더 좋다
<bean
class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
<property name="locations">
<value>/WEB-INF/dbpool.properties</value>
</property>
</bean>
<bean id="dataSource" class="org.apache.tomcat.jdbc.pool.DataSource"
destroy-method="close">
<property name="driverClassName" value="${jdbc.driverClass}" />
<property name="url" value="${jdbc.url}" />
<property name="username" value="${jdbc.username}" />
<property name="password" value="${jdbc.password}" />
<property name="initialSize" value="${jdbc.min.size}" />
<property name="maxActive" value="${jdbc.max.size}" />
<property name="maxIdle" value="5" />
<property name="minIdle" value="2" />
</bean>
// dbpool.properties 내역
jdbc.driverClass=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/SolarDB?autoReconnect=true
jdbc.username=admin
jdbc.password=admin
jdbc.min.size=2
jdbc.max.size=10
2. Transaction 설정
- @Transactional 애노테이션 기반으로 트랜잭션을 관리하고자 할 경우 설정
- DAO 보다는 가급적 DAO를 호출하는 Service Interface의 Insert, Update, Delete 메소드 선언할 때 @Transactional 설정 (참조)
// dbpool-context.xml 에서 dataSource를 TransactionManager에 할당한다
<!-- transaction manager -->
<context:annotation-config/>
<tx:annotation-driven transaction-manager="transactionManager" />
<bean id="transactionManager"
class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"></property>
</bean>
- @Transactional 사용시 Propagation 동작 방식에 대해서 숙지하자 (참조)
- Spring과 그외 관련 설정 파일을 WEB-INF/spring 폴더로 위치 변경함
3. myBatis 설정
- DataSource와 Transaction에 대한 설정이 끝났다면 myBatis를 설정한다
- MySQL을 사용할 것이다
- myBatis의 Resource인 config와 mapper xml 파일은 src/main/resource로 이동하자 (Person.xml, mybatis-config.xml)
// dbpool-context.xml 에서 dataSource를 설정한다
// SqlSessionTemplate 을 DAO에서 사용할 것이다
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dataSource" />
<property name="configLocation" value="classpath:mybatis-config.xml" />
</bean>
<bean id="sqlSessionTemplate" class="org.mybatis.spring.SqlSessionTemplate">
<constructor-arg ref="sqlSessionFactory" />
</bean>
// mybatis-config.xml 에서 mapper.xml의 위치를 설정
// Person.xml 과 같은 mapper xml을 여러개 열거 할 수 있다
<configuration>
<settings>
<setting name="cacheEnabled" value="false" />
<setting name="useGeneratedKeys" value="true" />
<setting name="defaultExecutorType" value="REUSE" />
</settings>
<typeAliases>
<typeAlias alias="Person" type="com.mobiconsoft.dashboard.domain.Person"></typeAlias>
</typeAliases>
<mappers>
<mapper resource="com/mobiconsoft/dashboard/mybatis/mapper/Person.xml"></mapper>
</mappers>
</configuration>
- Mysql을 설치 및 Person Table을 하나 만들고 Mapper xml을 설정한다. 여기서는 예제로 Person.xml 파일 하나만 설정함
// mysql 에서 테이블 생성하기 (참조)
mysql> create table person(
-> id INT,
-> name VARCHAR(30));
// Person.xml 맵핑 xml 내역
// 호출 방법 ID : <namespace>.<id> ex) com.mobiconsoft.dashboard.person
<mapper namespace="com.mobiconsoft.dashboard.Person">
<resultMap type="Person" id="PersonResult">
<id property="id" column="id"/>
<result property="name" column="name"/>
</resultMap>
<select id="getPersons" resultMap="PersonResult">
SELECT
*
FROM
person
</select>
<select id="getPerson" parameterType="Integer" resultMap="PersonResult">
SELECT
*
FROM
person
WHERE
id=#{id}
</select>
<insert id="savePerson" parameterType="Person"> <!-- useGeneratedKeys="true" keyProperty="id"> -->
INSERT INTO
person(id, name)
VALUES
(#{id}, #{name})
</insert>
<update id="updatePerson" parameterType="Person">
UPDATE
person
SET
name=#{name}
WHERE
id=#{id}
</update>
<delete id="deletePerson" parameterType="Integer">
DELETE FROM
person
WHERE
id=#{id}
</delete>
</mapper>
- DAO와 DAO를 구현한다.
// DAO Interface
public interface PersonDAO {
public List<Person> getPersons();
public Person getPerson(int id);
public Person savePerson(Person person);
public Person updatePerson(Person person);
public void deletePerson(int id);
}
// DAO Implementation
@Repository
public class PersonDAOImpl implements PersonDAO {
@Autowired
private SqlSession sqlSession;
private static final Logger logger = LoggerFactory.getLogger(PersonDAOImpl.class);
// end must be point .
private static final String NS = "com.mobiconsoft.dashboard.Person.";
@Override
public List<Person> getPersons() {
logger.info("dao select all");
return sqlSession.selectList(NS+"getPersons");
}
@Override
public Person getPerson(int id) {
logger.info("dao select one id is " + id);
return sqlSession.selectOne(NS+"getPerson");
}
@Override
public Person savePerson(Person person) {
logger.info("dao save person is " + person);
sqlSession.insert(NS+"savePerson", person);
return person;
}
@Override
public Person updatePerson(Person person) {
logger.info("dao update person is " + person);
sqlSession.update(NS+"updatePerson", person);
return person;
}
@Override
public void deletePerson(int id) {
logger.info("dao delete id is " + id);
sqlSession.delete(NS+"deletePerson", id);
}
}
- 기존 PersonServiceImpl의 내역을 변경한다 : @Transactional을 통하여 트랜잭션을 Service 레벨에서 관리한다
@Service
public class PersonServiceImpl implements PersonService {
@Autowired
PersonDAO personDAO;
@Override
public List<Person> getPersons() {
return personDAO.getPersons();
}
@Override
public Person getById(Integer id) {
return personDAO.getPerson(id);
}
@Override
@Transactional
public Person save(Person person) {
personDAO.savePerson(person);
return person;
}
@Override
@Transactional
public Person update(Person person) {
personDAO.updatePerson(person);
return person;
}
@Override
@Transactional
public void delete(Integer id) {
personDAO.deletePerson(id);
}
}
* 저장소 : https://github.com/ysyun/SPA_Angular_SpringFramework_Eclipse_ENV/tree/feature_mybatis
<참조>
- Tomcat 7일 경우 Spring에서 Tomcat JDBC-Pool 사용하기
- Common-JDBC와 C3P0와 Tomcat JDBC-Pool 성능차이
- Transaction Manager 선언적으로 사용하기
'My Projects > BI Dashboard' 카테고리의 다른 글
[BI Dashboard] Angular.js 엔터프라이즈 애플리케이션 구조 만들기 (0) | 2013.11.22 |
---|---|
[BI Dashboard] Angular+Bootstrap을 Windows와 IE8 이상에 적응시키기 (0) | 2013.11.21 |
[BI Dashboard] myBatis에서 Mapper Interface로 고도화하기 (0) | 2013.11.20 |
[BI Dashboard] Eclipse용 Spring과 AngularJS Framework 개발환경 셋업하기 (0) | 2013.11.16 |
[BI Dashboard] Eclipse Juno에 Spring + Maven 환경설정 및 테스트 (0) | 2013.11.15 |