본문 바로가기

spring boot에서 transaction 사용하기

by 아카이sun 2021. 1. 15.

이 포스팅은 spring boot 2.2.6을 기준으로 작성되었습니다.

 

spring boot로 프로젝트를 진행하던 중 DB에 delete 후 insert를 하는 로직을 구현해야 했습니다.

 

구현 로직 처리 중 만일 query가 실패 할 경우 기존의 데이터는 그대로 남아야 했기 때문에  transaction을 추가했습니다.

 

xml 코드가 아닌 java코드로 bean 객체를 생성해야 했으므로 구글링을 하여 방법을 찾았습니다.

 

spring의 application에 다음과 같이 transactinon manager를 추가해주세요.

1. EnableEnableTransactionManagement 어노테이션 추가

2. DataSourceTransactionManager 함수 구현

 

@EnableTransactionManagement
@SpringBootApplication
public class SampleApplication {

    .. 기타 코드는 생략..
    
    
    @Bean
    @ConfigurationProperties(prefix = "spring.postgresql.datasource")
    public DataSource dataSource1() {
        DataSourceBuilder<?> dataSource = DataSourceBuilder.create();
        dataSource.url(url1);
        dataSource.username(name1);
        dataSource.password(pw1);
        return dataSource.build();
    }
    
    @Bean
    @ConfigurationProperties(prefix = "spring.oracle.datasource")
    public DataSource dataSource2() {
        DataSourceBuilder<?> dataSource = DataSourceBuilder.create();
        dataSource.url(url2);
        dataSource.username(name2);
	    dataSource.password(pw2);
        return dataSource.build();
    }
    
    @Bean
    public DataSourceTransactionManager transactionManager1() {
        DataSourceTransactionManager manager = new DataSourceTransactionManager();
        manager.setDataSource(dataSource1());
        return manager;
    }

    @Bean
    public DataSourceTransactionManager transactionManager2() {
        DataSourceTransactionManager manager = new DataSourceTransactionManager();
        manager.setDataSource(dataSource2());
        return manager;
    }

}

 

다음으로 transaction을 실행시키려고 하는 위치에서 다음의 예제와 같이 구현하시면 됩니다.

 

@Service
public class SampleService {

    @Autowired
    private SampleDao dao;
    
    @Transactional(value="transactionManager1")
    @Override
    public boolean insertSample(Sample sample) {
        int returnId = dao.deleteSample(sample);
        if (returnId > 0) {
            dao.insertSample(sample);
            return true;
        }
        return false;
    }
}

! 주의

 

여기서 application에 선언한 transaction manager가 복수일 경우 target으로 하는 transaction manager명을 명시해야 합니다. 그렇지 않으면 다음과 같은 exception이 발생합니다.
NoUniqueBeanDefinitionException

No qualifying bean of type 'org.springframework.transaction.TransactionManager'

 

 

 

 

댓글