티스토리 뷰

Spring Boot 3.2.3.RELEASE가 아니라 Spring Framework 3.2.3.RELEASE로 개발된 프로젝트에서 개발 및 유지보수를 하면서 아래와 같은 코드를 반복적으로 보았다.

TransactionStatus status = this.transactionManager_iqis.getTransaction(new DefaultTransactionDefinition());

try{
    //do something
    transactionManager_iqis.commit(status);
} catch (Exception e) {
    transactionManager_iqis.rollback(status);
}

 

주로 @Transactional로 사용하는 기능을 코드로 사용하고 있었다. 스프링 프레임워크의 특징 중 하나인 AOP. 그리고 AOP 하면 떠올리는 대표적인 예인 트랜잭션 처리를 코드로 하고 있었다.

 

나는 pom.xml을 열어 spring-tx 의존성이 있는지 확인했다. spring-tx를 이미 가지고 있었지만, 테스트 결과 @Transactional이 제대로 작동하지 않았다.

 

나는 주로 Spring Boot로 개발을 하거나 개발 초기 단계에 설정을 해본 경험이 없어서 약간의 시행착오가 있었고 글로 남긴다.


1차 시도 - @Transactional 어노테이션 활성화

<tx:annotation-driven transaction-manager="transactionManager"/>

 

/WEB-INF/config/context 경로 아래에 AAA-context.xml, BBB-context.xml, CCC-context.xml 등 여러 스프링 설정 파일이 존재 했고, 그 중에서 org.springframework.jdbc.datasource.DataSourceTransactionManager 클래스를 bean으로 등록하고 있는 한 xml 파일에 tx:anntation-driven 태그를 추가했다.

 

결과는 제대로 트랜잭션이 이루어지지 않았다.

 

2차 시도 - @Transactional 어노테이션 활성화 순서 변경

<context:component-scan base-package="kr.co.seogineer"/>

 

component-scan 태그가 있는 xml 파일(root-context.xml)을 찾아서 마지막 줄에 tx:annotation-driven 태그를 추가했고 트랜잭션이 제대로 작동했다.

 

트랜잭션이 제대로 동작하지 않았던 원인은 component-scan이 실행되어 클래스들이 bean으로 등록된 후에 tx:annotation-driven이 실행되어 프록시를 생성해야 하는데 component-scan 실행 전에 tx:annotation-driven을 실행해서 트랜잭션 관리가 제대로 동작하지 않았습니다. 즉, component-scan이 실행된 이후에 tx:annotation-driven이 실행되어야 했다.

 

 

참고

https://wildeveloperetrain.tistory.com/336

댓글
Total
Today
Yesterday
링크
Apple 2023 맥북 프로 14 M3, 스페이스 그레이, M3 8코어, 10코어 GPU, 512GB, 8GB, 한글