728x90
1. test - data rollback
- spring db 1 에서 학습한 transactionManger과 status를 이용하여 status가 true, false 상관 없이 무조건 rollback하도록 @BeforeEach @AfterEach 사용
- @BeforeEach 수행 부터 @AfterEach 오기전까지 동일 connection을 사용하는 transaction 수행됨
package hello.itemservice.domain;
@SpringBootTest
class ItemRepositoryTest {
// DataSource와 txManger는 springboot에서 자동으로 생성해놓았다.
@Autowired
ItemRepository itemRepository;
//tx 관련 code
@Autowired
PlatformTransactionManager transactionManager; // spring boot에서 생성해줌
TransactionStatus status; // status를 통해서 commit, rollback 수행
@BeforeEach
void beforeEach(){
// tx 시작
status = transactionManager.getTransaction(new DefaultTransactionDefinition());
}
@AfterEach
void afterEach() {
//MemoryItemRepository 의 경우 제한적으로 사용
if (itemRepository instanceof MemoryItemRepository) {
((MemoryItemRepository) itemRepository).clearStore();
}
// tx rollback
transactionManager.rollback(status);
}
...
@Test
}
2. test - @Transactional
- test에서 사용시, 조금 특별하게 사용
- test 내부에서 @Transactional이 존재시, spring은 transaction 내부에 test를 실행하고, test 종료시 로직의 성공적인 수행여부와 관계 없이 transaction을 항상 rollback 시킴
- test에 사용되는 @Transactional도 Class, method 모두 원하는 부분에 적용 가능
- 참고 - @Service test 시, @Service 내부에 @Transactional도 존재할 텐데 어떻게 충돌을 막을까?
- test case의 @Transactional 과 @Service, @Repository에 있는 @Transactional 도 Test에서 시작한 트랜잭션에 참여
= Test가 종료될 때까지 Test의 connection을 사용한다는 의미
- test case의 @Transactional 과 @Service, @Repository에 있는 @Transactional 도 Test에서 시작한 트랜잭션에 참여
- test의 @Transactional 강제 commit 하기
- @Commit
- @Rollback(value = false)
package hello.itemservice.domain;
// @Transactional, @Commit,@Rollback(value = false) 모두 class, method 영역에 설정 가능
@Transactional
@Commit == @Rollback(value = false)
@SpringBootTest
class ItemRepositoryTest {
// DataSource와 txManger는 springboot에서 자동으로 생성해놓았다.
@Autowired
ItemRepository itemRepository;
//tx 관련 code
/*
@Autowired
PlatformTransactionManager transactionManager;
TransactionStatus status;
@BeforeEach
void beforeEach(){
// tx 시작
status = transactionManager.getTransaction(new DefaultTransactionDefinition());
}
*/
@AfterEach
void afterEach() {
// MemoryItemRepository 의 경우 제한적으로 사용
if (itemRepository instanceof MemoryItemRepository) {
((MemoryItemRepository) itemRepository).clearStore();
}
// tx rollback
// transactionManager.rollback(status);
}
// @Rollback(value = false) == @Commit
@Test
참고 발행글 : 2023.09.25 - [spring/spring db2] - 3. 데이터 접근 기술 - 테스트