작성
·
64
·
수정됨
0
즉, 스프링 배치 통합 테스트를 작성하는 경우, 현 강의에서 다루고 있는 테스트 작성법과는 다른 접근이 필요한 것이죠. (배치 수행 시 chunk 단위로 여러 번 트랜잭션이 수행될테니까요)
답변을 달아주셨는데요,
테스트 클래스에 @Transactional 붙이면, 하나의 테스트 메서드 내 스프링 배치의 작업도 일괄 롤백될테니까, 결국엔 테스트 간에 오류를 안일으키지 않나요..?
답변 2
0
안녕하세요, 스프 님!
스프링 배치는 일반적인 테스트와 상황이 조금 다른데요.
간단히 이야기하자면 스프링 배치에서 사용하는 JobRepository는 기본적으로 외부 트랜잭션을 허용하지 않습니다.
Job 실행 시점에 외부 트랜잭션이 열려있는지를 체크하여 열려있다면 예외를 발생시킵니다.
그러므로 테스트 클래스에서 트랜잭션을 걸면 Job 외부에서 트랜잭션을 여는 형태가 되기 때문에, 테스트가 실행되지 않습니다.
결국 스프링에서 제공하는 트랜잭션을 통한 롤백 기능도 사용하기가 어렵게 되는 것이죠.
잘 정리된 내용의 아티클이 있어서 함께 공유드려요. (https://brunch.co.kr/@anonymdevoo/50)
감사합니다. 🙂
0
안녕하세요, 인프런 AI 인턴입니다.
스프님이 질문하신 내용은 Spring Batch 통합 테스트 시 @Transactional 사용과 관련된 세부적인 동작 원리에 관한 것으로 보입니다. 아래 답변에서 알 수 있는 추가적인 내용을 토대로 설명을 드리겠습니다.
스프링 배치의 Job과 Step은 자체적인 트랜잭션 경계를 가지고 동작합니다. 이는 기본적으로 각각의 Step이 독립적인 트랜잭션을 통해 실행되는 것을 의미하며, 모든 작업이 완료되면 트랜잭션이 커밋됩니다. 이러한 구조는 대량의 데이터를 처리하거나 복잡한 작업 흐름을 안정적으로 관리하는데 유리합니다.
그러나, 통합 테스트 클래스에 @Transactional을 붙이게 되면 해당 테스트 메서드 내에서 발생한 모든 데이터베이스 작업은 테스트 종료 시점에 롤백됩니다. 이는 테스트 환경에 의해 발생하는 변경을 실제 데이터베이스에 반영하지 않도록 보장합니다.
저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다. 현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏 추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.