4. 5. 스프링 트랜잭션(Spring Transaction)
: AOP를 이용하여 선언적 트랜잭션을 설정하는 방법에는 2가지가 있다.
5-4. 스프링 트랜잭션관리
5-4-1 스프링 선언적 트랜잭션 관리 – XML 설정방식
2가지 방법
1. XML Configuration - 스프링의 빈 설정파일에 <tx:advice> <aop:config> 등의 태그를 사용하여 설정.
2. Transactional Annotation - 해당 메소드에 @Transactional Annotation을 추가하여 설정.(@Transactional)
Spring2.0 이상에서 tx 스키마에 정의된 <tx:advice> 엘리먼트에 의해 Transaction의 어드바이스를 쉽
게 구현할 수 있다.
아래와 같이 XML 설정 파일에 spring-aop-4.X.xsd , spring-tx-4.X.xsd를 추가해야 한다
6. 5. 스프링 트랜잭션(Spring Transaction)
5-4. 스프링 트랜잭션관리
5-4-1 스프링 선언적 트랜잭션 관리 – XML 설정방식
Spring AOP가 포인트컷 정의를 위해 AspecJ 포인트컷 표현식을 사용하므로 AspectJ 위버 지원라이브
러리를 클래스 패스에 추가해야 한다. 메이븐을 사용한다면 아래 의존 라이브러리를 pom.xml에 추가
한다.
<!-- AspectJ -->
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjrt</artifactId>
<version>${org.aspectj-version}</version>
</dependency>
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
<version>${org.aspectj-version}</version>
</dependency>
7. 5. 스프링 트랜잭션(Spring Transaction)
5-4. 스프링 트랜잭션관리
5-4-1 스프링 선언적 트랜잭션 관리 – XML 설정방식
tx 네임스페이스에서 tx:advice가 가장 중요한데 사용예는 다음과 같다. 또한 스프링 AOP가 프록시 기
반이므로 트랜잭션이 적용될 메소드는 public으로 선언되어야 한다.
<tx:advice id=“txAdvice” transaction-manager=“transactionManager”>
<tx:attributes>
<tx:method name=“insert*” propagation=“REQUIRED”/>
<tx:method name=“get*” propagation=“REQUIRED”read-only=“true”/>
</tx:attributes>
</tx:advice>
<bean id=“transactionManager”
class=“org.springframework.jdbc.datasource.DataSourceTransactionManager”>
<property name=“dataSource” ref=“dataSource”/>
</bean>
8. 5. 스프링 트랜잭션(Spring Transaction)
5-4. 스프링 트랜잭션관리
5-4-1 스프링 선언적 트랜잭션 관리 – XML 설정방식
tx:attribute에 사용되는 속성
1. name : 적용될 어드바이스에 대응되는 메소드명(필수), 와일드카드 (*)가능
2. isolation : 트랜잭션 격리 수준
3. no-rollback-for : 예외가 발생 했을때 이를 무시하고 Transaction을 롤백하지 않고 계속 진행할 예외를 지정
4. propagation : Transaction 전파방식 지정, 기본값:REQUIRED
5. read-only : 트랜잭션이 읽기 전용인지, 기본값:FALSE
6. rollback-for : 예외가 발생했을 때 트랜잭션을 롤백 시킬 예외들의 구체적인 타입을 콤마로 구분하여 기술
7. timeout : 트랜잭션 타임아웃을 지정
9. 5. 스프링 트랜잭션(Spring Transaction)
5-4. 스프링 트랜잭션관리
5-4-1 스프링 선언적 트랜잭션 관리 – XML 설정방식
<tx:advice> 자체만 보았을 때는 어느 빈에 advice가 적용되어야 하는지 알 수 없다.
그러므로 Pointcut이 필요하다. (AOP의 Advice에 지나지 않는다.)
<aop:config>
<aop:advisor pointcut=“execution(* *..SpringBoardDAO.*dao(..))”
advice-ref=“txAdvice”/>
</aop:config>
10. 5. 스프링 트랜잭션(Spring Transaction)
5-4. 스프링 트랜잭션관리
5-4-1 스프링 선언적 트랜잭션 관리 – XML 설정방식
5-4-1-1 선언적 트랜잭션 관리 – XML 설정방식 예제
springtr1 이라는 이름의 spring maven Project를 생성하자.(EMP 테이블 데이터를 SELECT하고 INSERT하는 예제)
전체 프로젝트 구성은 아래와 같다.
11. 5. 스프링 트랜잭션(Spring Transaction)
5-4. 스프링 트랜잭션관리
5-4-1 스프링 선언적 트랜잭션 관리 – XML 설정방식
5-4-1-1 선언적 트랜잭션 관리 – XML 설정방식 예제
STS에서
New Project Spring Legacy Project
Project Name : springtr1
Simple Projects : Simple Spring Maven
[pom.xml]
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>org.springframework.samples</groupId>
<artifactId>springtr1</artifactId>
<version>0.0.1-SNAPSHOT</version>
<properties>
<!-- Generic properties -->
<java.version>1.6</java.version>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<!-- Spring -->
<spring-framework.version>4.2.4.RELEASE</spring-framework.version>
12. 5. 스프링 트랜잭션(Spring Transaction)
5-4. 스프링 트랜잭션관리
5-4-1 스프링 선언적 트랜잭션 관리 – XML 설정방식
5-4-1-1 선언적 트랜잭션 관리 – XML 설정방식 예제
[pom.xml] 이어서
<!-- Logging -->
<logback.version>1.0.13</logback.version>
<slf4j.version>1.7.5</slf4j.version>
<!-- Test -->
<junit.version>4.11</junit.version>
</properties>
<dependencies>
<!-- Spring and Transactions -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>${spring-framework.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-tx</artifactId>
<version>${spring-framework.version}</version>
</dependency>
<!-- Logging with SLF4J & LogBack -->
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
13. 5. 스프링 트랜잭션(Spring Transaction)
5-4. 스프링 트랜잭션관리
5-4-1 스프링 선언적 트랜잭션 관리 – XML 설정방식
5-4-1-1 선언적 트랜잭션 관리 – XML 설정방식 예제
[pom.xml] 이어서
<version>${slf4j.version}</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
<version>${logback.version}</version>
<scope>runtime</scope>
</dependency>
<!-- Test Artifacts -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>${junit.version}</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
<version>1.5.4</version>
</dependency>
<dependency>
<groupId>commons-dbcp</groupId>
<artifactId>commons-dbcp</artifactId>
14. 5. 스프링 트랜잭션(Spring Transaction)
5-4. 스프링 트랜잭션관리
5-4-1 스프링 선언적 트랜잭션 관리 – XML 설정방식
5-4-1-1 선언적 트랜잭션 관리 – XML 설정방식 예제
[pom.xml] 이어서
<version>1.4</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>3.2.3.RELEASE</version>
</dependency>
<dependency>
<groupId>com.oracle</groupId>
<artifactId>ojdbc6</artifactId>
<version>11.1.0.7.0</version>
</dependency>
</dependencies>
<repositories>
<repository>
<id>oracle</id>
<name>ORACLE JDBC Repository</name>
<url>http://maven.jahia.org/maven2</url>
</repository>
</repositories>
</project>
15. 5. 스프링 트랜잭션(Spring Transaction)
5-4. 스프링 트랜잭션관리
5-4-1 스프링 선언적 트랜잭션 관리 – XML 설정방식
5-4-1-1 선언적 트랜잭션 관리 – XML 설정방식 예제
[Emp.java]
package onj.edu.tr1.model;
public class Emp {
int empno;
String ename;
int deptno;
public Emp(int empno, String ename, int deptno) {
this.empno = empno;
this.ename = ename;
this.deptno = deptno;
}
public int getEmpno() { return empno;}
public void setEmpno(int empno) { this.empno = empno; }
public String getEname() { return ename; }
public void setEname(String ename) { this.ename = ename; }
public int getDeptno() { return deptno; }
public void setDeptno(int deptno) { this.deptno = deptno; }
}
16. 5. 스프링 트랜잭션(Spring Transaction)
5-4. 스프링 트랜잭션관리
5-4-1 스프링 선언적 트랜잭션 관리 – XML 설정방식
5-4-1-1 선언적 트랜잭션 관리 – XML 설정방식 예제
[OnjDao.java]
package onj.edu.tr1.dao;
//JdbcDaoSupport클래스는 간단한 DataSource를 지원하기 위해 JdbcTemplate 클래스를 지원.
//jdbcTemplate은 DB연결, PrepatedStatement객체생성, 파라미터주입, SQL문장실행,
//DB접속종료등을 전담하며 getJdbcTemplate()을 통해 얻는다.
@Repository("onjDao")
public class OnjDao{
private JdbcTemplate jdbcTemplate;
@Autowired public void setDataSource(DataSource dataSource){
this.jdbcTemplate = new JdbcTemplate(dataSource);
}
public List<Emp> getEmpByDeptno(int deptno) {
String sql = "select empno, ename, deptno from emp where deptno = ?";
List<Emp> list = jdbcTemplate.query(
sql,
new Object[] { deptno },
new RowMapper() {
public Object mapRow(ResultSet rs, int index) throws
SQLException {
int empno = rs.getInt("empno");
String ename = rs.getString("ename");
int deptno = rs.getInt("deptno");
return new Emp(empno, ename, deptno);
}
}
);
17. 5. 스프링 트랜잭션(Spring Transaction)
5-4. 스프링 트랜잭션관리
5-4-1 스프링 선언적 트랜잭션 관리 – XML 설정방식
5-4-1-1 선언적 트랜잭션 관리 – XML 설정방식 예제
[OnjDao.java] 이어서
return list;
}
public void insertEmps() throws Exception {
String sql = "insert into emp(empno, ename, deptno) values (?, ?, ?)";
jdbcTemplate.update(sql, new Object[] { 111, "Onj1" , 10});
jdbcTemplate.update(sql, new Object[] { 222, "Onj2", 10 });
jdbcTemplate.update(sql, new Object[] { 333, "Onj3", 10 });
//같은 데이터를 넣으면 키값이 중복되어 DataAccessException 발생(런타임예외)
jdbcTemplate.update(sql, new Object[] { 333, "Onj3", 10 });
//throw new Exception();
}
}
18. 5. 스프링 트랜잭션(Spring Transaction)
5-4. 스프링 트랜잭션관리
5-4-1 스프링 선언적 트랜잭션 관리 – XML 설정방식
5-4-1-1 선언적 트랜잭션 관리 – XML 설정방식 예제
[OnjService.java]
package onj.edu.tr1.service;
@Service("onjService")
public class OnjService {
@Autowired
private OnjDao dao;
public OnjService() {}
public OnjService(OnjDao onjDao) {
this.dao = onjDao;
}
public List<Emp> getEmpByDeptno(int deptno) {
return dao.getEmpByDeptno(deptno);
}
public void insertEmps() throws Exception{
dao.insertEmps();
}
}
20. 5. 스프링 트랜잭션(Spring Transaction)
5-4. 스프링 트랜잭션관리
5-4-1 스프링 선언적 트랜잭션 관리 – XML 설정방식
5-4-1-1 선언적 트랜잭션 관리 – XML 설정방식 예제
[onjoraclejava.xml] 이어서
p:password = "tiger" />
<!-- 트랜잭션매니저 정의 -->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"/>
</bean>
<!-- 트랜잭션용 Advice 구성 -->
<tx:advice id="txAdvice" transaction-manager="transactionManager">
<tx:attributes>
<!-- 예외 중에서 Exception이 발생한 경우에도 롤백이 실행된다는 의미 -->
<!-- 트랜잭션 설정이 된 메소드에서 RuntimeException이 발생한 경우와 Errors가 발생한 경우에만
기본적으로 롤백을 수행하며 그 외의 예외들은 아래와같이직접 설정한 경우에만 롤백을 한다. -->
<tx:method name="*"
propagation="REQUIRED” rollback-for=“Exception” />
</tx:attributes>
</tx:advice>
<!-- aop 네임스페이스를 이용한 트랙잭션이 적용될 매소드(Pointcut), 충고자(Advisor)정의 -->
<aop:config>
<aop:pointcut id="onjPointCut"
21. 5. 스프링 트랜잭션(Spring Transaction)
5-4. 스프링 트랜잭션관리
5-4-1 스프링 선언적 트랜잭션 관리 – XML 설정방식
5-4-1-1 선언적 트랜잭션 관리 – XML 설정방식 예제
[onjoraclejava.xml] 이어서
expression="execution(* onj.edu.tr1.dao.*Dao.insert*(..))"/>
<aop:advisor advice-ref="txAdvice"
pointcut-ref="onjPointCut" />
</aop:config>
<context:component-scan base-package="onj.edu.tr1.dao"/>
<context:component-scan base-package="onj.edu.tr1.service"/>
</beans>
22. 5. 스프링 트랜잭션(Spring Transaction)
5-4. 스프링 트랜잭션관리
5-4-1 스프링 선언적 트랜잭션 관리 – XML 설정방식
5-4-1-1 선언적 트랜잭션 관리 – XML 설정방식 예제
[테스트 방법]
1. OnjDao.java에서 현재대로 키가 중복되는 데이터를 입력해 보라.
트랜잭션은 롤백된다.
2. 키 중복되는 부분을 주석으로 막고 실행해보라.
트랜잭션은 정상 commit 된다.
3. OnjDao.java에서 insertEmps() 메소드의 throw new Exception(); 부분 주석을 풀고 테스트
- onjoraclejava.xml에서
<tx:method name="*" propagation="REQUIRED" rollback-for="Exception"/>인 경우
트랜잭션은 롤백된다.
- onjoraclejava.xml에서
<tx:method name="*" propagation="REQUIRED“ no-rollback-for=“Exception”/>인 경우
트랜잭션은 롤백되지 않는다. 정상 commit된다.
23. 5. 스프링 트랜잭션(Spring Transaction)
5-4. 스프링 트랜잭션관리
5-4-2 선언적 트랜잭션 관리 – @Transactional 개요
XML 설정에 <tx:annotation-driven /> 요소가 설정 되어 있다면 트랜잭션을 어노테이션으로 설정 가능 하다.
이 방법은 직관적이고 알기 쉽지만 수정시 자바 코드 자체를 수정해야 한다는 단점이 있다.
트랜잭션 처리를 원하는 메서드에 @Transactional이란 어노테이션을 사용하면 되고 <aop>설정은 어노테이션
과 전혀 무관하다.
인터페이스, 클래스, 메서드에 동시에 트랜잭션 어노테이션이 설정 되어 있다면 스프링은 메서드 어노테이션을
제일 먼저 고려하고 그 다음이 클래스, 인터페이스 순서로 고려 합니다.
24. [ 교육생과 함께 수강료 0원 + 훈련지원금 최대416,000원으로 취업까지 성공패키지]
전자정부프레임워크기반 응용SW엔지니어링 구직자 양성과정(평일주간)
일 시 : 2017년03월27일(월) ~ 2017년11월08일(수)
장 소 : 탑 크리에듀교육센터
수강료 : 전액무료
신 청: 02-851-4790 /http://www.topcredu.co.kr/sub/crcl/view/open/2057
“ 여러분의 도전을 응원합니다. ”
25. Any Questions ?
THANK YOU
FOR YOUR ATTENTION
무료국비지원교육 / 구로자바학원 _ 탑크리에듀 교육센터
http://www.topcredu.co.kr