DB를 사용해서 백엔드 개발을 할 때 Test를 시행할 때마다 DELET SQL을 사용해도 되겠지만 테스트 하고 삭제하고 테스트 하고 삭제하고를 반복하는 것은 효율적이지 못하다....
이런 비효율적인 행위를 하지 않기 위한 방법이 있다
테스트 - 데이터 롤백
테스트가 끝나고 나서 트랜잭션을 강제로 롤백해버리면 데이터가 깔끔하게 제거된다.
로직의 순서는 이렇게 된다.
1. 트랜잭션 시작
2. 테스트 A 실행
3. 트랜잭션 롤백
4. 트랜잭션 시작
5. 테스트 B 시작
6. 트랜잭션 롤백
그럼 테스트 A가 시작하기 전과 끝난 후에 트랜잭션을 추가해줘야하므로 @BeforEach와 @AfterEach를 사용해준다.
@SpringBootTest
class ItemRepositoryTest {
@Autowired
ItemRepository itemRepository;
//트랜잭션 관련 코드
@Autowired
PlatformTransactionManager transactionManager;
TransactionStatus status;
@BeforeEach
void beforeEach() {
//트랜잭션 시작
status = transactionManager.getTransaction(new
DefaultTransactionDefinition());
}
@AfterEach
void afterEach() {
//MemoryItemRepository 의 경우 제한적으로 사용
if (itemRepository instanceof MemoryItemRepository) {
((MemoryItemRepository) itemRepository).clearStore();
}
//트랜잭션 롤백
transactionManager.rollback(status);
}
//...
}
하지만 매번 Test할 때마다 이런 @BeforEach와 @AferEach를 해야하는 의문심이 생긴다...
수업을 끝까지 들어보니 이 두 Annotation도 필요없게 되었다.
@Transactional
@SpringBootTest
class ItemRepositoryTest {
@Autowired
ItemRepository itemRepository;
/*@Autowired
PlatformTransactionManager transactionManager;
TransactionStatus status;
@BeforeEach
void beforeEach(){
status = transactionManager.getTransaction(new DefaultTransactionDefinition());
}*/
@AfterEach
void afterEach() {
//MemoryItemRepository 의 경우 제한적으로 사용
if (itemRepository instanceof MemoryItemRepository) {
((MemoryItemRepository) itemRepository).clearStore();
}
// transactionManager.rollback(status);
}
@Transactional 어노테이션으로 이 모든 기능을 수행할 수 있다. 그럼 코드도 훨씬 깔끔해지고 더욱 효율적으로 된다.
위 사진은 트랜잭션의 순서를 보기 쉽게 보여주는 그림이다.
@Transactional를 사용해서 테스트를 진행할 시 자동으로 롤백이 되기 때문에 테스트 과정에서 저장한 모든 데이터가 사라진다. 당연히 깔끔하게 삭제되는것이 좋지만 최종결과를 눈으로 보고 싶은 경우가 생긴다.
그럴 때는 @Transactional 위에 @Commit이라는 Annotation을 추가해주면 확인할 수 있다.
김영한님의 스프링 DB 2편을 기반으로 작성한 포스팅입니다. 문제 시 삭제하도록하겠습니다.
'백엔드 지식 저장소' 카테고리의 다른 글
java: Attempt to recreate a file for type study.querydsl.entity.Qclass 문제 해결 (0) | 2024.01.11 |
---|---|
트랜잭션 AOP 주의사항!! (1) | 2024.01.05 |
요청 값으로 Entity를 직접 받았던 나를 반성하며.... (0) | 2023.12.26 |
Transaction Template (0) | 2023.12.15 |
백엔드 개발자라면 알아야하는 15가지 상식 (0) | 2023.11.29 |