스프링 마이바티스 무료강의 / 챕터5. 스프링 트랜잭션(spring transaction)

21
Spring Framework & MyBatis 스프링 프레임워크 & 마이바티스 강의 탑크리에듀 교육센터

Upload: 3-2

Post on 22-Jan-2018

159 views

Category:

Education


15 download

TRANSCRIPT

Page 1: 스프링 마이바티스 무료강의 / 챕터5. 스프링 트랜잭션(Spring Transaction)

Spring Framework & MyBatis

스프링 프레임워크 & 마이바티스 강의

탑크리에듀 교육센터

Page 2: 스프링 마이바티스 무료강의 / 챕터5. 스프링 트랜잭션(Spring Transaction)

CONTENTS

4. Spring JDBC

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

5.1 트랜잭션(Spring Transaction)

– TransactionDefinition, TransactionStatus, PlatformTransactionManager

5.2 스프링 트랜잭션 관리 – TransactionTemplate

5.3 스프링 트랜잭션 관리 – TransactionManager

Page 3: 스프링 마이바티스 무료강의 / 챕터5. 스프링 트랜잭션(Spring Transaction)

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

~ 5.3

Page 4: 스프링 마이바티스 무료강의 / 챕터5. 스프링 트랜잭션(Spring Transaction)

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

: TransactionDefinition 인터페이스는 트랜잭션의 네 가지 속성(ACID) 중 개발자들이 제어 가능한 부분

(트랜잭션 전달(Propagation), timeout, read-only 상태, 격리성(Isolation) 레벨의 네 가지 속성)을 추상화

한 것이다.

5-1. 스프링 트랜잭션(Spring Transaction) – TransactionDefinition,TransactionStatus, PlatformTransactionManager

public interface TransactionDefinition {

int getPropagationBehavior();

int getIsolationLevel();

int getTimeout();

boolean isReadOnly();

}

Page 5: 스프링 마이바티스 무료강의 / 챕터5. 스프링 트랜잭션(Spring Transaction)

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

getTimeout() : 실행하는 트랜잭션이 시작해서 종료할 때 까지의 시간을 초 단위 제어

isReadOnly() : 실행하는 트랜잭션의 읽기전용 여부를 return

getIsolationLevel() : 트랜잭션의 격리레벨을 리턴 한다.

getPropagationBehavior() : 트랜잭션의 전달 속성을 리턴 한다. 트랜잭션이 실행되어야 하는 범위에

대한 제어 및 여러 개의 트랜잭션이 상호작용하는 것에 대한 결정이다.

5-1. 스프링 트랜잭션(Spring Transaction) – TransactionDefinition,TransactionStatus, PlatformTransactionManager

TransactionStatus

: 트랜잭션의 상태를 관리하는 역할을 담당한다. PlatformTransactionManager에서 트랜잭션을 Commit할지

Rollback 할지를 결정하기 위해 사용한다.

public interface TransactionStatus extends SavepointManager {

boolean isNewTransaction();

void setRollbackOnly();

boolean isRollbackOnly();

}

Page 6: 스프링 마이바티스 무료강의 / 챕터5. 스프링 트랜잭션(Spring Transaction)

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

5-1. 스프링 트랜잭션(Spring Transaction) – TransactionDefinition,TransactionStatus, PlatformTransactionManager

PlatformTransactionManager

: 실질적인 트랙잭션을 실행하는 역할을 한다. 트랜잭션 내에서 에러 없이 모든 작업을 완료

할 경우에는 Commit, 에러가 발생할 경우에는 Rollback 작업을 실행할 수 있도록 지원한다.

public interface PlatformTransactionManager {

void commit(TransactionStatus status)...

void rollback(TransactionStatus status)..

}

Page 7: 스프링 마이바티스 무료강의 / 챕터5. 스프링 트랜잭션(Spring Transaction)

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

5-1. 스프링 트랜잭션(Spring Transaction) – TransactionDefinition,TransactionStatus, PlatformTransactionManager

트랜잭션의 4가지 속성

Page 8: 스프링 마이바티스 무료강의 / 챕터5. 스프링 트랜잭션(Spring Transaction)

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

5-1. 스프링 트랜잭션(Spring Transaction) – TransactionDefinition,TransactionStatus, PlatformTransactionManager

트랜잭션의 독립성 레벨(Isolation Level)

Page 9: 스프링 마이바티스 무료강의 / 챕터5. 스프링 트랜잭션(Spring Transaction)

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

5-1. 스프링 트랜잭션(Spring Transaction) – TransactionDefinition,TransactionStatus, PlatformTransactionManager

트랜잭션의 전달속성(Propagation Behavior)

Page 10: 스프링 마이바티스 무료강의 / 챕터5. 스프링 트랜잭션(Spring Transaction)

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

5-2. 스프링 트랜잭션(Spring Transaction) – TransactionDefinition,TransactionStatus, PlatformTransactionManager

트랜잭션의 전달속성(Propagation Behavior)

TransactionTemplate(Transaction 범위를 프로그래밍)은 JdbcTemplate와 HibernateTemplate와 같은 다른 Spring

templates와 동일한 접근 방식을 적용하고 있다. 이것은 콜백(callback) 접근방법을 사용하는데, 리소스 획득과 해제작

업으로부터 어플리케이션 코드를 해방시켜준다.(더 이상 try/catch/finally를 할 필요가 없다.) 다른 template처럼

TransactionTemplate는 쓰레드 안전하다.

TransactionCallback인터페이스 구현 객체와 같이 사용되어야 하며 트랜잭션 제어내에 실행될 코드는 doInTransaction

메소드 내에 두면 된다. doInTransaction이 별 문제없이 반환되면 Transaction은 Commit된다.

Transaction은 doInTransaction 메서드 단위로 처리된다.

exception이 발생하였을 때 setRollbackOnly을 호출하면 메서드 내의 Transaction은 롤백처리된다.

리턴되는 결과가 없는 경우에는 TransactionCallback 대신 TransactionCallbackWithoutResult 을 사용할 수도 있으나,

TransactionCallback에서 null을 리턴해도 무방하다.

Page 11: 스프링 마이바티스 무료강의 / 챕터5. 스프링 트랜잭션(Spring Transaction)

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

5-2. 스프링 트랜잭션(Spring Transaction) – TransactionDefinition,TransactionStatus, PlatformTransactionManager

package x.y;public class MyService {@Resource(name = "txManager")protected DataSourceTransactionManager txManager;

protected TransactionTemplate transactionTemplate;@PostConstructpublic void init() {

transactionTemplate = new TransactionTemplate(txManager);}

public void myTran(final PutAccountInfoRequest request) throws Exception {// write logMyTranResult result = (MyTranResult) transactionTemplate.execute(new TransactionCallback() {@Overridepublic Object doInTransaction(TransactionStatus status) {boolean success = false;Exception exception = null;

try {// 트랜잭션1// 트랜잭션2} catch (Exception ex) {

exception = ex;status.setRollbackOnly();

}return new MyTranResult();}});

Page 12: 스프링 마이바티스 무료강의 / 챕터5. 스프링 트랜잭션(Spring Transaction)

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

5-2. 스프링 트랜잭션(Spring Transaction) – TransactionDefinition,TransactionStatus, PlatformTransactionManager

이전 페이지 이어서

}// write transaction result}

TransactionTemplate을 주입하는 방법

<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close"><property name="driverClassName">

<value>oracle.jdbc.driver.OracleDriver</value></property><property name="url">

<value>jdbc:oracle:thin:@localhost:1521:onj</value></property><property name="username">

<value>scott</value></property><property name="password">

<value>tiger</value></property>

</bean>

<bean id="txManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"><property name="dataSource" ref="dataSource"/>

</bean>

Page 13: 스프링 마이바티스 무료강의 / 챕터5. 스프링 트랜잭션(Spring Transaction)

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

5-3. 스프링 트랜잭션 관리 – TransactionManager

스프링 TransactionManager는 getTransaction()을 호출해서 새로운 트랜잭션을 시작하거나 현재 활성화된 트랜잭션을

얻을 수 있으며 commit(), rolllback() 메소드로 트랜잭션을 관리할 수 있게 하는 특정 기술에 비종속적인 방법을 제공한

다.

PlatformTransactionManager는 트랜잭션 관리를 위한 추상화 단위이므로 트랜잭션 관리 메소드는 항상 특정 기술과는

독립적으로 사용할 수 있다.

비지니스로직 클래스(SpringBoardservice)에 DataSourceTransactionManager 속성 추가

private DataSourceTransactionManager txManager;

public void setTxManager(DataSourceTransactionManager txManager) {

this.txManager = txManager;

}

Page 14: 스프링 마이바티스 무료강의 / 챕터5. 스프링 트랜잭션(Spring Transaction)

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

5-3. 스프링 트랜잭션 관리 – TransactionManager

오라클 Transaction Manager DI(Dependency Injection)

<!-- Transaction manager for a single JDBC DataSource -->

<bean id="oracleTransactionManager"

class="org.springframework.jdbc.datasource.DataSourceTransactionManager">

<property name="dataSource" ref=“dataSource" />

</bean>

<bean id=“boardService"

class=“onj.oraclejava.SpringBoardservice">

<property name="txManager" ref="oracleTransactionManager" />

</bean>

Page 15: 스프링 마이바티스 무료강의 / 챕터5. 스프링 트랜잭션(Spring Transaction)

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

5-3. 스프링 트랜잭션 관리 – TransactionManager

비지니스로직 클래스(SpringBoardservice) 비즈니스 로직처리 메소드

public void insertEmp() {

TransactionDefinition def = new DefaultTransactionDefinition();

def.setName("oracleTransactionManager");

def.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRED);

TransactionStatus status = txManager.getTransaction(def);

try {

// INSERT1

// INSERT2

txManager.commit(status);

} catch (MyException ex) {

txManager.rollback(status);

// throw ex;

}

}

Page 16: 스프링 마이바티스 무료강의 / 챕터5. 스프링 트랜잭션(Spring Transaction)

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

5-3. 스프링 트랜잭션 관리 – TransactionManager

TransactionManager를 이용한 프로그래밍을 통한 트랜잭션 간단예제

[pom.xml] 필요 라이브러리

<dependencies>……<dependency><groupId>org.springframework</groupId><artifactId>spring-jdbc</artifactId><version>${org.springframework-version}</version></dependency><dependency><groupId>commons-dbcp</groupId><artifactId>commons-dbcp</artifactId><version>1.4</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 JDBCRepository</name><url>http://maven.jahia.org/maven2</url>

</repository></repositories>

Page 17: 스프링 마이바티스 무료강의 / 챕터5. 스프링 트랜잭션(Spring Transaction)

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

5-3. 스프링 트랜잭션 관리 – TransactionManager

[TrTest1.java]

import javax.sql.DataSource;

import org.apache.commons.dbcp.BasicDataSource;

import org.springframework.dao.DataAccessException;

import org.springframework.jdbc.core.JdbcTemplate;

import org.springframework.jdbc.datasource.DataSourceTransactionManager;

import org.springframework.transaction.PlatformTransactionManager;

import org.springframework.transaction.TransactionDefinition;

import org.springframework.transaction.TransactionStatus;

import org.springframework.transaction.support.DefaultTransactionDefinition;

public class TrTest1 {

DataSource dataSource;

PlatformTransactionManager transactionManager;

public static void main(String[] args) {

BasicDataSource ds = new BasicDataSource();

ds.setDriverClassName("oracle.jdbc.driver.OracleDriver");

ds.setUrl("jdbc:oracle:thin:@192.168.0.27:1521:onj");

ds.setUsername("scott");

ds.setPassword("tiger");

Page 18: 스프링 마이바티스 무료강의 / 챕터5. 스프링 트랜잭션(Spring Transaction)

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

5-3. 스프링 트랜잭션 관리 – TransactionManager

[TrTest1.java] 이어서

DataSourceTransactionManager tm = new DataSourceTransactionManager();tm.setDataSource(ds);

TrTest1 update = new TrTest1();

update.setDataSource(ds);update.setTransactionManager(tm); //update.doUpdate();System.out.println("<<<<<<<<<<<<< TR OK >>>>>>>>>>>>");

}

public void setDataSource(DataSource dataSource) {this.dataSource = dataSource;

}

public void setTransactionManager(PlatformTransactionManager transactionManager) {this.transactionManager = transactionManager;

}

public void doUpdate() {DefaultTransactionDefinition td =

new DefaultTransactionDefinition(TransactionDefinition.PROPAGATION_REQUIRED);td.setIsolationLevel(TransactionDefinition.ISOLATION_READ_COMMITTED);td.setTimeout(10);TransactionStatus status = transactionManager.getTransaction(td);try {

updateSal("SMITH", 1234);

//SAL칼럼은 number(7,2), 오류발생!, 트랜잭션롤백updateSal("ALLEN", 12341234);

Page 19: 스프링 마이바티스 무료강의 / 챕터5. 스프링 트랜잭션(Spring Transaction)

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

5-3. 스프링 트랜잭션 관리 – TransactionManager

[TrTest1.java] 이어서

} catch (DataAccessException e) {

transactionManager.rollback(status);

throw e;

}

transactionManager.commit(status);

}

private void updateSal(String ename, int newSal) throws DataAccessException {

String strQuery = "update emp set sal = " + newSal

+ " where ename = '" + ename + "'";

JdbcTemplate jdbcTemplate = new JdbcTemplate(dataSource);

jdbcTemplate.update(strQuery);

}

}

Page 20: 스프링 마이바티스 무료강의 / 챕터5. 스프링 트랜잭션(Spring Transaction)

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

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

일 시 : 2017년03월27일(월) ~ 2017년11월08일(수)

장 소 : 탑 크리에듀교육센터

수강료 : 전액무료

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

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

Page 21: 스프링 마이바티스 무료강의 / 챕터5. 스프링 트랜잭션(Spring Transaction)

Any Questions ?

THANK YOU

FOR YOUR ATTENTION

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