티스토리 뷰

일전에 Spring Batch의 Chunk 방식에 대해 공유를 한적이 있었다. 

 

[Spring Batch] Chunk Example (File to DB, Springboot based)

Spring Framework의 개발환경이 Springboot 기반으로 변함에 따라 Spring Batch의 개발방식도 이전과는 많이 달라졌다. 필자가 전에 쓴 Spring Batch에 관한 글은 Springboot 기반이 아니라서 Batch Job을 작성하..

oingdaddy.tistory.com

이때 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 은 아래 글과 같이 사용할 수 있다. 

 

Springboot에서 MyBatis 설정을 application.yml 으로 하기

MyBatis 진영에서 MyBatis-Spring-Boot-Starter 라는것을 내놓았다. 아니.. 나만 몰랐던것 같다. 누군가가 작성한 샘플을보니 mybatis-config.xml (MyBatis 설정파일) 파일에 보통 있어야 할 내용들이 없는데도 있..

oingdaddy.tistory.com

위와 같이 준비가 되었으면 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>

이런식으로 작성을 해주면 끝이다. 사람들이 많이 참여하는 프로젝트에서는 이런 모습이 더 괜찮을것 같다. 

 

끝!

댓글
최근에 올라온 글
최근에 달린 댓글
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31