인프런 커뮤니티 질문&답변

스프님의 프로필 이미지
스프

작성한 질문수

Practical Testing: 실용적인 테스트 가이드

Test Fixture 클렌징

'아래 spring batch 통합 테스트시 @Transactional 사용 어려움 질문'의 추가질문입니다.

작성

·

64

·

수정됨

0

아래 질문에서 (https://www.inflearn.com/community/questions/939280/spring-batch-%ED%86%B5%ED%95%A9-%ED%85%8C%EC%8A%A4%ED%8A%B8%EC%8B%9C-transactional-%EC%82%AC%EC%9A%A9-%EC%96%B4%EB%A0%A4%EC%9B%80-%EC%A7%88%EB%AC%B8%EC%9D%B4%EC%9A%A5?srsltid=AfmBOorgNyXxuBBsgtD-dGYQq1p884s2u8Wg1u75xaynYq2EooXmmnnM)

즉, 스프링 배치 통합 테스트를 작성하는 경우, 현 강의에서 다루고 있는 테스트 작성법과는 다른 접근이 필요한 것이죠. (배치 수행 시 chunk 단위로 여러 번 트랜잭션이 수행될테니까요)

답변을 달아주셨는데요,

테스트 클래스에 @Transactional 붙이면, 하나의 테스트 메서드 내 스프링 배치의 작업도 일괄 롤백될테니까, 결국엔 테스트 간에 오류를 안일으키지 않나요..?

 

 

답변 2

0

박우빈님의 프로필 이미지
박우빈
지식공유자

안녕하세요, 스프 님!

스프링 배치는 일반적인 테스트와 상황이 조금 다른데요.

간단히 이야기하자면 스프링 배치에서 사용하는 JobRepository는 기본적으로 외부 트랜잭션을 허용하지 않습니다.
Job 실행 시점에 외부 트랜잭션이 열려있는지를 체크하여 열려있다면 예외를 발생시킵니다.
그러므로 테스트 클래스에서 트랜잭션을 걸면 Job 외부에서 트랜잭션을 여는 형태가 되기 때문에, 테스트가 실행되지 않습니다.
결국 스프링에서 제공하는 트랜잭션을 통한 롤백 기능도 사용하기가 어렵게 되는 것이죠.

잘 정리된 내용의 아티클이 있어서 함께 공유드려요. (https://brunch.co.kr/@anonymdevoo/50)

 

감사합니다. 🙂

0

안녕하세요, 인프런 AI 인턴입니다.

스프님이 질문하신 내용은 Spring Batch 통합 테스트 시 @Transactional 사용과 관련된 세부적인 동작 원리에 관한 것으로 보입니다. 아래 답변에서 알 수 있는 추가적인 내용을 토대로 설명을 드리겠습니다.

스프링 배치와 @Transactional

스프링 배치의 Job과 Step은 자체적인 트랜잭션 경계를 가지고 동작합니다. 이는 기본적으로 각각의 Step이 독립적인 트랜잭션을 통해 실행되는 것을 의미하며, 모든 작업이 완료되면 트랜잭션이 커밋됩니다. 이러한 구조는 대량의 데이터를 처리하거나 복잡한 작업 흐름을 안정적으로 관리하는데 유리합니다.

그러나, 통합 테스트 클래스에 @Transactional을 붙이게 되면 해당 테스트 메서드 내에서 발생한 모든 데이터베이스 작업은 테스트 종료 시점에 롤백됩니다. 이는 테스트 환경에 의해 발생하는 변경을 실제 데이터베이스에 반영하지 않도록 보장합니다.

Chunk 단위 처리와 일괄 롤백

  • @Transactional을 메서드에 사용하면 전체 테스팅 작업이 하나의 트랜잭션 경계 안에서 이루어지기 때문에, 스프링 배치의 각 Chunk 단위 작업도 전체 테스트가 끝난 후 한꺼번에 롤백됩니다.
  • 따라서, 이는 개별 Step의 커밋과는 별개의 문제로, 테스트 수준의 롤백으로 이해할 수 있습니다.
  • 이런 경우 개별 Chunk 처리의 중간 커밋은 테스트 트랜잭션 환경에서 활용되지 않으므로 전체적인 테스트 환경에서는 선언된 롤백의 영향을 받게 됩니다.

추가 참고 내용

  • Spring Batch 공식 문서에서는 Batch와 관련된 테스트 전략과 환경 설정에 대한 안내를 제공합니다.
  • 테스트 클래스에 @Transactional을 사용해 전체 데이터베이스 작업을 일시적으로 변경하고 후 롤백할 수 있기 때문에, 데이터의 정합성을 유지하면서 배치 처리를 시험해볼 수 있습니다.

저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다. 현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏 추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.

스프님의 프로필 이미지
스프

작성한 질문수

질문하기