도입하게 된 계기

현재 프로젝트에서는 JPA 가 아닌 mybatis 를 이용하고 있다. mybatis에서는 트랜젝션을 처리할 수 있는 기능이 없기 때문에 스프링의 @transactional 어노테이션을 이용하여, 트랜젝션 관리를 별도로 해주어야 한다.

사전 준비

공식문서에 따르면 총 3가지 방법이 있다. 그 중 나는 표준 설정을 하는 방법을 알아보았는데, 그게 가장 쉽고 직관적이기 때문이다.

표준 설정

스프링 트랜잭션을 가능하게 하려면, 스프링 설정파일에 DataSourceTransactionManager를 생성하자.

@Configuration
public class DataSourceConfig {
  @Bean
  public DataSourceTransactionManager transactionManager() {
    return new DataSourceTransactionManager(dataSource());
  }
}

명시된 DataSource는 스프링을 사용할때 일반적으로 사용한다면 어떠한 JDBC DataSource도 될수 있다. JNDI룩업을 통해 얻어진 DataSource뿐 아니라 커넥션 풀링 기능도 포함한다.

트랜잭션 관리자에 명시된 DataSource가 SqlSessionFactoryBean을 생성할때 사용된 것과 반드시 동일한 것이어야 하는 것만 꼭 기억하자. 그렇지 않으면 트랜잭션 관리가 제대로 되지 않을것이다.

하지만 사실 이마저도 할 필요가 없다. 왜냐하면,Spring Boot 프로젝트에 spring-boot-starter-data-jpa 또는 spring-boot-starter-jdbc 의존성을 추가하면, Spring Boot는 클래스 경로에 있는 데이터베이스 드라이버와 DataSource 구현을 기반으로 DataSourcePlatformTransactionManager 빈을 자동으로 구성하기 때문이다.

지금 현재 프로젝트에는 spring-boot-starter-jdbc 의존성이 있기 때문에 안해줘도 된다.

따라서, 트랜젝션을 사용할 준비는 끝났다.

mapper 클래스를 field 로 갖고 있고, 어노테이션 관리를 하는 dao repository를 생성하여 관리를 해주었다.