스프링 프레임워크를 이용하여 트랜잭션을 적용할 때는 @Transactional 애노테이션을 통해 선언적 트랜잭션 방식을 사용한다. 그런데 이 기능은 매우 편리하게 트랜잭션 관련 코드를 대체해 주지만, 실제로 트랜잭션 관련 코드가 눈에 보이지 않고 AOP를 기반으로 동작하기 때문에 실제 트랜잭션이 적용되고 있는지 확인하기 어렵다.
이때, 트랜잭션이 TransactionSynchronizationManager 라는 클래스를 활용하여 확인할 수 있다.
트랜잭션 적용 확인
import org.springframework.transaction.support.TransactionSynchronizationManager;
위의 패키지의 TransactionSynchronizationManager가 제공하는 메서드를 통해 확인할 수 있다.
TransactionSynchronizationManager.isActualTransactionActive()
위의 메서드는 boolean 값을 반환한다.
해당 코드가 트랜잭션 진행 중에 실행되면 true를, 아니라면 false를 반환한다.
예제 코드
SpringBootTest를 이용해 보자.
BasicService는 두 개의 메서드를 갖고 있다.
하나는 트랜잭션을 적용하고, 다른 하나는 트랜잭션을 적용하지 않았다.
Test Bean으로 BasicService를 주입해 주고 테스트를 해보자.
이제 BasicService를 주입받고 transactional 메서드와 nonTransactional메서드를 실행해 보자.
각 메서드의 log를 확인해 보면 트랜잭션 적용 유무를 알 수 있다.
@Slf4j
@SpringBootTest
public class TxTest {
@Autowired
BasicService basicService;
@Test
void txTest(){
basicService.transactional();
log.info("==================");
basicService.nontransactional();
}
//Test Bean 등록
@TestConfiguration
static class TxApplyTestConfig{
@Bean
BasicService basicService(){
return new BasicService();
}
}
//Test용 서비스 클래스 작성
@Slf4j
static class BasicService{
@Transactional
public void transactional(){
log.info("call transactional");
boolean txActive = TransactionSynchronizationManager.isActualTransactionActive();
log.info("tx active?={}", txActive);
}
public void nonTransactional(){
log.info("call nonTransactional");
boolean txActive = TransactionSynchronizationManager.isActualTransactionActive();
log.info("tx active?={}", txActive);
}
}
}
[log]
Getting transaction for [hello.springtx.apply.TxBasicTest$BasicService.transactional]
call transactional
tx active?=true
Completing transaction for [hello.springtx.apply.TxBasicTest$BasicService.transactional]
==================
call nonTransactional
tx active?=false
먼저 실행한 transactional 메서드는 Getting transaction으로 트랜잭션을 시작했다는 로그
tx active?=true로 트랜잭션이 진행 중이라는 로그
Completing transaction으로 트랜잭션이 완료되었다는 로그
를 볼 수 있다.
=========================
그러나 아래쪽에 nonTransactional 메서드는 트랜잭션 관련 로그도 없고 tx active?=false 인것을 볼 수 있다.
(참고) 인프런 - 김영한 님 Spring DB
https://www.inflearn.com/course/%EC%8A%A4%ED%94%84%EB%A7%81-db-2/dashboard
'JAVA & Spring > Spring' 카테고리의 다른 글
[Spring] DB 연동 (MariaDB), MyBatis 사용 (0) | 2023.08.14 |
---|---|
[Spring MVC] @RequestBody와 @RequestHeader로 JSON 주고받기 (0) | 2023.08.13 |
[Spring] 세션, 쿠키, @SessionAttribute 로그인 확인 (0) | 2023.04.21 |
[Spring Boot] PRG 패턴 ( Post - Redirect - Get ) (1) | 2023.04.21 |
[Spring Boot] @PathVariable과 @RequestParam - 파라미터 받기 (0) | 2023.04.21 |