jpa/Spring Data JPA

@Transactional 롤백/커밋 테스트

잘할수있을거야 2023. 7. 19. 17:46

application프로퍼티에서 org.springframework 패키지를 debug로 잡으면 로그가 많이 남기때문에

TransactionManager에 대해서만 debug로 잡고 테스트


@Rollback(true)인 경우

package study.hibernate.springdatajpa.transaction;

import org.junit.jupiter.api.AfterAll;
import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.BeforeAll;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.TestInstance;
import org.junit.jupiter.api.TestInstance.Lifecycle;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.ActiveProfiles;
import org.springframework.test.context.transaction.AfterTransaction;
import org.springframework.test.context.transaction.BeforeTransaction;
import org.springframework.transaction.annotation.Transactional;

import lombok.extern.slf4j.Slf4j;

// @Rollback(true) 어노테이션이 붙은 것과 동일
@SpringBootTest
@Transactional
@ActiveProfiles("test")
@TestInstance(Lifecycle.PER_CLASS)
@Slf4j
public class TransactionTest {

	@BeforeAll
	void beforeAll() {
		log.debug("=================================> @BeforeAll");
	}

	@BeforeTransaction
	void beforeTransaction() {
		log.debug("=================================> @BeforeTransaction");
	}

	@BeforeEach
	void beforeEach() {
		log.debug("=================================> @BeforeEach");
	}

	@AfterTransaction
	void afterTransaction() {
		log.debug("=================================> @AfterTransaction");
	}

	@AfterEach
	void afterEach() {
		log.debug("=================================> @AfterEach");
	}

	@AfterAll
	void AfterAll() {
		log.debug("=================================> @AfterAll");
	}

	@Test
	void test1() {
		log.debug("=================================> test1");
	}

	@Test
	void test2() {
		log.debug("=================================> test2");
	}

}

 

각 테스트의 @BeforeEach 수행전 트랜잭션 시작 @AfterEach 종료시 트랜잭션 롤백


@Rollback(false)인 경우

@SpringBootTest
@Transactional
@ActiveProfiles("test")
@Rollback(false)
@TestInstance(Lifecycle.PER_CLASS)
@Slf4j
public class TransactionTest {

각 테스트의 @BeforeEach 수행전 트랜잭션 시작 @AfterEach 종료시 트랜잭션 커밋


 

@BeforeEach, @AfterEach 또한 각 테스트의 트랜잭션에 포함되기 때문에 각 테스트의 전후에 Transactional하지 않은 작업이 필요한 경우 @BeforeTransaction, @AfterTransaction이 붙은 메서드를 정의하여 Transaction과 관련되지 않은 작업을 진행시킨다.

 

@BeforeAll, @AfterAll또한 Transactional하게 처리되지 않음