본문 바로가기

Backend

Spring Batch + MyBatis 연결방법

 
결론: 사용 환경에 따라 매우 느릴 수 있다.

운영서버에서 2만 건 조회하는데 30초가 소요되었다(MSSQL 기준). JDBC 사용 시 1초도 안걸리는데 말이다.

물론 내가 어딘가 잘못 구현했을수도 있지만 결국 JDBC Template을 써서 개발을 완료했다.

 

 

 


현재 사내 시스템 환경에서 대부분 MyBatis를 사용하기 때문에 MyBatis를 통해 연결하기로 결정했다.

 

SpringBatch와 연계 해보니 좋은점은 Dao가 필요없다는 점!

쿼리의 namespace.id만 지정하면 key값으로 자동 매핑 된다.

 

MyBatisPagingItemReader 사용을 위해선 sqlSessionFactory가 필요하다.

application.properties에서 datasource는 설정 가능하지만 MyBatis Bean들은 세팅 불가능 한 것 같다.

그래서 따로 Java Configuration을 만들어서 해당 Bean을 생성 해 주었다.

 

하루 종일 구글링하느라 고생했는데 결국 아래 3가지만 맞게 세팅 해 주면 제대로 동작한다.

 

[BatchConfiguration.java]

@Configuration
@RequiredArgsConstructor
public class BatchConfiguration extends DefaultBatchConfigurer {
	private final DataSource dataSource;
	private final ApplicationContext applicationContext;

	@Bean
	public SqlSessionFactory sqlSessionFactory() throws Exception {
		SqlSessionFactoryBean sqlSessionFactoryBean = new SqlSessionFactoryBean();
		sqlSessionFactoryBean.setDataSource(dataSource);
		sqlSessionFactoryBean.setMapperLocations(applicationContext.getResources("classpath:mappers/*.xml"));

		return sqlSessionFactoryBean.getObject();
	}
}

DataSource와 MapperLocations를 세팅 해 주자.

 

[TestTableMapper.xml]

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
  PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
  "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="TestTableMapper">
  <resultMap id="result" type="com.example.demo.domain.TestTableItem">
    <result property="id" column="ID" />
    <result property="seq" column="SEQ" />
  </resultMap>

	<select id="selectTest" parameterType="hashmap" resultMap="result">
	<![CDATA[       
		SELECT ID, SEQ
		  FROM MY_TEST_TABLE
		 WHERE ID <= #{seq}
	]]>
	</select>
	
</mapper>

참고) Spring Batch에서 Job/StepExecutionContext를 활용하려면 Serialize 인터페이스를 상속받은 클래스를 사용해야 한다.

resultType="hashmap"으로 설정하면 Key-Value 쌍으로 구성된 맵이 리턴 되며, 별도의 클래스를 사용하지 않아도 된다.

 

[Reader 메소드]

...
    @Bean
    @StepScope
    public MyBatisPagingItemReader<TestTableItem> myBatisItemReader() throws Exception {
    	Map<String, Object> parameterValues = new HashMap<>();
    	parameterValues.put("seq", 6);
    	return new MyBatisPagingItemReaderBuilder<TestTableItem>()
    			.pageSize(chunkSize)
    			.sqlSessionFactory(sqlSessionFactory)
    			.queryId("TestTableMapper.selectTest")
    			.parameterValues(parameterValues)
    			.build();
    }
...

queryId가 namespace.id값과 일치하면 동작한다.

 

다음 할 일

1) 비즈니스 로직 짜기

2) Quartz 스케줄러 공부

3) Jar 단일파일로 만들기 공부

 

'Backend' 카테고리의 다른 글

Springboot (2) 단위 테스트  (0) 2020.04.18
Springboot (1) 개발환경 설정  (0) 2020.04.17
Spring Batch 메타 테이블 비 활성화  (0) 2020.03.17
사내 인트라넷 메이븐 연결하기  (0) 2020.03.16
Spring Batch 시작하기  (0) 2020.03.15