본문 바로가기

백엔드 지식 저장소

@Transactional에 관해

728x90

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편을 기반으로 작성한 포스팅입니다. 문제 시 삭제하도록하겠습니다.

728x90