1. 개요

트랜잭션 감지는 감사 목적이나 좋은 트랜잭션 규칙이 구현되지 않은 복잡한 코드 기반을 처리하는 데 유용할 수 있습니다.

이 간단한 사용방법(예제)에서는 코드에서 Spring 트랜잭션 을 감지하는 몇 가지 방법을 살펴보겠습니다 .

2. 트랜잭션 구성

Spring에서 트랜잭션이 작동하려면 트랜잭션 관리가 활성화되어야 합니다. Spring-data-* 또는 spring-tx 의존성이 있는 Spring Boot 프로젝트를 사용하는 경우 Spring은 기본적으로 트랜잭션 관리를 활성화합니다 . 그렇지 않으면 트랜잭션을 활성화하고 트랜잭션 관리자를 명시적으로 제공해야 합니다.

먼저 @Configuration 클래스에 @EnableTransactionManagement 어노테이션을 추가해야 합니다 . 이것은 우리 프로젝트에 대한 Spring의 어노테이션 기반 트랜잭션 관리를 가능하게 합니다.

다음으로 PlatformTransactionManager 또는 ReactiveTransactionManager 빈을 제공해야 합니다 . 이 빈에는 DataSource 가 필요합니다 . H2 또는 MySQL용 라이브러리와 같은 여러 공통 라이브러리를 사용하도록 선택할 수 있습니다. 이 예제에서는 구현이 중요하지 않습니다.

트랜잭션을 활성화하면 @Transactional 어노테이션을 사용하여 트랜잭션을 생성 할 수 있습니다 .

3. TransactionSynchronizationManager 사용

Spring은 TransactionSychronizationManager 라는 클래스를 제공했다 . 고맙게도 이 클래스에는 isActualTransactionActive() 라는 트랜잭션에 있는지 여부를 알 수 있는 정적 메서드가 있습니다 .

이것을 테스트하기 위해 @Transactional 로 테스트 메소드에 어노테이션을 달자 . isActualTransactionActive()true를 반환 한다고 단언할 수 있습니다 .

@Test
@Transactional
public void givenTransactional_whenCheckingForActiveTransaction_thenReceiveTrue() {
    assertTrue(TransactionSynchronizationManager.isActualTransactionActive());
}

마찬가지로 테스트는 @Transactional 어노테이션을 제거할 때 false 가 반환 된다고 주장해야 합니다 .

@Test
public void givenNoTransactional_whenCheckingForActiveTransaction_thenReceiveFalse() {
    assertFalse(TransactionSynchronizationManager.isActualTransactionActive());
}

4. 스프링 트랜잭션 로깅 사용

아마도 프로그래밍 방식으로 트랜잭션을 감지할 필요가 없을 것입니다. 애플리케이션 로그에서 트랜잭션이 발생하는 시점을 확인하고 싶다면 속성 파일에서 Spring의 트랜잭션 로그를 활성화할 수 있습니다 .

logging.level.org.springframework.transaction.interceptor = TRACE

해당 로깅 수준을 활성화하면 트랜잭션 로그가 표시되기 시작합니다.

2020-10-02 14:45:07,162 TRACE - Getting transaction for [com.Class.method]
2020-10-02 14:45:07,273 TRACE - Completing transaction for [com.Class.method]

이러한 로그는 컨텍스트 없이는 매우 유용한 정보를 제공하지 않습니다. 우리는 단순히 우리 자신의 로깅 중 일부를 추가할 수 있으며 Spring 관리 코드에서 트랜잭션이 발생하는 위치를 쉽게 볼 수 있어야 합니다.

5. 결론

이 기사에서는 Spring 트랜잭션이 활성 상태인지 확인하는 방법을 보았습니다. TransactionSynchronizationManager.isActualTransactionActive() 메서드를 사용하여 프로그래밍 방식으로 트랜잭션을 감지하는 방법을 배웠습니다 . 또한 로그에서 트랜잭션을 확인하려는 경우에 대비하여 Spring의 내부 트랜잭션 로깅을 활성화하는 방법을 발견했습니다.

항상 그렇듯이 코드 예제는 GitHub 에서 찾을 수 있습니다 .

Generic footer banner