ItemWriter

Reader์™€ Processor๋ฅผ ๊ฑฐ์ณ ์ฒ˜๋ฆฌ๋œ Item์„ Chunk ๋‹จ์œ„๋งŒํผ ์Œ“์€ ํ›„ ์ด๋ฅผ Writer์— ์ „๋‹ฌํ•˜๊ณ , ItemWriter๋Š” ๋ฐฐ์น˜์˜ ์ถœ๋ ฅ์„ ๋‹ด๋‹นํ•œ๋‹ค.

public interface ItemWriter<T> {
    void write(List<? extends T> var1) throws Exception;
}

ItemWriter์˜ write()๋Š” ์ธ์ž๋กœ Item List๋ฅผ ๋ฐ›๋Š” ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ๋‹ค. Spring Batch์—์„œ๋Š” ๋‹ค์–‘ํ•œ Output ํƒ€์ž…์„ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋„๋ก Writer๋ฅผ ์ œ๊ณตํ•˜๊ณ  ์žˆ๋‹ค.

Database Writer

  • JdbcBatchItemWriter

  • HibernateItemWriter

  • JpaItemWriter

๋‹ค์Œ 3๊ฐ€์ง€ Writer๊ฐ€ ์žˆ์œผ๋ฉฐ, Database์˜ ์˜์†์„ฑ๊ณผ ๊ด€๋ จํ•ด์„œ๋Š” ํ•ญ์ƒ Flush๋ฅผ ํ•ด์ค˜์•ผํ•œ๋‹ค. Writer๊ฐ€ ๋ฐ›์€ ๋ชจ๋“  Item์ด ์ฒ˜๋ฆฌ ๋œ ํ›„์— Spring Batch๋Š” ํ˜„์žฌ ํŠธ๋žœ์žญ์…˜์„ ์ปค๋ฐ‹ํ•œ๋‹ค.

JdbcBatchItemWriter

ORM์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ์—๋Š” ๋Œ€๋ถ€๋ถ„ JdbcBatchItemWriter๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.

jdbcwrite-flow

JdbcBatchItemWriter๋Š” JdbcTemplate์„ ์‚ฌ์šฉํ•˜๋ฉฐ, JDBC์˜ Batch ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•ด ํ•œ๋ฒˆ์— DB๋กœ ์ „๋‹ฌํ•˜์—ฌ DB๋‚ด๋ถ€์—์„œ ์ฟผ๋ฆฌ๊ฐ€ ์‹คํ–‰๋˜๋„๋ก ํ•œ๋‹ค. ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜๊ณผ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๊ฐ„์— ๋ฐ์ดํ„ฐ๋ฅผ ์ฃผ๊ณ  ๋ฐ›๋Š” ํšŒ์ˆ˜๋ฅผ ์ตœ์†Œํ™”ํ•˜์—ฌ ์„ฑ๋Šฅํ–ฅ์ƒ์„ ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•˜๊ธฐ ์œ„ํ•ด์„œ๋‹ค.

์ด๋•Œ write()๋ฉ”์„œ๋“œ๋ฅผ ๋ณด๋ฉด SQL๋ฌธ์„ ํ•œ๋ฒˆ์”ฉ ํ˜ธ์ถœํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹Œ batchUpdate๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์ฒญํฌ ๋‹จ์œ„๋กœ ์ผ๊ด„์ฒ˜๋ฆฌํ•˜๋Š” ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ๋‹ค. ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ์‹คํ–‰ ์„ฑ๋Šฅ์„ ํฌ๊ฒŒ ํ–ฅ์ƒ ์‹œํ‚ฌ ์ˆ˜ ์žˆ์œผ๋ฉฐ, ๋ฐ์ดํ„ฐ ๋ณ€๊ฒฝ ์‹คํ–‰์„ ํŠธ๋žœ์žญ์…˜ ๋‚ด์—์„œ ํ•  ์ˆ˜ ์žˆ๋‹ค.

Property
Parameter Type
Default
์„ค๋ช…

assertUpdates

boolean

true

true์ด๋ฉด ๋ชจ๋“  ์•„์ดํ…œ์ด ์‚ฝ์ž…์ด๋‚˜ ์ˆ˜์ •๋˜์—ˆ๋Š”์ง€ ๊ฒ€์ฆํ•œ๋‹ค. ์ฆ‰, ์ ์–ด๋„ ํ•˜๋‚˜์˜ ํ•ญ๋ชฉ์ด ํ–‰์„ ์—…๋ฐ์ดํŠธ ํ•˜๊ฑฐ๋‚˜ ์‚ญ์ œํ•˜์ง€ ์•Š์„ ๊ฒฝ์šฐ ์˜ˆ์™ธ(EmptyResultDataAccessException)๋ฅผ throwํ• ์ง€ ์„ค์ •ํ•œ๋‹ค.

dataSource

DataSource

null(ํ•„์ˆ˜)

ํ•„์š”ํ•œ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ๋Œ€ํ•œ ์ ‘๊ทผ ์ œ๊ณต

sql

String

null(ํ•„์ˆ˜)

๊ฐ ์•„์ดํ…œ๋‹น ์ˆ˜ํ–‰ํ•  SQL

itemPreparedStatementSetter

ItemPreparedStatementSetter

null

ํ‘œ์ค€ PreparedState๊ฐ€ ์ œ๊ณต๋œ๋‹ค๋ฉด(ํŒŒ๋ผ๋ฏธํ„ฐ ์œ„์น˜์— ?์‚ฌ์šฉ), ์ด ํด๋ž˜์Šค๋ฅผ ์‚ฌ์šฉํ•ด ํŒŒ๋ผ๋ฏธํ„ฐ ๊ฐ’์„ ์ฑ„์›€

itemSqlParameterSourceProvider

ItemSqlParameterSourceProvider

null

์ œ๊ณต๋œ SQL์— ๋„ค์ž„๋“œ ํŒŒ๋ผ๋ฏธํ„ฐ๊ฐ€ ์‚ฌ์šฉ๋œ๋‹ค๋ฉด, ์ด ํด๋ž˜์Šค๋ฅผ ์‚ฌ์šฉํ•ด ํŒŒ๋ผ๋ฏธํ„ฐ ๊ฐ’ ์ฑ„์›€

simpleJdbcTemplate

SimpleJdbcTemplate

null

SimpleJdbcOperations ์ธํ„ฐํŽ˜์ด์Šค์˜ ๊ตฌํ˜„์ฒด๋ฅผ ์ฃผ์ž… ๊ฐ€๋Šฅ

afterPropertiesSet

๊ฐ๊ฐ Writer๋“ค์ด ์‹คํ–‰๋˜๊ธฐ ์œ„ํ•ด ํ•„์š”ํ•œ ํ•„์ˆ˜ ๊ฐ’๋“ค์ด ์ œ๋Œ€๋กœ ์„ธํŒ…๋˜์–ด ์žˆ๋Š”์ง€ ํ™•์ธ

JdbcBatchItemWriterBuilder

JdbcBatchItemWriterBuilder๋Š” ๋‹ค์Œ 3๊ฐ€์ง€ ์„ค์ • ๊ฐ’์„ ๊ฐ–๊ณ  ์žˆ๋‹ค.

Property
Parameter Type
Default
์„ค๋ช…

assertUpdates

boolean

true

true์ด๋ฉด ๋ชจ๋“  ์•„์ดํ…œ์ด ์‚ฝ์ž…์ด๋‚˜ ์ˆ˜์ •๋˜์—ˆ๋Š”์ง€ ๊ฒ€์ฆํ•œ๋‹ค. ์ฆ‰, ์ ์–ด๋„ ํ•˜๋‚˜์˜ ํ•ญ๋ชฉ์ด ํ–‰์„ ์—…๋ฐ์ดํŠธ ํ•˜๊ฑฐ๋‚˜ ์‚ญ์ œํ•˜์ง€ ์•Š์„ ๊ฒฝ์šฐ ์˜ˆ์™ธ(EmptyResultDataAccessException)๋ฅผ throwํ• ์ง€ ์„ค์ •ํ•œ๋‹ค.

columnMapped

Key, Value ๊ธฐ๋ฐ˜์œผ๋กœ Insert SQL์˜ Values๋ฅผ ๋งคํ•‘ํ•œ๋‹ค.

beanMapped

POJO ๊ธฐ๋ฐ˜์œผ๋กœ Insert SQL์˜ Values๋ฅผ ๋งคํ•‘ํ•œ๋‹ค.

  • columnMapped

  • beanMapped

afterPropertiesSet

์ด ์™ธ์— afterPropertiesSet()๋ฉ”์„œ๋“œ๋ฅผ ์ถ”๊ฐ€๋กœ ์•Œ๊ณ  ์žˆ์œผ๋ฉด ์ข‹๋‹ค. ์ด ๋ฉ”์„œ๋“œ๋Š” InitalizingBean ์ธํ„ฐํŽ˜์ด์Šค์—์„œ ๊ฐ–๊ณ  ์žˆ์œผ๋ฉฐ, ItemWriter ๊ตฌํ˜„์ฒด๋“ค์€ ๋ชจ๋‘ InitializingBean ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•˜๊ณ  ์žˆ๋‹ค.

์ด ๋ฉ”์„œ๋“œ๋Š” ๊ฐ๊ฐ Writer๋“ค์ด ์‹คํ–‰๋˜๊ธฐ ์œ„ํ•ด ํ•„์š”ํ•œ ํ•„์ˆ˜ ๊ฐ’๋“ค์ด ์ œ๋Œ€๋กœ ์„ธํŒ…๋˜์–ด ์žˆ๋Š”์ง€ ํ™•์ธํ•œ๋‹ค. Writer ์ƒ์„ฑ ํ›„ ํ•ด๋‹น ๋ฉ”์„œ๋“œ๋ฅผ ์‹คํ–‰ํ•˜๋ฉด ์–ด๋А ๊ฐ’์ด ๋ˆ„๋ฝ๋˜์—ˆ๋Š”์ง€ ์•Œ ์ˆ˜ ์žˆ์–ด์„œ ๋งŽ์ด ์‚ฌ์šฉํ•˜๋Š” ์˜ต์…˜์ด๋‹ค.

HibernateItemWriter

  • org.springframework.batch.item.database.HibernateItemWriter

HibernateItemWriter์—์„œ ๊ฐ ์•„์ดํ…œ์— ๋Œ€ํ•ด session.saveOrUpdate ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•˜๋ฉฐ, ๋ชจ๋“  ์•„์ดํ…œ์ด ์ €์žฅ๋˜๊ฑฐ๋‚˜ ์ˆ˜์ •๋˜๋ฉด flush ๋ฉ”์„œ๋“œ๋ฅผ ํ†ตํ•ด ๋ชจ๋“  ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ํ•œ๋ฒˆ์— ์‹คํ–‰ํ•œ๋‹ค.

์˜์กด์„ฑ ์ถ”๊ฐ€

ํ”„๋กœํผํ‹ฐ ์„ค์ •

JPA ์–ด๋…ธํ…Œ์ด์…˜ ์ถ”๊ฐ€

Configurer ์ƒ์„ฑ

HibernateTransactionManager๋ฅผ ํŠธ๋žœ์žญ์…˜ ์œผ๋กœ ์„ค์ •ํ•ด์ค€๋‹ค.

JpaItemWriter

ORM์„ ์‚ฌ์šฉํ•  ๋•Œ, Writer์— ์ „๋‹ฌํ•˜๋Š” ๋ฐ์ดํ„ฐ๊ฐ€ Entity ํด๋ž˜์Šค์ธ ๊ฒฝ์šฐ JpaItemWriter๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋œ๋‹ค. JpaItemWriter๋Š” JPA๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์˜์†์„ฑ ๊ด€๋ฆฌ๋ฅผ ์œ„ํ•ด EntityManager๋ฅผ ํ• ๋‹นํ•ด์ค˜์•ผํ•œ๋‹ค.

์ผ๋ฐ˜์ ์œผ๋กœ spring-boot-starter-data-jpa๋ฅผ ์˜์กด์„ฑ์— ๋“ฑ๋กํ•˜๋ฉด EntityManager๊ฐ€ Bean์œผ๋กœ ์ž๋™ ์ƒ์„ฑ๋˜์–ด DI์ฝ”๋“œ๋งŒ ์ถ”๊ฐ€ํ•˜๋ฉด ๋œ๋‹ค.

afterPropertiesSet

JpaItemWriter์˜ afterPropertiesSet()์—์„œ๋Š” EntityManagerFactory ๋งŒ ํ•„์ˆ˜ ๊ฐ’์œผ๋กœ ํ™•์ธํ•˜๊ณ  ์žˆ์–ด ์ฒดํฌํ•  ์š”์†Œ๊ฐ€ ์ ๋‹ค. ์ฆ‰, setEntityManger๋งŒ ํ•ด์ฃผ๋ฉด ๋ชจ๋“  ์„ค์ •์ด ๋๋‚œ๋‹ค.

write()

JpaItemWriter์˜ doWrite()๋ฅผ ๋ณด๋ฉด ๋„˜์–ด์˜จ item ๊ทธ๋Œ€๋กœ entityManager.merge(item)๋ฅผ ์ˆ˜ํ–‰ํ•˜์—ฌ ํ…Œ์ด๋ธ”์— ๋ฐ”๋กœ ๋ฐ˜์˜ํ•˜๊ธฐ ๋•Œ๋ฌธ์—, JpaItemWriter๋Š” Entity ํด๋ž˜์Šค๋ฅผ ์ œ๋„ค๋ฆญ ํƒ€์ž…์œผ๋กœ ๋ฐ›์•„์•ผ๋งŒ ํ•œ๋‹ค.

MyBatisBatchItemWriter

Step์—์„œ ์ •์˜ํ•œ Chunk Size(FetchSize)๋งŒํผ ์ฒ˜๋ฆฌํ•ด์ฃผ๋ ค๋ฉด executorType์„ BATCH๋กœ ์„ค์ •ํ•ด์ค˜์•ผํ•œ๋‹ค.

๊ทธ ๋‹ค์Œ ์ˆ˜ํ–‰ํ•  ์ฟผ๋ฆฌ๋ฅผ mapper์— ์ž‘์„ฑํ•ด์ฃผ๊ณ  ์ˆ˜ํ–‰ํ•˜๋ฉด ๋œ๋‹ค.

RepositoryItemWriter

์“ฐ๊ธฐ ์ž‘์—… ์ˆ˜ํ–‰์‹œ์—๋Š” ํŽ˜์ด์ง•์ด๋‚˜ ์ •๋ ฌ์ด ํ•„์š”์—†์œผ๋ฏ€๋กœ, CrudRepository๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.

์œ„์—์„œ ๊ตฌํ˜„ํ•œ repository๋ฅผ ์„ค์ •ํ•ด์ฃผ๊ณ , ํ˜ธ์ถœํ•  ๋ฉ”์„œ๋“œ๋ช…๋งŒ ์ง€์ •ํ•ด์ฃผ๋ฉด๋œ๋‹ค.

Custom ItemWriter

Reader์™€๋Š” ๋‹ค๋ฅด๊ฒŒ Writer์˜ ๊ฒฝ์šฐ customํ•˜๊ฒŒ ๊ตฌํ˜„ํ•ด์•ผํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋งŽ๋‹ค.

  • Reader์—์„œ ์ฝ์–ด์˜จ ๋ฐ์ดํ„ฐ๋ฅผ RestTemplate์œผ๋กœ ์™ธ๋ถ€ API๋ฅผ ์ „๋‹ฌํ•ด์•ผํ•˜๋Š” ๊ฒฝ์šฐ

  • ์ž„์‹œ ์ €์žฅ์„ ํ•˜๊ณ  ๋น„๊ตํ•˜๊ธฐ ์œ„ํ•ด singleton ๊ฐ์ฒด์— ๊ฐ’์„ ๋„ฃ์–ด์•ผํ•˜๋Š” ๊ฒฝ์šฐ

  • ์—ฌ๋Ÿฌ Entity๋ฅผ ๋™์‹œ์— ์ €์žฅํ•ด์•ผํ•˜๋Š” ๊ฒฝ์šฐ

๋‹ค์Œ๊ณผ ๊ฐ™์ด ์—ฌ๋Ÿฌ ์ƒํ™ฉ์ด ์žˆ์„ ์ˆ˜ ์žˆ๋‹ค. ์ด๋Ÿฌํ•œ ๊ฒฝ์šฐ ItemWriter ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ง์ ‘ ๊ตฌํ˜„ํ•˜๋ฉด ๋œ๋‹ค.

  • java7 ์ดํ•˜

  • java8 ์ด์ƒ(ItemWriter์˜ ์ถ”์ƒ๋ฉ”์„œ๋“œ๊ฐ€ write() ํ•œ๊ฐœ ์ด๋ฏ€๋กœ ๋žŒ๋‹ค์‹ ์‚ฌ์šฉ ๊ฐ€๋Šฅ)

๋‹ค์Œ๊ณผ ๊ฐ™์ด write()ํ•จ์ˆ˜๋ฅผ @Overrideํ•˜๋ฉด ๊ตฌํ˜„์ฒด ์ƒ์„ฑ์€ ๋๋‚œ๋‹ค.

์ฐธ๊ณ 

Last updated

Was this helpful?