작성
·
368
0
Spring Batch Test 강의를 보면
@After
public void clear() 함수를 만들어서
insert한 데이터를 직접 삭제하는데 테스트코드에서 자동으로 트랜잭션 롤백이 안되는건가요?
안된다면 할 수 있는 방법은 없나요?
답변 2
0
네
테스트 코드에서 메서드 위에 @Transactional 어노테이션을 붙이면 테스트 코드 수행 후 자동 롤백 됩니다.
이와 관련해서 구글에서 검색해 보시면 여러 자료가 있으니 참조해 주시기 바랍니다.
0
안녕하세요, jung 님. 인프런 AI 인턴이에요.
Spring Batch 테스트에서 @After 어노테이션을 사용하여 clear() 함수를 만들고, 직접 데이터를 삭제하는 것은 일반적인 방법입니다. 테스트를 실행하면 자동으로 트랜잭션 롤백이 되는 것이 기본 동작입니다만, 몇 가지 상황에서는 롤백이 정상적으로 이루어지지 않을 수 있습니다.
만약 테스트 코드에서 자동으로 롤백이 되지 않는다면, 다음과 같은 확인 사항을 확인해볼 수 있습니다.
1. @Transactional 어노테이션을 사용하여 각각의 테스트 메소드에 트랜잭션을 적용했는지 확인해보세요. 롤백을 위해서는 테스트 메소드가 트랜잭션 내에서 실행되어야 합니다.
2. 테스트 환경이 올바른 데이터 소스를 사용하고 있는지 확인해보세요. 롤백을 위해서는 테스트 환경에서 사용하는 데이터 소스가 올바르게 설정되어야 합니다.
만약 롤백이 되지 않는 상황이라면, 수동으로 롤백을 수행할 수 있습니다. 테스트 코드에서 트랜잭션을 시작한 후 수동으로 롤백을 호출하는 방법을 사용해보세요. 예를 들면 다음과 같은 코드를 사용할 수 있습니다.
@Autowired
private PlatformTransactionManager transactionManager;
@Autowired
private JobRepository jobRepository;
@Transactional
@After
public void clear() {
TransactionStatus transactionStatus = transactionManager.getTransaction(new DefaultTransactionDefinition());
jobRepository.clear(); // 데이터 삭제 작업
transactionManager.rollback(transactionStatus);
}
위와 같이 수동으로 트랜잭션을 관리하고 롤백을 호출하면, clear() 함수에서 작업한 데이터가 롤백되어 원하는 상태로 테스트를 유지할 수 있습니다.
그러나 롤백이 되지 않는 다른 원인이 있는 경우, 추가적인 디버깅이 필요할 수 있습니다. 해당 강의나 관련된 커뮤니티 등에서 상세한 내용을 확인하시는 것도 도움이 될 수 있습니다. 감사합니다!