티스토리 뷰
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이 실행되어야 했다.
참고
'Framework > Spring' 카테고리의 다른 글
CORS 부터 Mixed Content 까지 문제 해결 (0) | 2025.01.02 |
---|---|
Spring Security를 이용한 OAuth + JWT 로그인 구현 (0) | 2022.09.03 |
MessageSource 다국어 처리 (2) | 2022.06.15 |
"Web server failed to start. Port 8080 was already in use." 에러 (0) | 2021.02.05 |
브라우저 net::ERR_CONTENT_LENGTH_MISMATCH 200 (0) | 2021.02.03 |