사용자 도구

사이트 도구


springframework:batch:batch_test

차이

문서의 선택한 두 판 사이의 차이를 보여줍니다.

차이 보기로 링크

springframework:batch:batch_test [2021/04/09 17:32]
kwon37xi 만듦
springframework:batch:batch_test [2021/04/09 18:00] (현재)
kwon37xi
줄 2: 줄 2:
   * [[springframework:batch|Spring Framework Batch]] Test 하기   * [[springframework:batch|Spring Framework Batch]] Test 하기
  
 +
 +
 +===== JobReporitoryTestUtils =====
 +  * 원칙적으로 Job 관련 테스트 실행 후에는 ''JobRepositoryTestUtils.removeJobExecutions()''를 실행해야 한다.
 +<code java>
 +@Autowired
 +private JobRepositoryTestUtils jobRepositoryTestUtils;
 +
 +@AfterEach
 +void tearDown() {
 +    jobRepositoryTestUtils.removeJobExecutions();
 +}
 +</code>
 +  * 헌데, 이게 작동하지 않는 경우가 있는데 그것은, JDBC Connection Pool 에서 ''autoCommit=false'' 로 설정했을 때이다.
 +  * 이 경우 저 메소드가 삭제하는 테이블들이 제대로 삭제가 안되고 롤백이 돼 버리는데, 이유는 ''removeJobExecutions()'' 메소드 내부에서 호출하는 메소드들에 제대로 된 트랜잭션이 안 걸려 있기 때문이다.
 +  * 1차 시도 : ''tearDown()'' 에 ''@Transactional'' 설정 : 실패.
 +  * 2차 시도 : ''autoCommit=true'' 이건 당연히 작동한다. 하지만 내가 원하는건 ''false''
 +  * Spring Batch 용 Datasource 와 애플리케이션 데이터소스를 분리하고 애플리케이션 데이터소스는 ''autoCommit=false'', batch 데이터소스는 ''autoCommit=true''로 하는 것이 좋다.
 +  * 3차 시도 : 강제 트랜잭션주기. 성공
 +
 +<code java>
 +@Autowired
 +private JobRepositoryTestUtils jobRepositoryTestUtils;
 +
 +@Autowired
 +private PlatformTransactionManager platformTransactionManager;
 +
 +/**
 + * {@link JobRepositoryTestUtils#removeJobExecutions()} 내부에 transaction이 없는데 ''autoCommit=false'' 설정때문에
 + * 이 메소드 내부의 update 쿼리가 rollback 되는 현상이 발생해서 강제로 트랜잭션을 설정해준다.
 + */
 +@AfterEach
 +void tearDown() {
 +    TransactionTemplate transactionTemplate = new TransactionTemplate(platformTransactionManager);
 +    transactionTemplate.afterPropertiesSet();
 +    transactionTemplate.execute(status -> {
 +        jobRepositoryTestUtils.removeJobExecutions();
 +        return null;
 +    });
 +}
 +</code>
  
 ===== 참조 ===== ===== 참조 =====
springframework/batch/batch_test.txt · 마지막으로 수정됨: 2021/04/09 18:00 저자 kwon37xi