Spring Batch 로 다중 Data Source 접근하기(매우 간단 주의)

Seon
podo_official
Published in
4 min readMar 28, 2020

들어가기에 앞서

대부분의 내용은 이동욱님의 블로그를 참고했습니다. 개념 정리가 잘 되어있고, 예제도 따라가면서 하기 좋아서 Spring Batch 에 관심 있다고 강력 추천드립니다.(이미 보셨겠지만…)

최근 배치를 작성할 일이 생겼는데, 이 기회에 공부도 할겸 Spring Batch 를 사용했습니다. 여러 개의 DB 에 접근해야하는 배치를 짜다가 어려움을 겪어서 기록차 글로 남깁니다.

간단한 예제 배치를 만들어보겠습니다. 저는 외부 DB 에서 값을 읽어서(DB1), 웹 요청을 보낸 후 내부 DB 에 원하는 값(DB2)을 저장하는 배치를 짜려고 합니다. 그리고 배치 관련 작업 기본 DB 는 기존 H2 를 사용하기 원합니다.(DB3)

먼저 간단한 Spring Initializr 로 간단한 프로젝트를 만듭니다.

https://start.spring.io/ 에서 만드셔도 되고, IDE 의 힘을 빌려도 됩니다. 저는 인텔리제이를 통해 아래와 같이 프로젝트를 만들었습니다.

추가로 필요하면 pom.xml 에 (저는 maven 을 사용했습니다) 언제든 추가 가능하므로, 처음 설정에 스트레스를 받을 필요 없습니다.

프로젝트가 생성되었다면 @EnableBatchProcessing 을 붙여줍니다. @EnableBatchPatchProcessing 어노테이션은은 Spring Batch 의 기능을 사용하기 위한 필수 어노테이션입니다. 그러면 JobBuilderFactory, StepBuilderFactory 를 주입하여 배치를 실행할 수 있습니다.

저는 여러개의 DB 에 접근하고 싶기 때문에 DataSource 를 여러 개 만듭니다. 그리고 기본 배치 관련 데이터들은 H2 DB 를 사용하고 싶기 때문에 H2 에 해당하는 DataSource@Primary 를 붙여줍니다.

JPA 를 통해 내부 DB 에 접근할 것이기 때문에 관련 설정도 해줍니다. 예제를 보면 customDataSource Bean 을 직접 주입합니다.

Reader, Step, Writer 등을 구현합니다. 관련된 내용은 이동욱님의 블로그에 정리가 잘 되어있습니다.

예제의 경우 JdbcPagingItemReader 를 통해 외부 DB 에서 데이터를 읽어오고, 그 값을 바탕으로 http request 를 보내고, 내부 DB 에 값을 저장하고 있습니다. 마찬가지로 외부 DB 에 접근하기 위해 명시적으로 externalDataSource 를 주입해줍니다.

Spring Batch 에서 다중 DataSource 를 사용하기 위해서는 Spring Batch 의 기본 데이터(BATCH_JOB_INSTANCE 등등) 를 저장하는 DataSource@Primary 어노테이션을 붙이고 나머지를 명시적으로 주입하여 사용하면 다중 DataSource 를 사용할 수 있습니다.

특별한 내용은 아니지만 Spring Batch 의 경우 실행을 할 때 실행 기록을 남기기 위해 기본적으로 DB 를 사용하기 때문에, 일반 Spring Boot 와 약간 다른 점이 있습니다. 혹시 같은 어려움이 있는 분이 있을까 경험을 공유합니다.

부족한 글 읽어주셔서 감사합니다. 사용한 모든 소스 코드는 아래 링크에 있습니다. 예제의 application.properties 의 디비 정보를 수정할 경우 소스 코드를 실행해볼 수 있습니다.

https://github.com/SeonDH/demo.batch.git

--

--