ItemReader
Spring Batch์ Reader์์ ์ฝ์ด์ฌ ์ ์๋ ๋ฐ์ดํฐ ์ ํ์ ๋ค์๊ณผ ๊ฐ๋ค.
์ ๋ ฅ ๋ฐ์ดํฐ์์ ์ฝ์ด์ค๊ธฐ
ํ์ผ์์ ์ฝ์ด์ค๊ธฐ
DB์์ ์ฝ์ด์ค๊ธฐ
Java Message Service ๋ฑ ๋ค๋ฅธ ์์ค์์ ์ฝ์ด์ค๊ธฐ
์ปค์คํ ํ Reader๋ก ์ฝ์ด์ค๊ธฐ
ItemReader์ read()๋ฅผ ํธ์ถํ๋ฉด, ํด๋น ๋ฉ์๋๋ ์คํ
๋ด์์ ์ฒ๋ฆฌํ Itemํ๊ฐ๋ฅผ ๋ฐํํ๋ฉฐ, ์คํ
์์๋ ์์ดํ
๊ฐ์๋ฅผ ์ธ์ด ์ฒญํฌ ๋ด ๋ฐ์ดํฐ๊ฐ ๋ช๊ฐ๊ฐ ์ฒ๋ฆฌ๋๋์ง ๊ด๋ฆฌํ๋ค. ํด๋น Item์ ItemProcessor๋ก ์ ๋ฌ๋๋ฉฐ, ๊ทธ ๋ค ItemWriter๋ก ์ ๋ฌ๋๋ค.
๊ฐ์ฅ ๋ํ์ ์ธ ๊ตฌํ์ฒด์ธ JdbcPagingItemReader์ ํด๋์ค ๊ณ์ธต ๊ตฌ์กฐ๋ฅผ ๋ณด๋ฉด ๋ค์๊ณผ ๊ฐ๋ค.

์ฌ๊ธฐ์ ItemReader์ ItemStream ์ธํฐํ์ด์ค๋ ๊ฐ์ด ๊ตฌํํ๊ณ ์๋ ๊ฒ์ ๋ณผ ์ ์๋ค.
ItemStream์ ์ฃผ๊ธฐ์ ์ผ๋ก ์ํ๋ฅผ ์ ์ฅํ๊ณ , ์ค๋ฅ๊ฐ ๋ฐ์ํ๋ฉด ํด๋น ์ํ์์ ๋ณต์ํ๊ธฐ ์ํ ๋ง์ปค์ธํฐํ์ด์ค์ด๋ค. ์ฆ, ItemReader ์ ์ํ๋ฅผ ์ ์ฅํ๊ณ ์คํจํ ๊ณณ์์ ๋ค์ ์คํํ ์ ์๊ฒ ํด์ฃผ๋ ์ญํ ์ ํ๋ค. ItemReader์ ItemStream ์ธํฐํ์ด์ค๋ฅผ ์ง์ ๊ตฌํํ์ฌ ์ํ๋ ํํ์ ItemReader๋ฅผ ๋ง๋ค ์ ์๋ค.
ํ์ผ ์
๋ ฅ
FlatFileItemReader
org.springframework.batch.item.file.FlatFileItemReaderflat file
ํ ๊ฐ ํน์ ๊ทธ ์ด์์ ๋ ์ฝ๋๊ฐ ํฌํจ๋ ํน์ ํ์ผ
ํ์ผ์ ๋ด์ฉ์ ๋ด๋ ๋ฐ์ดํฐ์ ์๋ฏธ๋ฅผ ์ ์ ์๋ค.
ํ์ผ ๋ด ๋ฐ์ดํฐ์ ํฌ๋งท์ด๋ ์๋ฏธ๋ฅผ ์ ์ํ๋ ๋ฉํ ๋ฐ์ดํฐ๊ฐ ์๋ค.
comments
String[]
null
๋ฌธ์์ด ๋ฐฐ์ด์ ํ์ผ์ ํ์ฑํ ๋ ๊ฑด๋๋ฐ์ด์ผํ ์ฃผ์ ์ค์ ๋ํ๋ด๋ ์ ๋์ด ์ง์
encoding
String
ํ๋ซํผ์ ๊ธฐ๋ณธ Charset
ํ์ผ์ ์ฌ์ฉ๋ ๋ฌธ์์ด ์ธ์ฝ๋ฉ
lineMapper
LineMapper
null(ํ์)
ํ์ผ ํ์ค์ String์ผ๋ก ์ฝ์ ๋ค ์ฒ๋ฆฌ ๋์์ธ ๋๋ฉ์ธ ๊ฐ์ฒด(Item)์ผ๋ก ๋ณํ
DefaultLineMapper
JsonLineMapper
PassThroughLineMapper
lineToSkip
int
0
ํ์ผ์ ์ฝ์ด์ฌ ๋ ๋ช ์ค์ ๊ฑด๋๋๊ณ ์์ํ ์ง ์ง์
recordSeparatorPolicy
RecordSeparatorPolicy
DefaultRecordSeparatorPolicy
๊ฐ ์ค์ ๋ง์ง๋ง์ ์ ์ํ๋๋ฐ ์ฌ์ฉ ๋ณ๋๋ก ์ง์ ํ์ง ์์ผ๋ฉด ๊ฐํ ๋ฌธ์๊ฐ ๋ ์ฝ๋์ ๋ ๋ถ๋ถ์ ๋ํ๋ธ๋ค.
resource
Resource
null(ํ์)
์ฝ์ ๋์ ๋ฆฌ์์ค
skippedLinesCallback
LineCallbackHandler
null
์ค์ ๊ฑด๋๋ธ ๋ ํธ์ถ๋๋ ์ฝ๋ฐฑ ์ธํฐํ์ด์ค ๊ฑด๋๋ ๋ชจ๋ ์ค์ ์ด ์ฝ๋ฐฑ์ด ํธ์ถ๋๋ค.
strict
boolean
false
true๋ก ์ง์ ์, ๋ฆฌ์์ค๋ฅผ ์ฐพ์ ์ ์๋ ๊ฒฝ์ฐ Exception์ ๋์ง๋ค.
saveState
boolean
true
true : ์ฌ์์ ๊ฐ๋ฅํ๋๋ก ๊ฐ ์ฒญํฌ ์ฒ๋ฆฌ ํ ItemReader ์ํ ์ ์ฅ
false : ๋ค์ค ์ค๋ ๋ ํ๊ฒฝ์์ false ์ง์
๊ณ ์ ๋ ๋๋น ํ์ผ
๊ตฌ๋ถ์ ํ์ผ
FieldSetMapper ์ปค์คํ
org.springframework.batch.item.file.mapping.FieldSetMapper๋ฅผ ๊ตฌํํ์ฌ ์ปค์คํ
๋งคํผ๋ฅผ ๋ง๋ค ์ ์๋ค.
.fieldSetMapper()์ ์ปค์คํ
๋งคํผ๋ฅผ ์ง์ ํ๋ฉด ๋๋ค.
LineTokenizer ์ปค์คํ
org.springframework.batch.item.file.transform.LineTokenizer
LineMapper
org.springframework.batch.item.file.mapping.PatternMatchingCompositeLineMapper์ฌ๋ฌ๊ฐ์
LineTokenizer๋ก ๊ตฌ์ฑ๋ Map์ ์ ์ธํ ์ ์์.PatternMatcher<LineTokenizer> tokenizers
๊ฐ
LineTokenizer๋ฅผ ํ์๋ก ํ๋ ์ฌ๋ฌ๊ฐ์FieldSetMapperMap ์ ์ธํ ์ ์์.PatternMatcher<FieldSetMapper<T>> patternMatcher
์ฌ๋ฌ ํ์์ผ๋ก ๊ตฌ์ฑ๋ csv ํ์ผ์ด๋ค.
TRANS๋ก ์์ํ๋ ๊ฒฝ์ฐ์ CUST๋ก ์์ํ๋ ๊ฒฝ์ฐ ๊ฐ๊ฐ FieldSetMapper, LineTokenizer๋ฅผ ์ฌ์ฉํด ํ์ฑ ๋ฐ set์ ํ ์ ์๋ค.
ItemStreamReader ์ปค์คํ
๋๊ฐ์ ๋ค๋ฅธ ํฌ๋งท์ ๋ฐ์ดํฐ๊ฐ ์ฌ์ค์ ์๋ก ์ฐ๊ด์ด ์๋ ๋ฐ์ดํฐ์ผ ์ ์๋ค. ๊ทธ ๊ฒฝ์ฐ์๋ ํ๊ฐ์ ๋๋ฉ์ธ์ด ๋ค๋ฅธ ํ๊ฐ์ ๋๋ฉ์ธ์ ๋ด์ฉ์ ํฌํจํ๊ณ ์์ ์ ์๋ค.
๊ฑฐ๋๋ด์ญ(TRANS) ๋ฐ์ดํฐ๋ ๊ทธ ์์ ๊ณ ๊ฐ(CUST)์ ๊ณ์ฝ ์ ๋ณด๋ผ๊ณ ๊ฐ์ ํด๋ณผ ๊ฒ์ด๋ค.
Custom ๋๋ฉ์ธ ๊ฐ์ฒด์ Transaction ๊ฑฐ๋๋ด์ญ ์ ๋ณด๋ฅผ ํฌํจํ๊ฒ ๋ณ๊ฒฝํด์ค๋ค.
์ฌ๊ธฐ์ ํต์ฌ์ read() ๋ฉ์๋์ด๋ค. ํ์ค์ฉ ์ฝ์ด์ฌ ๋ ๋ค์ ๊ณ ๊ฐ์ ๋ณด๊ฐ ๋์ฌ๋๊น์ง ๊ฑฐ๋๋ด์ญ ๋ ์ฝ๋๋ฅผ ์ฝ์ด ํด๋น ๊ณ ๊ฐ์ด ๊ฐ์ง๊ณ ์๊ฒ ํ๋ค.
Job์์ itemReader๋ถ๋ถ์ ์์์ ์์ฑํ CustomerFileReader๋ฅผ ์ค์ ํด์ฃผ๋ฉด ๋๋ค.
๋ค์๊ณผ ๊ฐ์ด ๊ณ ๊ฐ์ด ๊ฐ์ง๊ณ ์๋ ๊ฑฐ๋๋ด์ญ์ ์ถ๋ ฅํ ์ ์๋ค.
MultiResourceItemReader
๋์ผํ ํฌ๋งท์ผ๋ก ์์ฑ๋ ์ฌ๋ฌ๊ฐ์ ํ์ผ์ ์ฝ์ด๋ค์ด๋ ItemReader๋ฅผ ์ ๊ณตํ๋ค.
org.springframework.batch.item.file.MultiResourceItemReader
MultiResourceItemReader๋ ์ฝ์ด์ผํ ํ์ผ๋ช
์ ํจํด์ MultiResourceItemReader์ ์์กด์ฑ์ผ๋ก ์ ์ํ๋ค.
์์์ ๋ค๋ฃฌ ItemStreamReader ์ ๋ค๋ฅธ ์ ์ Resource ์ฃผ์
๋ถ๋ถ์ด๋ค. Resource๋ฅผ ์ฃผ์
ํ๊ฒ ๋๋ฉด ํ์ํ ๊ฐ ํ์ผ์ ์คํ๋ง ๋ฐฐ์น๊ฐ ์์ฑํด ItemReader์ ์ฃผ์
ํ ์ ์๋ค.
์ฝ์ด์ผํ ํ์ผ ๋ชฉ๋ก(resources)์ ์ค์ ํด์ฃผ๊ณ , delegate()์ ์ค์ ๋ก ์์
์ ์ํํ ์์ ์ปดํฌ๋ํธ๋ฅผ ์ง์ ํด์ฃผ๋ฉด๋๋ค.
์ฌ๋ฌ ๊ฐ์ ํ์ผ์ ๋ค๋ฃฐ๋๋ ์ฌ์์์ ํ๊ฒ๋๋ ์ํฉ์์ ์คํ๋ง๋ฐฐ์น๊ฐ ์ถ๊ฐ์ ์ธ ์์ ์ฅ์น๋ฅผ ์ ๊ณตํด์ฃผ์ง ์๋๋ค. ์๋ฅผ๋ค์ด file1.csv, file2.csv, file3.csv๊ฐ ์๋๋ฐ, file2.csv ์ฒ๋ฆฌํ๋ ๊ณผ์ ์์ ์ค๋ฅ๊ฐ ๋ฐ์ํ์ฌ ์ก์ด ์คํจ ๋ ์ดํ ์ฌ์์์ ํ ๋ file4.csv๋ฅผ ์ถ๊ฐํ๋ค๋ฉด, ์ต์ด ์คํ์ file4.csv๊ฐ ์์์์๋ ๋ถ๊ตฌํ๊ณ , ํฌํจํ์ฌ ์คํํ๋ค.
์ด๋ฌํ ๋ฌธ์ ์ ์ ํด๊ฒฐํ๊ธฐ ์ํด์ ๋ฐฐ์น ์คํ ์ ์ฌ์ฉํ ๋๋ ํฐ๋ฆฌ๋ฅผ ๋ณ๋๋ก ์์ฑํ๋ ๊ฒ์ด ์ผ๋ฐ์ ์ด๋ฉฐ, ์๋ก ์์ฑ๋ ๋ชจ๋ ํ์ผ์ ์๋ก์ด ๋๋ ํฐ๋ฆฌ์ ๋ฃ์ด์ฃผ์ด ํ์ฌ ์ํ์ค์ธ ์ก์ ์ํฅ์ ์ฃผ์ง์๊ฒ ํ ์ ์๋ค.
XML
XML์ ํ์ผ ๋ด ๋ฐ์ดํฐ๋ฅผ ์ค๋ช ํ ์ ์๋ ํ๊ทธ๋ฅผ ์ฌ์ฉํด ํ์ผ์ ํฌํจ๋ ๋ฐ์ดํฐ๋ฅผ ์ค๋ช ํ๋ฏ๋ก, Flat file๊ณผ๋ ๋ค๋ฅด๋ค.
XML parser๋ก ์ฃผ๋ก DOM๊ณผ SAX๋ฅผ ๋ง์ด ์ฌ์ฉํ๋ค.
Dom vs SAX vs StAX
์ฐธ๊ณ : https://gohlab2017.tistory.com/3
DOM(Document Object Model) ๋ฐฉ์
XML๋ฌธ์ ์ ์ฒด๋ฅผ ๋ฉ๋ชจ๋ฆฌ์ ๋ก๋ํ์ฌ ๊ฐ์ ์ฝ๋๋ค.
XML๋ฌธ์๋ฅผ ์ฝ์ผ๋ฉด ๋ชจ๋ Element, Text, Attribute ๋ฑ์ ๋ํ ๊ฐ์ฒด๋ฅผ ์์ฑํ๊ณ , ์ด๋ฅผ Document ๊ฐ์ฒด๋ก ๋ฆฌํดํ๋ค.
Document ๊ฐ์ฒด๋ DOM API์ ์๋ง๋ ํธ๋ฆฌ ๊ตฌ์กฐ์ ์๋ฐ ๊ฐ์ฒด๋ก ํํ๋์ด ์๋ค.
XML๋ฌธ์๊ฐ ๋ฉ๋ชจ๋ฆฌ์ ๋ชจ๋ ์ฌ๋ผ๊ฐ ์์ด์ ๋ ธ๋๋ค์ ๊ฒ์, ์์ , ๊ตฌ์กฐ๋ณ๊ฒฝ์ด ๋น ๋ฅด๊ณ ์ฉ์ดํ๋ค.
SAX ๋ฐฉ์ ๋ณด๋ค ์ง๊ด์ ์ด๋ฉฐ ํ์ฑ์ด ๋จ์ํ๊ธฐ ๋๋ฌธ์ ์ผ๋ฐ์ ์ผ๋ก DOM ๋ฐฉ์์ ์ฑํํ์ฌ ๊ฐ๋ฐํ๊ฒ ๋๋ค.
SAX(Simple API for XML) ๋ฐฉ์
SAX ๋ฐฉ์์ XML ๋ฌธ์๋ฅผ ํ๋์ ๊ธด ๋ฌธ์์ด๋ก ๊ฐ์ฃผํ๋ค.
XML๋ฌธ์๋ฅผ ์์์ ๋ถํฐ ์์ฐจ์ ์ผ๋ก ์ฝ์ด๊ฐ๋ฉด์ ๋ ธ๋๊ฐ ์ด๋ฆฌ๊ณ ๋ซํ๋ ๊ณผ์ ์์ ์ด๋ฒคํธ๊ฐ ๋ฐ์ํ๋ค.
๊ฐ๊ฐ์ ์ด๋ฒคํธ๊ฐ ๋ฐ์๋ ๋๋ง๋ค ์ํํ๊ณ ์ ํ๋ ๊ธฐ๋ฅ์ ์ด๋ฒคํธ ํธ๋ค๋ฌ ๊ธฐ์ ์ ์ด์ฉํ์ฌ ๊ตฌํํ๋ค.
XML๋ฌธ์๋ฅผ ๋ฉ๋ชจ๋ฆฌ์ ์ ๋ถ ๋ก๋ฉํ๊ณ ํ์ฑํ๋ ๊ฒ์ด ์๋๊ธฐ ๋๋ฌธ์ ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ๋์ด ์ ๊ณ ๋จ์ํ ์ฝ๊ธฐ๋ง ํ ๋ ์๋๊ฐ ๋น ๋ฅด๋ค.
๋ฐ์ํ ์ด๋ฒคํธ๋ฅผ ํธ๋ค๋งํ์ฌ ๋ณ์์ ์ ์ฅํ๊ณ ํ์ฉํ๋ ๊ฒ์ด๊ธฐ ๋๋ฌธ์ ๋ณต์กํ๊ณ ๋ ธ๋ ์์ ์ด์ด๋ ต๋ค.
XML ์ค๋ธ์ ํธ์ Random Access๋ฅผ ํ์ง ๋ชปํด, ์ง๋ ์๋ฆฌ๋จผํธ๋ฅผ ์ฐธ์กฐํ ๊ฒฝ์ฐ ๋ค์ ์ฒ์๋ถํฐ ์ฝ์ด์ผํ๋ค.
StAX(Streaming API for XML)
StAX๋ push ์ pull ๋ฐฉ์์ ๋์์ ์ ๊ณตํ๋ ํ์ด๋ธ๋ฆฌ๋ํ ํํ
XML ๋ฌธ์๋ฅผ ํ์ฑํ ๋ ํ๋์ Fragment๋ก ๊ตฌ๋ถ
์ ํด์ง ์๋ฆฌ๋จผํธ๋ฅผ ์ฝ์๋๋ DOM ๋ฐฉ์์ ์ฌ์ฉํ๋ฉฐ, Fragement๋ก ์ฒ๋ฆฌํ๋ ๊ฒ์ SAX์ Push ๋ฐฉ์์ ์ฌ์ฉ
์ฆ, ๊ฐ ์ธ์ ์ ๋ ๋ฆฝ์ ์ผ๋ก ํ์ฑํ๋ ๊ธฐ๋ฅ์ ์ ๊ณต
์คํ๋ง ๋ฐฐ์น์์๋ StAX ํ์๋ฅผ ์ฌ์ฉํ๋ค.
StaxEventItemReader
org.springframework.batch.item.xml.StaxEventItemReader
์ ์์ ํ์ผ์ ํ์ฑํ๋ Reader๋ฅผ ๊ตฌํํด๋ณผ๊ฒ์ด๋ค.
.addFragmentRootElements():StaxEventItemReader๋ฅผ ์ฌ์ฉํ๋ ค๋ฉด XML ํ๋ํฌ๋จผํธ ๋ฃจํธ ์๋ฆฌ๋จผํธ๋ฅผ ์ง์ XML๋ด์์ Item์ผ๋ก ์ทจ๊ธํ fragment์ root ์๋ฆฌ๋จผํธ๋ฅผ ์๋ณํ๋๋ฐ ์ฌ์ฉ.unmarshaller():org.springframework.oxm.Unmarshaller๊ตฌํ์ฒด๋ฅผ ์ ๋ฌ ๋ฐ์ผ๋ฉฐ, XML์ ๋๋ฉ์ธ ๊ฐ์ฒด๋ก ๋ฐํ
์ด๋ฒ ์์ ์์๋ org.springframework.oxm.jaxb.Jaxb2Marshaller๋ฅผ ์ฌ์ฉํ์ผ๋ฉฐ, Jaxb2Marshaller๋ฅผ ์ฌ์ฉํ๊ธฐ ์ํด์๋ ์์กด์ฑ ์ถ๊ฐ๊ฐ ํ์ํ๋ค.
build.gradle
JAXB ์์กด์ฑ๊ณผ Spring OXM ๋ชจ๋๋ก JAXB๋ฅผ ์ฌ์ฉํ๋ ์คํ๋ง ์ปดํฌ๋ํธ ์์กด์ฑ์ ์ถ๊ฐํด์ค๋ค.
XML์ ํ์ฑํ ์ ์๊ฒ ํ๋ ค๋ฉด ๋๋งค์ธ ๊ฐ์ฒด์ JAXB ์ด๋ ธํ ์ด์ ์ ์ถ๊ฐํด์ค ๊ฒ์ด๋ค.
๋๋ฉ์ธ ๊ฐ์ฒด ์ค์ ์ด ๋๋ฌ์ผ๋ฉด, ๊ฐ ๋ธ๋ก์ ํ์ฑํ๋๋ฐ ์ฌ์ฉํ Unmarshaller๋ฅผ ๊ตฌํํด์ฃผ๋ฉด ๋๋ค.
JSON
JsonItemReader
org.springframework.batch.item.json.JsonItemReader์ฒญํฌ๋ฅผ ์ฝ์ด ๊ฐ์ฒด๋ก ํ์ฑํ๋ค.
์ค์ ํ์ฑ ์์ ์
JsonObjectReader์ธํฐํ์ด์ค ๊ตฌํ์ฒด์ ์์ํ๋ค.
JsonObjectReader
์ค์ ๋ก JSON ๊ฐ์ฒด๋ฅผ ํ์ฑํ๋ ์ญํ ์ ํ๋ค. ์คํ๋ง ๋ฐฐ์น๋ 2๊ฐ์ JsonObjectReader๋ฅผ ์ ๊ณตํด์ค๋ค.
Jackson
Gson
์ ๊ตฌ์กฐ๋ก๋์ด์๋ JSON์ ํ์ฑํด ๋ณผ๊ฒ์ด๋ค.
ObjectMapper๋ Jackson์ด JSON์ ์ฝ๊ณ ์ฐ๋๋ฐ ์ฌ์ฉํ๋ ์ฃผ์ ํด๋์ค๋ก ์ปค์คํ ๋ฐ์ดํฐ ํฌ๋งท๋ค์ ์ค์ ํ๋ฉด๋๋ค.JacksonJsonObjectReader์์ฑ์ ๋ฐํํ ํด๋์ค๋ฅผ ์ค์ ํ๊ณ , ์ปค์คํ ํObjectMapper๋ฅผ ์ค์ ํด์ฃผ๋ฉด๋๋ค.JsonItemReaderBuilder๋ ํ์ฑ์ ์ฌ์ฉํJsonObjectReader๋ฅผ ์ค์ ํด์ฃผ๋ฉด๋๋ค.
Database Reader
Cursor๋ ํ์ค java.sql.ResultSet์ผ๋ก ๊ตฌํ๋๋ฉฐ, ResultSet์ด open๋๋ฉด next() ๋ฉ์๋๋ฅผ ํธ์ถํ ๋๋ง๋ค ๋ฐ์ดํฐ๋ฒ ์ด์ค์์ ๋ฐฐ์น ๋ ์ฝ๋๋ฅผ ๊ฐ์ ธ์ ๋ฐํํ๋ค.
์ฆ, Cursor ๋ฐฉ์์ DB์ ์ปค๋ฅ์ ์ ๋งบ์ ํ, Cursor๋ฅผ ํ์นธ์ฉ ์ฎ๊ธฐ๋ฉด์ ์ง์์ ์ผ๋ก ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์จ๋ค.
(CursorItemReader๋ streaming์ผ๋ก ๋ฐ์ดํฐ๋ฅผ ์ฒ๋ฆฌ)
Cursor๋ ํ๋์ Connection์ผ๋ก Batch๊ฐ ๋๋ ๋๊ฐ์ง ์ฌ์ฉ๋๊ธฐ ๋๋ฌธ์ Batch๊ฐ ๋๋๊ธฐ์ ์ DB์ ์ดํ๋ฆฌ์ผ์ด์
Connection์ด ๋์ด์ง ์ ์์ผ๋ฏ๋ก, DB์ SocketTimeout์ ์ถฉ๋ถํ ํฐ ๊ฐ์ผ๋ก ์ค์ ํด์ผํ๋ค. (๋คํธ์ํฌ ์ค๋ฒํค๋ ์ถ๊ฐ) ์ถ๊ฐ๋ก ResultSet์ ์ค๋ ๋ ์์ ์ด ๋ณด์ฅ๋์ง ์์ ๋ค์ค ์ค๋ ๋ ํ๊ฒฝ์์๋ ์ฌ์ฉํ ์ ์๋ค.
JdbcCursorItemReader
HibernateCursorItemReader
StoredProcedureItemReader
Paging ๋ฐฉ์์ ํ๋ฒ์ ์ง์ ํ PageSize๋งํผ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์จ๋ค.
SpringBatch์์ offset๊ณผ limit์ PageSize์ ๋ง๊ฒ ์๋์ผ๋ก ์์ฑํด์ค๋ค. ๋ค๋ง ๊ฐ ์ฟผ๋ฆฌ๋ ๊ฐ๋ณ์ ์ผ๋ก ์คํ๋๋ฏ๋ก, ํ์ด์ง์ ๊ฒฐ๊ณผ๋ฅผ ์ ๋ ฌ(order by)ํ๋ ๊ฒ์ด ์ค์ํ๋ค.
Batch ์ํ์๊ฐ์ด ์ค๋ ๊ฑธ๋ฆฌ๋ ๊ฒฝ์ฐ์๋ PagingItemReader๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด ์ข๋ค. Paging์ ๊ฒฝ์ฐ ํ ํ์ด์ง๋ฅผ ์ฝ์๋๋ง๋ค Connection์ ๋งบ๊ณ ๋๊ธฐ ๋๋ฌธ์ ์๋ฌด๋ฆฌ ๋ง์ ๋ฐ์ดํฐ๋ผ๋ ํ์์์๊ณผ ๋ถํ ์์ด ์ํ๋ ์ ์๋ค.
JdbcPagingItemReader
HibernatePagingItemReader
JpaPagingItemReader
JDBC
JdbcCursorItemReader
<T, T> chunk(int chunkSize): ์ฒซ๋ฒ์งธ T๋ Reader์์ ๋ฐํํ ํ์ , ๋๋ฒ์งธ T๋ Writer์ ํ๋ผ๋ฏธํฐ๋ก ๋์ด์ฌ ํ์ ์ด๋ค.fetchSize : DB์์ ํ๋ฒ์ ๊ฐ์ ธ์ฌ ๋ฐ์ดํฐ ์์ ๋ํ๋ธ๋ค. Paging์ ์ค์ ์ฟผ๋ฆฌ๋ฅผ limit, offset์ผ๋ก ๋ถํ ์ฒ๋ฆฌํ๋ ๋ฐ๋ฉด, Cursor๋ ๋ถํ ์ฒ๋ฆฌ์์ด ์คํ๋๋ ๋ด๋ถ์ ์ผ๋ก ๊ฐ์ ธ์จ๋ ๋ฐ์ดํฐ๋ FetchSize๋งํผ ๊ฐ์ ธ์
read()๋ฅผ ํตํด์ ํ๋์ฉ ๊ฐ์ ธ์จ๋ค.dataSource : DB์ ์ ๊ทผํ๊ธฐ ์ํด ์ฌ์ฉํ DataSource๊ฐ์ฒด
rowMapper : ์ฟผ๋ฆฌ ๊ฒฐ๊ณผ๋ฅผ ์ธ์คํด์ค๋ก ๋งคํํ๊ธฐ ์ํ ๋งคํผ
BeanPropertyRowMapper๋ฅผ ์ฌ์ฉํด ๋๋ฉ์ธ ๊ฐ์ฒด์ ๋งคํํด์ค๋ค.
sql : Reader์์ ์ฌ์ฉํ ์ฟผ๋ฆฌ๋ฌธ
preparedStatementSetter: SQL๋ฌธ์ ํ๋ผ๋ฏธํฐ ์ค์
name : Reader์ ์ด๋ฆ, ExecutionContext์ ์ ์ฅ๋์ด์ง ์ด๋ฆ
JdbcPagingItemReader
PagingItemReader๋ PagingQueryProvider๋ฅผ ํตํด ์ฟผ๋ฆฌ๋ฅผ ์์ฑํ๋ค. ์ด๋ ๊ฒ ์์ฑํ๋ ์ด์ ๋ ๊ฐ DB์๋ Paging์ ์ง์ํ๋ ์์ฒด์ ์ธ ์ ๋ต์ด ์์ผ๋ฉฐ, Spring์ ๊ฐ DB์ Paging ์ ๋ต์ ๋ง์ถฐ ๊ตฌํ๋์ด์ผ๋ง ํ๋ค.
Spring Batch์์๋ SqlPagingQueryProviderFactoryBean์ ํตํด DataSource ์ค์ ๊ฐ์ ๋ณด๊ณ , ์ Provider์ค ํ๋๋ฅผ ์๋ ์ ํํ๋๋ก ํ๋ค.
SpringBatch์์ offset๊ณผ limit์ PageSize์ ๋ง๊ฒ ์๋์ผ๋ก ์์ฑํด์ค๋ค. ๋ค๋ง ๊ฐ ์ฟผ๋ฆฌ๋ ๊ฐ๋ณ์ ์ผ๋ก ์คํ๋๋ฏ๋ก, ๋์ผํ ๋ ์ฝ๋ ์ ๋ ฌ ์์๋ฅผ ๋ณด์ฅํ๋ ค๋ฉด ํ์ด์ง์ ๊ฒฐ๊ณผ๋ฅผ ์ ๋ ฌ(order by)ํ๋ ๊ฒ์ด ์ค์ํ๋ค.
๋ํ, ์ด ์ ๋ ฌํค๊ฐ ResultSet ๋ด์์ ์ค๋ณต๋์ง ์์์ผํ๋ค.
์คํ๋ ์ฟผ๋ฆฌ ๋ก๊ทธ๋ฅผ ๋ณด๋ฉด Paging Size์ธ LIMIT 10์ด ๋ค์ด๊ฐ ๊ฒ์ ๋ณผ ์ ์๋ค.
Hibernate
์๋ฐ ORM ๊ธฐ์ ๋ก, ์ ํ๋ฆฌ์ผ์ด์ ์์ ์ฌ์ฉํ๋ ๊ฐ์ฒด ์งํฅ ๋ชจ๋ธ์ ๊ด๊ณํ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ก ๋งคํํ๋ ๊ธฐ๋ฅ์ ์ ๊ณต
XML or Annotation์ ์ฌ์ฉํด ๊ฐ์ฒด๋ฅผ ๋ฐ์ดํฐ๋ฒ ์ด์ค ํ ์ด๋ธ๋ก ๋งคํ
๊ฐ์ฒด๋ฅผ ์ฌ์ฉํด ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ง์ํ๋ ํ๋ ์์ํฌ๋ฅผ ์ ๊ณต
Hibernate ์ธ์ ๊ตฌํ์ฒด์ ๋ฐ๋ผ์ ๋ค๋ฅด๊ฒ ์๋ํ๋ค.
๋ณ๋ ์ค์ ์์ด Hibernate๋ฅผ ์ฌ์ฉํ๋ฉด ์ผ๋ฐ์ ์ธ stateful ์ธ์ ๊ตฌํ์ฒด๋ฅผ ์ฌ์ฉ
์๋ฅผ ๋ค์ด ๋ฐฑ๋ง๊ฑด์ ์์ดํ ์ ์ฝ๊ณ ์ฒ๋ฆฌํ๋ค๋ฉด Hibernate ์ธ์ ์ด ๋ฐ์ดํฐ๋ฒ ์ด์ค์์ ์กฐํํ ๋ ์์ดํ ์ ์บ์์ ์์ผ๋ฉฐ OutOfMemoryException์ด ๋ฐ์
Persistence๋ก ์ฌ์ฉํ๋ฉด, ์ง์ JDBC๋ฅผ ์ฌ์ฉํ ๋๋ณด๋ค ๋ ํฐ ๋ถํ๋ฅผ ์ ๋ฐ
๋ ์ฝ๋ ๋ฐฑ๋ง ๊ฑด์ ์ฒ๋ฆฌํ ๋๋ ํ๊ฑด๋น ms ๋จ์์ ์ฐจ์ด๋ ๊ฑฐ๋ํ ์ฐจ์ด๊ฐ ๋๋ค.
์คํ๋ง ๋ฐฐ์น๋ ์ด๋ฌํ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋๋ก
HibernateCursorItemReader,HibernatePagingItemReader๋ฅผ ๊ฐ๋ฐ์ปค๋ฐ์ ์ธ์ ์ flushํ๋ฉฐ ๋ฐฐ์น ์ฒ๋ฆฌ์ ๊ด๊ณ๊ฐ ์๋ ์ถ๊ฐ ๊ธฐ๋ฅ์ ์ ๊ณตํด์ค๋ค.
build.gradle ์์กด์ฑ ์ถ๊ฐ
Domain ๊ฐ์ฒด ์์
@Entity
๋งคํํ ๊ฐ์ฒด๊ฐ Entity์์ ๋ํ๋
@Table
Entity๊ฐ ๋งคํ๋๋ ํ ์ด๋ธ ์ง์
@Id
PK๊ฐ ์ง์
TransactionManager ์ปค์คํ
ํ์ด๋ฒ๋ค์ดํธ ์ธ์
๊ณผ Datasource๋ฅผ ํฉ์น TransactionManager๊ฐ ํ์ํ๋ค.
BatchConfigurer์ ์ปค์คํ
๊ตฌํ์ฒด๋ฅผ ์ฌ์ฉํด HibernateTransactionManager๋ฅผ ๊ตฌ์ฑํ๋ค.
HibernateCursorItemReader
ํ์ด๋ฒ๋ค์ดํธ ์ฟผ๋ฆฌ๋ฅผ ์ํํ๋ ๋ฐฉ๋ฒ์ 4๊ฐ์ง๊ฐ ์กด์ฌํ๋ค.
queryName
String
ํ์ด๋ฒ๋ค์ดํธ ๊ตฌ์ฑ์ ํฌํจ๋ ๋ค์๋ ํ์ด๋ฒ๋ค์ดํธ ์ฟผ๋ฆฌ ์ฐธ์กฐ
https://www.baeldung.com/hibernate-named-query
queryString
String
์คํ๋ง ๊ตฌ์ฑ์ ์ถ๊ฐํ๋ HQL ์ฟผ๋ฆฌ
.queryString("from Customer where city = :city")
queryProvider
HibernateQueryProvider
ํ์ด๋ฒ๋ค์ดํธ ์ฟผ๋ฆฌ(HQL)๋ฅผ ํ๋ก๊ทธ๋๋ฐ์ผ๋ก ๋น๋
nativeQuery
String
๋ค์ดํฐ๋ธ SQL ์ฟผ๋ฆฌ๋ฅผ ์คํํ ๋ค ๊ฒฐ๊ณผ๋ฅผ ํ์ด๋ฒ๋ค์ดํธ๋ก ๋งคํํ๋๋ฐ ์ฌ์ฉ
https://data-make.tistory.com/616
HibernatePagingItemReader
Cursor ๋ฐฉ๋ฒ๊ณผ ์ ์ผํ๊ฒ ๋ค๋ฅธ ์ ์ .pageSize()๋ก ์ฌ์ฉํ ํ์ด์ง ํฌ๊ธฐ๋ฅผ ์ง์ ํด์ผํ๋ ๊ฒ์ด๋ค.
JPA
JPA(Java Persisstence API)๋ ORM ์์ญ์์ ํ์คํ๋ ์ ๊ทผ๋ฒ์ ์ ๊ณตํ๋ค. Hibernate๊ฐ ์ด๊ธฐ JPA์ ์๊ฐ์ ์คฌ์ผ๋ฉฐ, ํ์ฌ๋ Hibernate๊ฐ JPA ๋ช ์ธ๋ฅผ ๊ตฌํํ๊ณ ์๋ค.
build.gradle ์์กด์ฑ ์ถ๊ฐ
spring-boot-starter-data-jpa๋ JPA๋ฅผ ์ฌ์ฉํ๋๋ฐ ํ์ํ ๋ชจ๋ ํ์ ์ปดํฌ๋ํธ๊ฐ ํฌํจ๋ผ์๋ค.
JpaCursorItemReader
Spring Batch 4.3์ด ๋ฆด๋ฆฌ์ฆ ๋๋ฉด์ JpaCursorItemReader ๊ฐ ๋์ ๋์๋ค. ์ด์ ๋ฒ์ ๊น์ง๋ ์ ๊ณตํ์ง ์์๋ค.
JpaPagingItemReader
.entityManagerFactory๋ฅผ ์ค์ ํ๋ ๊ฒ ์ด์ธ์ Jdbc์ ํฌ๊ฒ ๋ค๋ฅธ ์ ์ ์์ผ๋ฉฐ, Cursor์ ๋ค๋ฅธ์ ์ pageSize()๋ฅผ ์ค์ ํ๋ ๊ฒ์ด๋ค.
JPA์์๋ .queryProvider()๋ก Query ๊ฐ์ฒด๋ฅผ ์ฌ์ฉํด ์ฟผ๋ฆฌ๋ฅผ ์ํํ ์๋ ์๋ค.
MyBatisPagingItemReader
Spring Data Repository
Spring Data๋ ์คํ๋ง ๋ฐ์ดํฐ๊ฐ ์ ๊ณตํ๋ ํน์ ์ธํฐํ์ด์ค ์ค ํ๋๋ฅผ ์์ํ๋ ์ธํฐํ์ด์ค๋ฅผ ์ฌ์ฉ์๊ฐ ์ ์ํ๊ธฐ๋ง ํ๋ฉด ์คํ๋ง ๋ฐ์ดํฐ๊ฐ ํด๋น ์ธํฐํ์ด์ค์ ๊ตฌํ์ ์ฒ๋ฆฌํ๋ ๊ธฐ๋ฅ์ ์ ๊ณตํ๋ค.
์คํ๋ง ๋ฐฐ์น๋ ์คํ๋ง ๋ฐ์ดํฐ์ PagingAndSotringRepository๋ฅผ ํ์ฉํ๊ธฐ ๋๋ฌธ์, ์คํ๋ง ๋ฐ์ดํฐ์ ํธํ์ฑ์ด ์ข๋ค.
RepositoryItemReader
RepositoryItemReader๋ JdbcPagingItemReader ๋ HibernatePagingItemReader๋ฅผ ์ฌ์ฉํ ๋์ ๋์ผํ๊ฒ PagingAndSotringRepository๋ฅผ ์ฌ์ฉํด์ Paging ์ฟผ๋ฆฌ๋ฅผ ์คํํ๋ค.
RepositoryItemReader๋ ์ด๋ค ์ ์ฅ์๊ฑด ์๊ด์์ด ํด๋น ๋ฐ์ดํฐ ์ ์ฅ์์ ์ง์๋ฅผ ์ํํ ์ ์๋ค๋ ์ ์์ ItemReader์ ์ฐจ์ด๊ฐ ์๋ค.
PagingAndSotringRepository๋ฅผ ์์ํ๋ Repository๋ฅผ ์์ฑํด city ์กฐ๊ฑด์ผ๋ก ์กฐํํ๋ ๋ฉ์๋๋ฅผ ์ ์ํ์๋ค.
์ฃผ์ ์ฌํญ
JpaRepository๋ฅผListItemReader,QueueItemReader์ ์ฌ์ฉํ๋ฉด ์๋๋ค.์ด๋ ๊ฒ ๊ตฌํํ๋ ๊ฒฝ์ฐ Spring Batch์ ์ฅ์ ์ธ Paging & Cursor ๊ตฌํ์ด ์์ด ๋๊ท๋ชจ ๋ฐ์ดํฐ ์ฒ๋ฆฌ๊ฐ ๋ถ๊ฐ๋ฅํ๋ค.
JpaRepository๋ฅผ ์ฌ์ฉํด์ผํ๋ ๊ฒฝ์ฐRepositoryItemReader๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ ๊ถ์ฅํ๋ค.
Hibernate, JPA๋ฑ ์์์ฑ ์ปจํ ์คํธ๊ฐ ํ์ํ Reader ์ฌ์ฉ์ fetch size์ chunk size๋ ๋์ผํ ๊ฐ์ ์ ์งํด์ผ ํ๋ค.
ItemReaderAdapter
Adapter๋ ๋ค๋ฅธ ์๋ฆฌ๋ฉํธ์ ๋ํํ์ฌ ์คํ๋ง ๋ฐฐ์น๊ฐ ํด๋น ์๋ฆฌ๋จผํธ์ ํต์ ํ ์ ์๊ฒ ํ๋๋ฐ ์ฌ์ฉํ๋ค.
org.springframework.batch.item.adapter.ItemReaderAdapter
ํธ์ถ ๋์ ์๋น์ค์ ์ฐธ์กฐ์ ํธ์ถํ ๋ฉ์๋์ ์ด๋ฆ์ ์์กด์ฑ์ผ๋ก ๋ฐ๋๋ค.
ItemReaderAdapter๊ฐ ๋งค๋ฒ ํธ์ถํ ๋๋ง๋ค ๋ฐํ๋๋ ๊ฐ์ฒด๋ItemReader๊ฐ ๋ฐํํ๋ ๊ฐ์ฒด์ด๋ค.์ ๋ ฅ ๋ฐ์ดํฐ๋ฅผ ๋ชจ๋ ์ฒ๋ฆฌํ๋ฉด ์๋น์ค ๋ฉ์๋๋ ๋ฐ๋์
null์ ๋ฐํํด์ผํ๋ค. ์คํ๋ง ๋ฐฐ์น์๊ฒ ํด๋น step์ ์ ๋ ฅ์ ๋ชจ๋ ์๋ฃํ์์ ์๋ฆฌ๋ ๊ฒ์ด๋ค.
Customer ๊ฐ์ฒด์ ๋ชฉ๋ก์ ๋ฌด์์๋ก ์์ฑํ๋ ์๋น์ค์ด๋ค.
ItemReaderAdapter์ ๊ธฐ์กด ์๋น์ค ์ค๋ธ์ ํธ์ ๋ฉ์๋๋ช
์ ์ ๋ฌํ๋ฉด๋๋ค.
์ค๋ฅ ์ฒ๋ฆฌ
์ ๋ ฅ์์ ๋ ์ฝ๋๋ฅผ ์ฝ๋ ์ค์ ์ค๋ฅ๊ฐ ๋ฐ์ํ ๊ฒฝ์ฐ ์ฒ๋ฆฌํ ์ ์๋ ๋ฐฉ๋ฒ์ ์ฌ๋ฌ๊ฐ์ง์ด๋ค.
์์ธ๋ฅผ ๋์ณ ์ฒ๋ฆฌ๋ฅผ ๋ฉ์ถ๊ธฐ
ํน์ ์์ธ๊ฐ ๋ฐ์ํ ๊ฒฝ์ฐ ๋ ์ฝ๋ ๊ฑด๋๋๊ธฐ(skip)
Skip
์ด๋ค ์กฐ๊ฑด์์ ๋ ์ฝ๋๋ฅผ skipํ ์ง(์ด๋ค ์์ธ๋ฅผ ๋ฌด์ํ ๊ฒ์ธ์ง)
์ผ๋ง๋ ๋ง์ ๋ ์ฝ๋๋ฅผ skip ํ ์ ์๊ฒ ํ ๊ฒ์ธ์ง
๋ ์ฝ๋๋ฅผ skipํ ์ง ์ฌ๋ถ๋ฅผ ๊ฒฐ์ ํ ๋ ์ ๋๊ฐ์ง ์์๋ฅผ ๊ณ ๋ คํด์ผํ๋ค.
Skip์ ์ฌ์ฉํ๊ธฐ ์ํด์๋ ์ฐ์ faultToLerant()๋ผ๋ ๋ฉ์๋๋ฅผ ํธ์ถํด์ผํ๋ค.
skipLimit()
skip ํ์ฉ ํ์. ํ์ฉ ํ์๋ฅผ ๋์ด๊ฐ๋ฉด job์ ์คํจํ๋ค. skip()๊ณผ ๋ฐ๋์ ๊ฐ์ด ์จ์ผ ํ๋ค
skip()
ํด๋น exception์ด ๋ฐ์ํ์๋ skip
noSkip()
ํด๋น exception์ด ๋ฐ์ํ๋ฉด skip์ ํ์ง ์๊ณ ์ค๋ฅ๋ฅผ ๋ด๊ฒ ๋ค๋ ๊ฒ
skipPolicy()
์ฉ์ ์ ์๋ก skip์ ๋ํ policy๋ฅผ ๋ง๋ค์ด์ ์ ์ฉํ๊ณ ์ถ์๋ ์ฌ์ฉ
SkipPolicy
SkipPolicy ๊ตฌํ์ฒด๋ skipํ ์์ธ์ ํ์ฉ ํ์๋ฅผ ํ๋ณํ ์ ์์ผ๋ฉฐ, boolean ๊ฐ์ผ๋ก ๋ด๋ถ ๋ก์ง์ ์์ ํ ์ ์๋ค.
์ค๋ฅ ๋ก๊ทธ ๋จ๊ธฐ๊ธฐ
ItemListener๋ฅผ ์ฌ์ฉํด ์๋ชป๋ ๋ ์ฝ๋๋ฅผ ๊ธฐ๋กํ๋ ๋ฐฉ๋ฒ์ ๋ค๋ฃฐ ๊ฒ์ด๋ค.
์๋ชป๋ ๋ ์ฝ๋๋ฅผ ์ฝ์์ ๋ ๋ก๊ทธ๋ฅผ ๋จ๊ธฐ๊ธฐ ์ํด์ onReadError ๋ฉ์๋๋ฅผ ์ค๋ฐ๋ผ์ด๋ํด ItemListenerSupport๋ฅผ ์ฌ์ฉํ์ฌ ์๋ฌ๋ฅผ ๊ธฐ๋กํ๋ค.
๋จ์ํ ํ์ผ์ ์ฝ์ด์ฌ ๋๋ ์์ ๊ฐ์ด ์ฒ๋ฆฌํ๋ฉด ๋์ง๋ง, DB๋ฅผ ์ด์ฉํ ์ค๋ฅ๊ฐ ๋ฐ์ํ ๊ฒฝ์ฐ์๋ ์ค์ DB์ ์ถ๋ ฅ์ ์คํ๋ง ์์ฒด๋ ํ์ด๋ฒ๋ค์ดํธ์ ๊ฐ์ ๋ค๋ฅธ ํ๋ ์์ํฌ๊ฐ ์ฒ๋ฆฌํ๋ฏ๋ก, ์คํ๋ง ๋ฐฐ์น์์ ์ฒ๋ฆฌํ ์์ธ๊ฐ ๋ง์ง ์๋ค.
onReadError ํ์ผ ์ค๋ฅ ๋ก๊ทธ ๋จ๊ธฐ๊ธฐ
Last updated
Was this helpful?