본문 바로가기

Programming/Spring

Spring - Transaction1 (스프링의 트랜잭션 지원)

트랜잭션 (Transaction)

트랜잭션은 현대의 웹 보안에 있어서 매우 중요한 역활을 차지하며 DB와 JAVA언어가 데이터를 주고 받는 과정에 원자성을 부여하는 수단을 일컫는다.


간단하게 설명하자면 !!

어떤 작업 프로세스를 하나로 묶어 실행 중 하나의 작업이라도 실패하면 모두 실패 처리를 해주고, 

전체 작업이 성공하면 성공 처리를 해주는 것이다.



스프링 프레임워크의 트랜잭션 

 - Java Transaction API(JTA), JDBC, Hivernate, Java Persistence API(JPA), Java Data Objects(JDO)같은 여러 가지 트랜잭션 API간에 일관성있는 프로그래밍 모델

 - 선언적인 트랜잭션 관리 지원

 - 프로그래밍적인 트랜잭션 관리에 대해 JTA같은 복잡한 트랜잭션 API보다 간단한 API

 - 스프링의 데이터 접근 추상화와의 뛰어난 통합


스프링의 트랜잭션 기술을 이용하면, 단 몇 줄의 코드만으로 다이나믹 프록시와 AOP라는 기술을 통해 

크게는 인터페이스 단위에서 클래스, 작게는 메서드까지 세분화하여 트랜잭션을 컨트롤 할 수 있다. 

거기다 애노테이션 기술로 @Transactional을 설정하는 것으로도 트랜잭션 설정이 가능하게 해준다.



스프링의 트랜잭션 관리 지원

1. 프로그래밍 처리 방식 

- 코드에서 트랜잭션의 범위를 정교하게 정의 할 수 있다. 

  하지만 트랜잭션이 스프링의 종속적인 코드가 될 가능성이 크다.


2. 선언적인 트랜잭션

- 실제 작업과 트랜잭션 규칙을 분리 할 수 있다. 

- 격리 수준이나 타임아웃같은 추가적인 애트리뷰트를 선언 할 수 있다.


트랜잭션의 동작 원리

1. Caller가 target 메소드를 호출하면 먼저 AOP Proxy가 호출된다.

2. Transaction Advisor는 새로운 트랜잭션을 생성한다.

3. Custom interceptor들이 transaction advisor 전 후로 호출된다.

4. Target 비즈니스 메소드가 호출된다.

5. Transaction Advisor는 커밋 또는 롤백을 결정하고 호출자에게 넘긴다.

6. AOP Proxy는 결과를 받아서 Caller에서 넘긴다


스프링의 PlatformTransactionManager 설정

스프링은 트랜잭션을 직접 관리하지 않고, 스프링에 포함된 일련의 트랜잭션 관리자를 이용한다.


트랜잭션 관리자는 트랜잭션 관리 책임을 JTA나 퍼시스턴스 메커니즘이 제공하는 플랫폼 종속적인 트랜잭션 구현체에 위임한다.


1. JDBC 트랜잭션

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

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

<property name="url" value="jdbc:oracle:thin:@" />

<property name="username" value="" />

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


<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">

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

</bean>


DataSourceTransactionManager는 내부적으로 DataSource에서 획득하게 될 java.sql.Connection 객체를 이용하여 트랜잭션을 관리한다.

예를 들어, 모든 작업이 성공한 성공적인 트랜잭션은 이 커넥션 객체의 commit()메소드 호출을 통해 Commit되고, 실패한 트랜잭션은 rollback()메소드를 통해 RollBack된다.


2. 하이버네이트 트랜잭션

<bean id="sessionFactory" class="org.springframeworkd.orm.hibernate3.LocalSessionFactoryBean">

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

<property name="mappingResources">

.....

</property>

<property name="hibernateProperties">

.....

</property>

</bean>


<bean id="txManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager>

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

</bean>


sessionFactory 프로퍼티를 통해서 전달받은 하이버네이트 Session으로부터 하이버네이트 Transaction을 생성한 뒤, Transaction을 이용해서 트랜잭션을 관리.


3. JPA 트랜잭션

<bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">

.....

</bean>


<bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager">

<property name="entityManagerFactory" ref="entityManagerFactory" />

</bean>


entityManagerFactory 프로퍼티를 통해 전달받은 EntityManagerFactory를 이용해서 트랜잭션을 관리.


4. JTA 트랜잭션

JTA를 사용한다면 트랜잭션 관리자 정의는 JDBC, Hibernate, JPA나 다른 지원 기술 등 어떤 데이터접근 기술을 사용한지와 상관없이 같을 것이다. 이는 JTA 트랜잭션이 트랜잭션이 적용된 어떤 리소스와도 동작하는 전역 트랜잭션이기 때문이다.



참조 : 

http://demon92.tistory.com/67

http://blog.outsider.ne.kr/869

http://springmvc.egloos.com/498979

http://blog.naver.com/PostView.nhn?blogId=chocolleto&logNo=30087623217&parentCategoryNo=&categoryNo=&viewDate=&isShowPopularPosts=false&from=postView