25
Spring Framework & MyBatis 스스스 스스스스스 & 스스스스스 스스 탑탑탑탑탑 탑탑탑탑

스프링 트랜잭션(SpringTransaction)

  • Upload
    3-2

  • View
    54

  • Download
    1

Embed Size (px)

Citation preview

Page 1: 스프링 트랜잭션(SpringTransaction)

Spring Framework & My-Batis스프링 프레임워크 & 마이바티스 강의

탑크리에듀 교육센터

Page 2: 스프링 트랜잭션(SpringTransaction)

CONTENTS

5. 스프링 트랜잭션 (Spring Transaction)

5.4 스프링 선언적 트랜잭션 관리

5.4.1 스프링 선언적 트랜잭션 관리 – XML 설정방식

5.4.1.1 스프링 선언적 트랜잭션 관리 – XML 설정방식 예제

5.4.2 스프링 선언적 트랜잭션 관리 – @Transactional 개요

Page 3: 스프링 트랜잭션(SpringTransaction)

Chapter 5 스프링 트랜잭션 (Spring Transaction)

~ 5.4.2.2

Page 4: 스프링 트랜잭션(SpringTransaction)

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 를 추가해야 한다

Page 5: 스프링 트랜잭션(SpringTransaction)

5. 스프링 트랜잭션 (Spring Transaction)5-4. 스프링 트랜잭션관리 5-4-1 스프링 선언적 트랜잭션 관리 – 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:context="http://www.springframework.org/schema/context"xmlns:tx="http://www.springframework.org/schema/tx"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframe-work.org/schema/beans/spring-beans-4.2.xsdhttp://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.2.xsdhttp://www.springframework.org/schema/context http://www.springframework.org/schema/con-text/spring-context-4.2.xsdhttp://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.2.xsd">…</beans>)

Page 6: 스프링 트랜잭션(SpringTransaction)

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>

Page 7: 스프링 트랜잭션(SpringTransaction)

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>

Page 8: 스프링 트랜잭션(SpringTransaction)

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 : 트랜잭션 타임아웃을 지정

Page 9: 스프링 트랜잭션(SpringTransaction)

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>

Page 10: 스프링 트랜잭션(SpringTransaction)

5. 스프링 트랜잭션 (Spring Transaction)5-4. 스프링 트랜잭션관리 5-4-1 스프링 선언적 트랜잭션 관리 – XML 설정방식 5-4-1-1 선언적 트랜잭션 관리 – XML 설정방식 예제

springtr1 이라는 이름의 spring maven Project 를 생성하자 .(EMP 테이블 데이터를 SELECT 하고 INSERT 하는 예제 )

전체 프로젝트 구성은 아래와 같다 .

Page 11: 스프링 트랜잭션(SpringTransaction)

5. 스프링 트랜잭션 (Spring Transaction)5-4. 스프링 트랜잭션관리 5-4-1 스프링 선언적 트랜잭션 관리 – XML 설정방식 5-4-1-1 선언적 트랜잭션 관리 – XML 설정방식 예제

STS 에서New Project Spring Legacy ProjectProject Name : springtr1Simple 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>

 

Page 12: 스프링 트랜잭션(SpringTransaction)

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>

Page 13: 스프링 트랜잭션(SpringTransaction)

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>

Page 14: 스프링 트랜잭션(SpringTransaction)

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>

Page 15: 스프링 트랜잭션(SpringTransaction)

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; }

}

Page 16: 스프링 트랜잭션(SpringTransaction)

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);}

});

Page 17: 스프링 트랜잭션(SpringTransaction)

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();}

}

Page 18: 스프링 트랜잭션(SpringTransaction)

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 { 

@Autowiredprivate 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();

}}

Page 19: 스프링 트랜잭션(SpringTransaction)

5. 스프링 트랜잭션 (Spring Transaction)5-4. 스프링 트랜잭션관리 5-4-1 스프링 선언적 트랜잭션 관리 – XML 설정방식 5-4-1-1 선언적 트랜잭션 관리 – XML 설정방식 예제

[onjoraclejava.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:p="http://www.springframework.org/schema/p"

xmlns:context="http://www.springframework.org/schema/context"

xmlns:tx="http://www.springframework.org/schema/tx"

xsi:schemaLocation="http://www.springframework.org/schema/beans

http://www.springframework.org/schema/beans/spring-beans-4.2.xsd

http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-

aop-4.2.xsd

http://www.springframework.org/schema/context

http://www.springframework.org/schema/context/spring-context-4.2.xsd

http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-

4.2.xsd"><!-- 접속할 DB 의 DataSource 정의 --><bean name="dataSource” class="org.apache.commons.dbcp.BasicDataSource"p:driverClassName ="oracle.jdbc.driver.OracleDriver” p:url = "jdbc:oracle:thin:@192.168.0.27:1521:onj"

p:username = "scott”

Page 20: 스프링 트랜잭션(SpringTransaction)

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"

Page 21: 스프링 트랜잭션(SpringTransaction)

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>

Page 22: 스프링 트랜잭션(SpringTransaction)

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 된다 .

Page 23: 스프링 트랜잭션(SpringTransaction)

5. 스프링 트랜잭션 (Spring Transaction)5-4. 스프링 트랜잭션관리 5-4-2 선언적 트랜잭션 관리 – @Transactional 개요

XML 설정에 <tx:annotation-driven /> 요소가 설정 되어 있다면 트랜잭션을 어노테이션으로 설정 가능 하다 . 이 방법은 직관적이고 알기 쉽지만 수정시 자바 코드 자체를 수정해야 한다는 단점이 있다 . 

트랜잭션 처리를 원하는 메서드에 @Transactional 이란 어노테이션을 사용하면 되고 <aop> 설정은 어노테이션과 전혀 무관하다 .

인터페이스 , 클래스 , 메서드에 동시에 트랜잭션 어노테이션이 설정 되어 있다면 스프링은 메서드 어노테이션을 제일 먼저 고려하고 그 다음이 클래스 , 인터페이스 순서로 고려 합니다 .

Page 24: 스프링 트랜잭션(SpringTransaction)

[ 교육생과 함께 수강료 0 원 + 훈련 지원금 최대 416,000 원 으로 취업까지

성공 패키지 ]

전자정부프레임워크기반 응용 SW 엔지니어링 구직자 양성과정 ( 평일주간 )

일 시 : 2017 년 03 월 27 일 ( 월 ) ~ 2017 년 11 월 08 일 ( 수 )장 소 : 탑 크리에듀교육센터

수강료 : 전액 무료

신 청 : 02- 851-4790 / http://www.topcredu.co.kr/sub/crcl/view/open/2057

“ 여러분의 도전을 응원합니다 . ”

Page 25: 스프링 트랜잭션(SpringTransaction)

Any Questions ?

THANK YOU FOR YOUR ATTENTION

무료국비지원교육 / 구로자바학원 _ 탑크리에듀 교육센터 http://www.-topcredu.co.kr