먼저, AOP나 CGLIB 내용은 고려하지 않고 기본 @Transactional을 사용 할 경우를 다룬 내용입니다.


우선, Spring boot에서 @Transactional 위한 기본 설정 사항


@Configuration

@EnableTransactionManagement

public class DataSourceConfig{

..

    @Bean

    public DataSourceTransactionManager txManager() {

        return new DataSourceTransactionManager(getDataSource());

    }

...

}


 위와 같이 설정을 하고 사용하게 되면 @Transactional 이용하여 트랜잭션을 사용 할 있다.

 


유의점

1. Dynamics proxy 사용하기 때문에 인터페이스 구현이 필요하다.


따라서, 아래와 같은 구조를 가져야 한다.

public interface AService {

}


public class AServiceImp implements AService {

@Transactional

public void biz() {

}

}



2. 내부 호출, 재귀 호출 로서 사용하면 안된다.


예를 들면

public class AServiceImp implements AService {


@Transactional

public void biz() {

//insert 호출

mapper.insertBiz();

//내부호출

bizUpdate();

}


@Transactional

public void bizUpdate() {

mapper.updateBiz();

mapper.deleteBiz();

}

}


위와 같이 @Transactional을 사용한 함수여도 내부적으로 호출을 사용하게 되면

트랙잭션이 동작하지 않게 된다.


따라서, 2가지 유의점을 고려하여 @Transactional을 사용하여야 한다.