- 목표
Database 연결과, Transction 을 Setting 과 Test를 한다. - 학습
- Default Setting Information
- Add Library
- commons-dbcp - Database Connection Pool은 DBCP 를 이용한다.
- commons-pool - DBCP를 사용하기 위한 필수 Library
- 접속을 원하는 Database 의 Driver
- aopalliance - Spring AOP를 사용하기 위한 Library
- jakarta-oro - Spring AOP를 사용하기 위한 Library
- com.springsource.org.aspectj.tools - Spring AOP를 사용하기 위한 Library
- Add context
- datasource-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.xsd">
<!-- hsql -->
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
<property name="driverClassName" value="net.sf.log4jdbc.DriverSpy"/>
<property name="url" value="jdbc:log4jdbc:hsqldb:hsql://localhost/javaworld"/>
<property name="username" value="sa"/>
</bean>
<!-- hsql -->
</beans>
- transaction-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"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.1.xsd
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.1.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.1.xsd">
<bean id="txManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"/>
</bean>
<!-- if do you want Annotaion
참조 : http://www.egovframe.org/wiki/doku.php?id=egovframework:rte:psl:transaction:declarative_transaction_management
-->
<tx:annotation-driven transaction-manager="txManager"/>
<!-- if do you want Annotaion -->
<!-- if Method throw Exception, rollback! -->
<tx:advice id="txAdvice" transaction-manager="txManager">
<tx:attributes>
<tx:method name="*" rollback-for="Exception"/>
</tx:attributes>
</tx:advice>
<!-- if Method throw Exception, rollback! -->
<!-- Aop setting -->
<aop:config>
<aop:pointcut id="requiredTx"
expression="execution(* kr.pe.lahuman.service.impl.*Impl.*(..))"/>
<aop:advisor advice-ref="txAdvice"
pointcut-ref="requiredTx" />
</aop:config>
<!-- Aop setting -->
</beans>
- 주요 Class
- TestDao
package kr.pe.lahuman.service.impl;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Collection;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javax.sql.DataSource;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.core.RowMapper;
import org.springframework.stereotype.Repository;
import org.springframework.transaction.annotation.Transactional;
@Repository
public class TestDao {
@Autowired
public void setDataSource(DataSource dataSource) {
this.jdbcTemplate = new JdbcTemplate(dataSource);
}
private JdbcTemplate jdbcTemplate;
public String getData(String str) {
return str;
}
public void deleteAllData(){
this.jdbcTemplate.update(
"delete from test_str");
}
private void insertMethod(String str) {
this.jdbcTemplate.update(
"insert into test_str(str) " +
"values(?)",
str);
}
public String insert(String str) throws Exception{
//insert
insertMethod(str);
return str;
}
public Collection<Map<String, String>> getList()throws Exception{
Collection<Map<String, String>> results = this.jdbcTemplate.query(
"select str from test_str",
new RowMapper() {
public Object mapRow(ResultSet rs, int rowNum) throws SQLException {
Map<String, String> map = new HashMap<String, String>();
map.put("str", rs.getString("str"));
return map;
}
});
return results;
}
}
- TestServiceImpl
package kr.pe.lahuman.service.impl;
import java.util.Collection;
import java.util.Map;
import kr.pe.lahuman.service.TestService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.PlatformTransactionManager;
import org.springframework.transaction.TransactionStatus;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.transaction.support.DefaultTransactionDefinition;
@Service
public class TestServiceImpl implements TestService {
@Autowired
private TestDao testDao;
@Override
public String getData(String str) throws Exception{
return testDao.getData(str);
}
@Override
@Transactional(rollbackFor=Exception.class) //anotation을 사용할 경우
public String insert2Error(String str) throws Exception {
testDao.insert(str);
testDao.insert(str);
testDao.insert(str);
testDao.insert(str);
testDao.insert(str);
testDao.insert(str);
//강제로 Exception 발생
throw new Exception("Insert Error");
}
@Override
public String insert(String str) throws Exception {
return testDao.insert(str);
}
@Override
public Collection<Map<String, String>> getList() throws Exception {
return testDao.getList();
}
@Override
public void deleteAllData() throws Exception {
testDao.deleteAllData();
}
}
첨부 파일 :