테스트는 다른 테스트와 격리되어 실행되어야 하며 반복해서 실행할 수 있어야 한다.
기본적으로 테스트를 실행하면 데이터베이스에 데이터가 그대로 남아있게 된다. 이런 경우에는 이전 테스트와 별개로 반복적인 테스트를 할 수 없다. 따라서 테스트가 끝나면 트랜잭션을 롤백해서 기존 테스트 실행으로 남아있는 데이터를 삭제해줄 필요가 있다.
테스트 환경에서 데이터베이스에 남아있는 데이터를 깔끔하게 제거하고 매번 새롭게 테스트를 실행하기 위해서는 트랜잭션을 롤백하면된다.
트랜잭션 시작 -> 테스트 실행 -> 트랜잭션 롤백의 순서로 실행한다.
테스트 클래스 안에 PlatformTransactionManager를 주입해준다.
import org.springframework.transaction.PlatformTransactionManager;
import org.springframework.transaction.TransactionStatus;
import org.springframework.transaction.support.DefaultTransactionDefinition;
@SpringBootTest
class ItemRepositoryTest {
@Autowired
ItemRepository itemRepository;
@Autowired
PlatformTransactionManager transactionManager;
TransactionStatus status;
}
//모든 테스트를 실행하기 전 트랜잭션 시작
@BeforeEach
void beforeEach(){
status = transactionManager.getTransaction(new DefaultTransactionDefinition());
}
//테스트가 끝나면 롤백
@AfterEach
void afterEach()
//트랜잭션 롤백
transactionManager.rollback(status);
}
테스트를 돌려보면 제대로 롤백된 것을 확인할 수 있다.
트랜잭션 관리자는 PlatformTransactionManager를 주입받아 사용하면 된다.
🎨 트랜잭션 시작
transactionManager.getTransaction(new DefaultTransactionDefinition());
Test시 @BeforeEach 어노테이션을 붙이면 각 테스트 케이스를 실행하기 전에 호출된다. 여기서 트랜잭션이 시작하고 @AfterEach 어노테이션이 붙은 메서드는 각 테스트 케이스가 완료된 직후에 호출되며 여기서 트랜잭션을 롤백하게 된다.
🎨 트랜잭션 롤백
transactionManager.rollback(status);
이 글은 김영한님의 스프링 DB 2편 - 데이터 접근 활용 기술 강의를 듣고 정리한 내용입니다.