티스토리 뷰
일전에 Spring Batch의 Chunk 방식에 대해 공유를 한적이 있었다.
이때 DB Writer는 JdbcBatchItemWriter 라는 것을 사용했었다. 이것은 단점이 있다. 바로 query 를 java 소스에 작성을 해야 하는 문제가 있다. 보기도 좋지 않고 관리도 좋지 못하다. 그래서 이런 단점을 보완해주는 MyBatisBatchItemWriter 에 대해 기술하려고 한다. Writer 부분을 제외한 부분은 위의 링크의 글을 참조하도록 하자.
JdbcBatchItemWriter
@Bean
public JdbcBatchItemWriter<Employee> testWriter(DataSource dataSource) {
return new JdbcBatchItemWriterBuilder<Employee>()
.itemSqlParameterSourceProvider(new BeanPropertyItemSqlParameterSourceProvider<>())
.sql("INSERT INTO BATCH_SAMPLE_EMPLOYEE (user_id, user_name, user_gender, department_code"
+ ") VALUES (:userId, :userName, :userGender, :departmentCode)")
.dataSource(dataSource)
.build();
}
일단 기존의 JdbcBatchItemWriter 를 살펴보자. 위에서 언급한대로 쿼리가 소스상에서 표현이 된다.
MyBatisBatchItemWriter
@Bean
public MyBatisBatchItemWriter<Employee> testWriter(SqlSessionFactory sqlSessionFactory) {
return new MyBatisBatchItemWriterBuilder<Employee>()
.sqlSessionFactory(sqlSessionFactory)
.statementId("employee.saveEmployee")
.build();
}
그다음으로는 MyBatisBatchItemWriter 를 살펴보자. 일반적으로 MyBatis를 사용할때 queryId를 사용하듯이 이것도 마찬가지로 사용을 할 수 있다. 훨씬 깔끔하다. Writer 부분만 이런식으로 바꿔서 끼면 된다. 물론 MyBatis dependency는 있어야 한다. 필자는 mybatis-spring-boot-starter를 사용하고 있다. mybatis-spring-boot-starter 은 아래 글과 같이 사용할 수 있다.
위와 같이 준비가 되었으면 application.yml에서 설정을 할 수 있다.
mybatis:
config-location: classpath:mybatis/mybatis-config.xml
mapper-locations: classpath*:mybatis/**/*.sql
executorType: BATCH
이렇게 설정을 했으면 resources/mybatis/** 에 해당하는 장소에 statementId에 맞는 쿼리를 작성해야 한다. MyBatis를 사용해봤다면 어렵지 않다. 동일하게 작성을 해주면 된다.
또한 Step에서 정의한 FetchSize만큼씩 처리해주기 위해 executorType을 BATCH로 설정한다. (Default : SIMPLE)
<?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="employee">
<insert id="saveEmployee">
INSERT INTO BATCH_SAMPLE_EMPLOYEE (
user_id,
user_name,
user_gender,
department_code
) VALUES (
#{userId},
#{userName},
#{userGender},
#{departmentCode}
)
</insert>
</mapper>
이런식으로 작성을 해주면 끝이다. 사람들이 많이 참여하는 프로젝트에서는 이런 모습이 더 괜찮을것 같다.
끝!
'Framework > Batch' 카테고리의 다른 글
Spring Batch 실행시 ORA-08177: can't serialize access for this transaction 오류 조치 (0) | 2021.09.10 |
---|---|
Spring Batch Chunk 단위로 logging 하기 (w. ChunkListener) (0) | 2021.07.13 |
[Spring Batch] Decider Simple Example (Springboot based) (0) | 2021.05.17 |
[Spring Batch] Partitioner Simple Example (Springboot based) (3) | 2021.05.06 |
Springboot Batch Jar 파일 생성 및 실행 (0) | 2021.03.24 |