본문 바로가기

공부/Spring

스프링 트랜잭션

스프링 트랜잭션

1. 트랜잭션 관리자

스프링 트랜잭션 처리의 중심이 되는 인터페이스 = PlatformTransactionManager

스프링 프레임워크는 다양한 환경과 제품에 대응하는 PlatformTransactionManager의 구현 클래스를 제공한다.

  • DataSourceTransactionManager : JDBC 및 마이바티스 등의 JDBC 기반 라이브러리로 데이터베이스에 접근하는 경우에 이용한다.
  • HibernateTransactionManager : 하이버네이트를 이용해 데이터베이스에 접근하는 경우에 이용한다.
  • JpaTransactionManager : JPA로 데이터베이스에 접근하는 경우에 이용한다.

트랜잭션 관리자 정의

  • PlatformTransactionManager의 빈을 정의한다.
  • 트랜잭션을 관리해야 하는 메소드를 정의한다.

로컬 트랜잭션을 이용하는 경우

JDBC API를 호출하고 트랜잭션 제어를 수행하는 DataSourceTransactionManager를 사용한다.

xml기반 설정

<bean id="transactionManager" 
        class="org.springframework.jdbc.datasource.DataSourceTransactionManager" 
        lazy-init="true">  <!-- <1> -->
    <property name="dataSource" ref="dataSource" /> <!-- <2> -->
</bean>

<!-- @Transactional 어노테이션을 이용하는 경우 -->
<tx:annotation-driven transaction-manager="transactionManager"/> <!-- <3> -->

<1> : PlatformTransactionManager 로서 org.springframework.jdbc.datasource.DataSourceTransactionManager 를 지정한다.
<2> : dataSource 프로퍼티에 설정 완료된 데이터 소스의 빈을 지정한다.
<3> : 어노테이션 트랜잭션 제어를 활성화하기 위해 <tx:annotation-driven> 요소를 추가한다.
<tx:annotation-driven /> 설정이 존재하게 되면 startup time에 모든 @Transactional annotation을 스캔하는 작업을 하고 스캔된 대상 메소드들은 트랜잭션 처리가 되게 된다.

@Transactional 은 스프링 aop 로 되어있다.
Conceptually, calling a method on a transactional proxy looks like this…​
concept
https://docs.spring.io/spring/docs/4.2.x/spring-framework-reference/html/transaction.html

자바 기반 설정

@Configuration
@EnableTransactionManagement
public class DateSourceConfig {

    @Bean(name = "transactionManager")
    public PlatformTransactionManager transactionManager(DataSource dataSource)
    {
        return new DataSourceTransactionManager(dataSource);
    }

    @Bean(name = "jdbcTemplate")
    public JdbcTemplate apiJdbcTemplate(DataSource dataSource){
        return new JdbcTemplate(dataSource);
    }    

}

2. 선언적 트랜잭션

선언적 트랜잭션은 미리 선언된 룰에 따라 트랜잭션을 제어하는 방법이다.

선언적 트랜잭션의 장점은 정해진 룰을 준수함으로써 트랜잭션의 시작과 커밋, 롤백 등의 일반적인 처리를 비즈니스 로직 안에 기술할 필요가 없다는 점이다.

스프링 프레임워크는 선언적 트랜잭션을 이용하는 방법으로 @Transactional 또는 XML 설정을 이용하는 두 가지 방법을 제공한다.

@Transactional 을 이용한 선언적 트랜잭션

@Transactional 어노테이션을 빈의 public 메소드에 추가하는 것으로 대상 메소드의 시작 종료에 맞춰 트랜잭션을 시작, 커밋할 수 있다.

스프링 프레임워크의 기본 상태에서는 메소드 안의 처리에서 데이터 접근 예외와 같은 비검사 예외가 발생해서 메소드 안에 처리가 중단될 때 트랜잭션이 자동으로 롤백된다.

기본 사용법

@Transactional 어노테이션은 클래스와 메소드에 부여할 수 있다.

구현 예

@Slf4j
@Service
public class TestServiceImpl implements TestService{    

    @Autowired
    JdbcTemplate jdbcTemplate;    

    @SoonLog
    @Transactional(propagation=Propagation.REQUIRES_NEW, rollbackFor= {Throwable.class})
    @Override
    public void batchUpdate(String sql, List<String> rowData) throws Exception{

    }
}    

트랜잭션 제어에 필요한 정보

@Transactional 어노테이션 속성

  • value : 여러 트랜잭션 관리자를 이용하는 경우 이용하는 트랜잭션 관리자의 qualifier를 지정한다.
  • propagation : 트랜잭션의 전파 방식을 지정한다.
  • isolation : 트랜잭션의 격리 수준을 지정한다.
  • timeout : 트랜잭션 제한 시간(초)를 지정한다, 기본값은 -1
  • readOnly : 트랜잭션의 읽기 전용 플래그를 지정한다. 기본값은 false(읽기 전용이 아니다)다.
  • rollbackFor : 지정한 예외가 발생하면 트랜잭션을 롤백시킨다.
  • noRollbackFor : 지정한 예외가 발생하더라고 트랜잭션을 롤백시키지 않는다.

참고

http://egloos.zum.com/aretias/v/708477
https://docs.oracle.com/javase/6/docs/api/java/lang/reflect/Proxy.html

'공부 > Spring' 카테고리의 다른 글

스프링 - DI 2  (0) 2019.08.06
스프링 인터셉터 설정  (0) 2019.08.06
스프링 - DI  (0) 2019.07.23
스프링부트 아파치 mod_jk 연동하기  (0) 2019.07.14
[Boot] JPA 네이밍 전략  (0) 2019.03.11