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. 데이터 접근 기술 - 테스트