๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ

Spring Batch

ํŒจ์ŠคํŠธ์บ ํผ์Šค ์ฑŒ๋ฆฐ์ง€ 24์ผ์ฐจ - Spring Batch 6

๐Ÿ“Œ spring-batch 6

โœ”๏ธ ItemWriter

  • ์ด๋ฆ„์€ writer ์ด์ง€๋งŒ ํ•ญ์ƒ ์“ฐ๊ธฐ๋งŒ์„ ๋‹ด๋‹นํ•˜์ง€๋Š” ์•Š๋Š”๋‹ค.
  • ์ฒ˜๋ฆฌ ๋Œ€์ƒ ๋ฐ์ดํ„ฐ ์‚ญ์ œ ๋ฐ ๊ฐฑ์‹ , ์ด๋ฒคํŠธ ์ „์†ก ...

โœ”๏ธ ๊ตฌํ˜„์ฒด

  • FlatFileItemWriter (ํŒŒ์ผ์— ์“ฐ๊ธฐ)
  • JpaItemWriter (Jpa๋ฅผ ์ด์šฉํ•ด์„œ DB์— ์“ฐ๊ธฐ)
  • JdbcBatchItemWriter

โœ”๏ธ FlatFileItemWriter

BeanWrapperFieldExtractor<T>

  • setNames(new String[] {"id", "name", "age", ...});
    • ํ•„๋“œ๋ช… ์ง€์ •

DelimitedLineAggregator<T>

  • ํ•œ ๋ผ์ธ์— ๋Œ€ํ•œ ๊ตฌ๋ถ„์ž ์„ค์ •
  • setDelimiter(","); // csv์˜ ๊ฒฝ์šฐ ','๋ฅผ ๊ตฌ๋ถ„์ž๋กœ ํ•จ
  • setFieldExtractor(fieldExtractor)
FlatFileItemWriterBuilder<T>()
    .name("")
    .encoding("UTF-8")
    .resource(new FileSystemResource("path/file.csv"))
    .lineAggregator(lineAggregator)
    .build();

 

โœ”๏ธ ํ—ค๋”ํ•„๋“œ / ํ‘ธํ„ฐํ•„๋“œ ์ƒ์„ฑ

FlatFileWriter
    .headerCallback(writer -> writer.write("id,์ด๋ฆ„,๋‚˜์ด"))    
    .footerCallback(writer -> writer.write("==========\n"))

 

โœ”๏ธ ๊ธฐ์กด ํŒŒ์ผ์— ์ด์–ด์“ฐ๊ธฐ (ํŒŒ์ผ๋ช…์ด ๊ฐ™์€ ๊ฒฝ์šฐ)

FlatFileWriter
    .append(true)
  • ํ‘ธํ„ฐ์— ๊ฐœํ–‰๋ฌธ์ž ์ถ”๊ฐ€

 

โœ”๏ธ JdbcBatchItemWriter

  • DB bulk ์—ฐ์‚ฐ์— ๋Œ€ํ•œ ์ฒ˜๋ฆฌ (์‚ฝ์ž…,์‚ญ์ œ,๊ฐฑ์‹ )

ex) bulk insert

insert into person (name, age) values("a",1),("b",2),("c",3);
  • values ์—ฌ๋Ÿฌ ๊ฐœ ๋‘์–ด ํ•œ ๋ฒˆ์— ์ฒ˜๋ฆฌ
  • ๋‹จ๊ฑด ์ฒ˜๋ฆฌ๋ณด๋‹ค ๋น„๊ต์  ๋†’์€ ์„ฑ๋Šฅ์„ ๊ฐ€์ง„๋‹ค.
JdbcBatchItemWriterBuilder
    .dataSource(dataSource)
    .itemSqlParameterSourceProvider(
        new BeanPropertyItemSqlParameterSourceProvider<>()
    )
    .sql("insert into person(name,age) values(:name, :age)")
    .build();

rewriteBatchedStatement=true    

 

โœ”๏ธ JpaItemWriter

new JpaItemWriterBuild<T>()
    .entityManagerFactory(emf)
    .build();

โœ”๏ธ 10๊ฐœ ๋ฐ์ดํ„ฐ๋ฅผ ์‚ฝ์ž…์‹œ 20๊ฐœ์˜ ์ฟผ๋ฆฌ๊ฐ€ ๋‚˜๊ฐ„๋‹ค.
1๊ฐœ row ์‚ฝ์ž…์— ๋Œ€ํ•ด select -> insert (2๋ฒˆ์˜ ์ฟผ๋ฆฌ)
โœ”๏ธ why?

  • ๊ธฐ๋ณธ๊ฐ’์œผ๋กœ merge๊ฐ€ ๋™์ž‘๋œ๋‹ค.
  • ์ผ๋‹จ ํ•ด๋‹น ์—”ํ‹ฐํ‹ฐ๊ฐ€ ์ˆ˜์ •๋Œ€์ƒ์ธ์ง€ select ์ฟผ๋ฆฌ๋ฅผ ๋‚ ๋ ค๋ณธ ํ›„
    update or insert ์ฟผ๋ฆฌ๋ฅผ ๋‚ ๋ฆฐ๋‹ค.

 

โœ”๏ธ merge -> persist

JpaItemWriterBuilder<T>()
    .usePersist(true)

 

โœ”๏ธ ์—๋Ÿฌ๋ฐœ์ƒ (GenerationType.IDENTITY)

  • ํ˜„์žฌ๋Š” ์—”ํ‹ฐํ‹ฐ ๊ฐ์ฒด ์ƒ์„ฑ์‹œ ID(pk)๋ฅผ ์ƒ์„ฑ์ž๋ฅผ ํ†ตํ•ด ์ง์ ‘ ๋„ฃ์–ด์ฃผ์—ˆ์Œ
  • ๊ธฐ๋ณธ๊ฐ’(merge)์ผ ๋•Œ๋Š” ์ง์ ‘ ๋„ฃ์–ด์ค€ id๊ฐ’์„ ์กฐํšŒ ํ›„์— ์ฟผ๋ฆฌ๋ฅผ ๋‚ ๋ฆฌ๊ธฐ ๋•Œ๋ฌธ์— ๋ฌธ์ œ๊ฐ€ ๋˜์ง€ ์•Š์•˜์Œ
  • persist์˜ ๊ฒฝ์šฐ IDENTITY๋ฅผ ๋”ฐ๋ฅผ ์ˆ˜ ์žˆ๋„๋ก ํ•ด์ฃผ์–ด์•ผ ํ•œ๋‹ค.
    ๊ฐ์ฒด ์ƒ์„ฑ์‹œ id๊ฐ’์€ ๋ฐ›์œผ๋ฉด ์•ˆ ๋œ๋‹ค.

๐Ÿ‘  ์ˆ˜๊ฐ•์ธ์ฆ

 

ํŒจ์ŠคํŠธ์บ ํผ์Šค [์ง์žฅ์ธ ์‹ค๋ฌด๊ต์œก]

ํ”„๋กœ๊ทธ๋ž˜๋ฐ, ์˜์ƒํŽธ์ง‘, UX/UI, ๋งˆ์ผ€ํŒ…, ๋ฐ์ดํ„ฐ ๋ถ„์„, ์—‘์…€๊ฐ•์˜, The RED, ๊ตญ๋น„์ง€์›, ๊ธฐ์—…๊ต์œก, ์„œ๋น„์Šค ์ œ๊ณต.

fastcampus.co.kr

๋ณธ ํฌ์ŠคํŒ…์€ ํŒจ์ŠคํŠธ์บ ํผ์Šค ํ™˜๊ธ‰ ์ฑŒ๋ฆฐ์ง€ ์ฐธ์—ฌ๋ฅผ ์œ„ํ•ด ์ž‘์„ฑ๋˜์—ˆ์Šต๋‹ˆ๋‹ค