[Spring] 테스트 환경에서의 @Transaction

유알·2023년 1월 21일
0

[Spring]

목록 보기
8/17

Test-managed Transaction

TestExecutionListener that provides support for executing tests within test-managed transactions by honoring Spring's @Transactional annotation.

Transaction 을 테스트에서 실행될 때는 Spring-managed transactions 가 아닌 test-managed transactions가 실행된다.

아래 문서를 반드시 읽어보길 권장드린다.
TransactionalTestExecutionListener :
https://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/test/context/transaction/TransactionalTestExecutionListener.html

핵심 내용 요약

위 문서를 읽어보는 것을 추천드리며 아래는 간단한 요약 본이다.

Enabling and Disabling Transations

  • @Transational 어노테이션을 붙이는 것 만으로 테스트는 트랜잭션 하에 진행된다.
  • 각 테스트가 끝날때마다 롤백을 한다.
  • @Transational 어노테이션의 propagation 속성이 NOT_SUPPORTED 나 NEVER 으로 되어있으면 트랜잭션이 되지 않는다.

선언적 Rollback과 Commit

  • 기본적으로 롤백이 적용되지만 @Commit 과 @Rollback 어노테이션을 붙이고 속성을 설정하므로써 설정을 할 수 있다.

ex) @Rollback(false) 를 메서드나 클래스 위에 붙이면 테스트 후 롤백하지 않는다.

@Commit 과 @Rollback 을 동시에 사용하는 것은 지원하지 않고 예상치못한 결과를 초래하므로 절대 금지

TestTransaction

이것을 통해 Test-managed Transaction과 트랜잭션과 상호 작용할 수 있다. api doc

@Test @Before @After 메서드에서 상호작용 가능

ex)

assertTrue(TestTransaction.isActive(),"안전을 위해 트랜잭션 처리를 해주세요");
assertTrue(TestTransaction.isFlaggedForRollBack());
//@Rollback(false) 를 설정하면 통과 안됨

Transaction 밖에서 실행

  • 가끔은 어떤 설정을 트랜잭션 밖에서 설정하고 싶을 수도 있다.
  • @BeforeTransaction @AfterTransaction 을 통해 그렇게 할 수 있다.(Spring Framework 4.3, Java8+)

Transactional Attribute Support

모든 속성이 지원되는 것은 아니다.

예시

@SpringBootTest
@Transactional
@Rollback(value = true)
class LoginRepositoryTest {

	//... 중략

    @BeforeEach
    public void checkTransactionIsActive(){
        //Assumption
        assertTrue(TestTransaction.isActive(),"안전을 위해 트랜잭션 처리를 해주십시오");
        assertTrue(TestTransaction.isFlaggedForRollback(),"롤백 설정을 확인하세요");
    }
profile
더 좋은 구조를 고민하는 개발자 입니다

0개의 댓글