์คํ๋ง ๋ฐฐ์น๋ฅผ ์ฌ์ฉํ๋ฉด์ ๊ฒช์ ๊ฒ๋ค
by JiwonDev
๋จผ์ ์คํ๋ง ๋ฐฐ์น๊ฐ ์ด๋ป๊ฒ ๋์ํ๋์ง ๊ฐ๋จํ๊ฒ ์์๋ณด์.
๐ ์คํ๋ง ๋ฐฐ์น๋ ์ด๋ป๊ฒ ๋์ํ ๊น์?
์คํ๋ง ๋ฐฐ์น๋ Job ๋จ์๋ก ์คํ๋ฉ๋๋ค. ํ๋์ Job์ ์ฌ๋ฌ Step์ผ๋ก ๋๋ ์ ์๋ค.
์คํํ๋ฉด์ Spring Batch ๋ด๋ถ์ Job Repository๋ฅผ ํตํด ๊ณ์ํด์ Job๊ณผ Step์ ์ ๋ณด๋ฅผ ์๋์ ์์๋๋ก ๋ฉํ ํ ์ด๋ธ์ ์ ์ฅํ๋ค. ์ฐธ๊ณ ๋ก ๋ฉํ ์ ๋ณด๋ ๋ฐฐ์น ์ํ๊ณผ ๊ด๋ จ๋ ์์น(์์/์ข ๋ฃ ์๊ฐ, ์ํ, ํ์)์ Job, Step์์ ๊ณต์ ํด์ ์ฐ๋ ์ปจํ ์คํธ๋ฑ์ ํฌํจํ๋ค.
- BATCH_JOB_INSTANCE : JOB ์ธ์คํด์ค ์ ๋ณด - Job ์ด๋ฆ, Job ๊ณ ์ ํค
- BATCH_JOB_EXECUTION : JOB ์คํ์ ๋ณด - job_instance_id, ์ํ, ์์์๊ฐ, ์ข ๋ฃ์๊ฐ, job ์๋ฌ์ ๋ณด
- BATCH_JOB_EXECUTION_PARAM : ์ฌ์ฉ๋ Job Parameter ์ ๋ณด
- BATCH_JOB_EXECUTION_CONTEXT : ์ฌ์ฉ๋ Job Execution Context ๊ฐ์ฒด (์ง๋ ฌํ๋์ด DB์๋ ์ ์ฅ)
- BATCH_STEP_EXECUTION : STEP ์คํ์ ๋ณด - job_execution_id, ๋ฐ์ดํฐ read, commit, filter, skip count, step ์๋ฌ์ ๋ณด
- BATCH_STEP_EXECUTIOIN_CONTEXT : ์ฌ์ฉ๋ Step Execution Context ๊ฐ์ฒด (์ง๋ ฌํ๋์ด DB์๋ ์ ์ฅ)
๐ ์คํ๋ง ๋ฐฐ์น์ ํธ๋์ญ์ ์ ์ด๋ป๊ฒ ๊ฑธ๋ฆด๊น์?
์ ๊ทธ๋ฆผ์์ ํธ๋์ญ์ ๋ถ๋ถ์ ํ๋ํด๋ณด๋ฉด ์๋์ ๊ฐ๋ค. ์ฐธ๊ณ ๋ก Reader์์ DB๋ฅผ ์ฌ์ฉํ์ง ์๋๋ผ๋ spring batch ๋ฉํ ๋ฐ์ดํฐ๋ฅผ ๊ฐฑ์ ํ๋ฉด์ ๋ฐ๋ก DB ํธ๋์ญ์ ์ด ์์๋จ์ ์ ์ํ์.
์ฐธ๊ณ ๋ก ์ด๋ ChunkOrientedTasklet ๋ฅผ ๋๋ฒ๊น ์ผ๋ก ์ถ์ ํด๋ณด๋ฉด ์ฝ๋๋ก๋ ํ์ธํ ์ ์๋ค.
๐ค ์คํ๋ง ๋ฐฐ์น๋ ์ ์ด๋ ๊ฒ ํธ๋์ญ์ ์ ๊ธธ๊ฒ ์ก์๊น์?
๋ฌผ๋ก ๋จ์ํ ํธ๋์ญ์ ์ ์ฒญํฌ๋จ์๋ก ๊ฑธ๋ฉด ๊น๋ํ๋๊น ๊ทธ๋ฐ ๊ฒ๋ ์๊ฒ ์ง๋ง
- SpringBatch๋ ์ฒญํฌ๊ฐ ์คํ ๋ ๋ ๋ง๋ค StepExecution ๊ฐ์ฒด ์ ๋ฐ์ดํธ, ์ฒญํฌ๊ฐ ๋๋๋ ์์ ์ DB์ ์ ์ฅํ๋ค. ์ด๋ ๋ฐฐ์น ์์ ์ ์ถ์ ๊ณผ ์ค๋ฅ ๋ฐ์์ ์ฌ์์์ ์ํด ์ฌ์ฉ๋๋ค.
- ๋ณต์กํ ๋ฐฐ์น ์์ ์ TransactionCallback์ ์ฌ์ฉ ์ ๋ฐ๋๋ฝ์ด ๊ฑธ๋ฆฌ๋ ์ด์๊ฐ ์์ด์ ์ฒญํฌ๋จ์๋ก ํธ๋์ญ์ ์ ์ก์๊ฑฐ๊ธฐ๋ ํ๋ค.
1๏ธโฃ TransactionSystemException (Transaction Session Timeout)
์ฌ๋ด์์ ๋ฐฐ์น๋ฅผ ์ ์ฌ์ฉํ๊ณ ์์๋๋ฐ, ์ฝ๋๋ฅผ ๋ณ๊ฒฝํ์ง ์์๋๋ฐ๋ ํน์ ์์ ์ดํ๋ถํฐ ์๋ ์๋ฌ๊ฐ ์ข ์ข ๋ฐ์ํ์์๋ค.
org.springframework.transaction.TransactionSystemException: Could not roll back JPA transaction; nested exception is org.hibernate.TransactionException: Unable to rollback against JDBC Connection
at org.springframework.orm.jpa.JpaTransactionManager.doRollback(JpaTransactionManager.java:593)
at org.springframework.transaction.support.AbstractPlatformTransactionManager.processRollback(AbstractPlatformTransactionManager.java:835)
at org.springframework.transaction.support.AbstractPlatformTransactionManager.rollback(AbstractPlatformTransactionManager.java:809)
at org.springframework.transaction.support.TransactionTemplate.rollbackOnException(TransactionTemplate.java:168)
at org.springframework.transaction.support.TransactionTemplate.execute(TransactionTemplate.java:144)
...
๋ฐ์ดํฐ๋ฅผ API๋ก ๋ฐ์์์ ์ ์ฒ๋ฆฌํ๋ ๋ฐฐ์น์๋๋ฐ Reader์ Processor์์๋ DB ๋ฅผ ์ฌ์ฉํ์ง ์๋ ์ฝ๋์๋ค.
Writer ๋ํ ๋จ์ ์ ์ฒ๋ฆฌ์๋ฃ๋ ๋ฐ์ดํฐ๋ฅผ Saveํ๋ ๋จ์ํ ์ฟผ๋ฆฌ๋ผ ๋๋์ฑ ์ดํด๊ฐ ์๋๋ ์ํฉ์ด์๋ค.
/** ์์์
๋๋ค. **/
@Bean
fun JiwonCollectDataJob(
jiwonStep: Step,
): Job {
return jobBuilderFactory.get(JIWON_JOB_NAME)
.start(jiwonStep)
.incrementer(RunIdIncrementer())
.listener(JobResultListener())
.build()
}
@Bean
fun JiwonStep(
jiwonItemReader: JiwonItemReader,
jiwonItemProcessor: ItemProcessor<List<CollectData>, List<MyEntity>>,
jiwonItemWriter: ItemWriter<List<MyEntity>>,
): Step {
// Reader(์น์ฌ์ดํธ API) - Processor(๋ณต์กํ ๋ฐ์ดํฐ ์ ์ฒ๋ฆฌ) - Writer(๋จ์ DB ์ ์ฅ)
return stepBuilderFactory[JIWON_STEP_NAME]
.chunk<List<ParseData>, List<Entity>>(chunkSize)
.reader(jiwonItemReader)
.processor(jiwonItemProcessor)
.writer(jiwonItemWriter)
.transactionManager(mainDbTransactionManager)
.build()
}
๐ค ์ Transaction Timeout์ด ๋ฐ์ํ๋๊ฐ?
๊ฒฐ๋ก ๋ถํฐ ๋งํ์๋ฉด Hikari Connection ๊ฐ์ฒด๋ ์ด์์๋๋ฐ db session timeout ์ ์ด๊ณผํ๊ธฐ ๋๋ฌธ์ด๋ค.
// ๊ด๋ จ๋ ๋ก๊ทธ (Spring, db, HikariCP)
org.springframework.transaction.TransactionSystemException: Could not roll back JPA transaction; nested exception is org.hibernate.TransactionException: Unable to rollback against JDBC Connection
FATAL: terminating connection due to idle-in-transaction timeout
HikariCP-Writer - Connection org.postgresql.jdbc.PgConnection@2d0ea3a9 marked as broken because of SQLSTATE(08006), ErrorCode(0) // 08006์ ์ปค๋ฅ์
ํ์ด ์ฌ์ฉํ๊ณ ์๋ ์ปค๋ฅ์
์ด ์ค๋จ๋์๊ฑฐ๋ ๋ฌธ์ ์์ ๋ํ๋.
Reader์์ DB๋ฅผ ์ฌ์ฉํ์ง ์์๋ค๊ณ ํ๋๋ผ๋, ์ฒญํฌ๊ฐ ์์๋๋ ์์ ์ step_execution์ ์ ๋ฐ์ดํธํ๋ฉด์ db๋ฅผ ์ฌ์ฉํ๋ค. ๊ทธ๋ฆฌ๊ณ Writer๊ฐ ๋์ํ๊ธฐ์ ๊น์ง DB๋ฅผ ์ฌ์ฉํ์ง์๋๋ฐ, ๊ทธ ์๊ฐ์ด ์ timeout (60์ด)๋ฅผ ์ด๊ณผํ์ ๋๋ง ๊ฐํ์ ์ผ๋ก ๋ฐ์ํ๋ ๊ฒ์ด์๋ค.
- chunk ๋จ์ ์์ ์์ ์, ํธ๋์ญ์ ์์ฑ์ผ๋ก ์ธํด HikariCP ์์ ์ปค๋ฅ์ ์ ํ๋ํฉ๋๋ค.
- ์ปค๋ฅ์ ์ ์ด๋ฏธ ๋ฐ์๋๋ผ๋ ์ฟผ๋ฆฌ๋ฅผ ์คํํ์ง ์์ผ๋ฉด DB์ ์์ฒญ์ ๋ณด๋ด์ง ์์ต๋๋ค.
- ์ฆ DB ์ ์ฅ์์๋ connection์ด ์ ํ ์ํ์ ๋๋ค. idle_in_transaction_session_timeout (60์ด)๊ฐ ์ง๋๋ฉด ์ปค๋ฅ์ ์ด ๋๊น๋๋ค.
- ์ ๋๊ฒ Reader์ Processor๊ฐ ๋์ํฉ๋๋ค. ์ฒ๋ฆฌํ ๋ฐ์ดํฐ๊ฐ ๋ง์์ 60์ด๋ฅผ ์ง๋๋ฒ๋ฆฝ๋๋ค. ์ด ๋ HikariCP ์ปค๋ฅ์ ์ ์ด์์์ง๋ง, DB ์ปค๋ฅ์ ์ ์ด๋ฏธ ๋๊ธด์ํ์ ๋๋ค.
- ์ดํ writer์์ ์์ ์ ํ๋ , spring batch์์ stepExecution์ ์ ์ฅํ๋ ค๊ณ ํ๋ ์ปค๋ฅ์ ์ด ๋๊ฒจ๋ฒ๋ ธ๊ธฐ ๋๋ฌธ์ ์๋ฌด๊ฒ๋ ์๋ฉ๋๋ค.
๐ซ ์ด๋ป๊ฒ ํด๊ฒฐํ์ง? - ResourcelessTransactionManager
- ๋จ์ํ๊ฒ idle-transaction-session-timeout์ ๋ฌด์์ ๋๋ฆฌ๋ ๋ฐฉ๋ฒ๋ ์๊ฒ ์ง๋ง ์ด๋ DB์ ๋ถ๋ด์ ์ค ์ ์๋ค.
- session์ด ๋๊ธฐ์ง ์๋๋ก ๊ณ์ํด์ ์ฟผ๋ฆฌ๋ฅผ ๋ ๋ ค์ฃผ๋ ๋ฐฉ๋ฒ๋ ์๊ฒ ์ง๋ง ๋ถํ์ํ ์ฟผ๋ฆฌ๋ฅผ ์์ฑํด์ผํ๊ณ ์ธ์
์์ฒด์ ๋์ ์ํ์ด ์๋ค.
-> ์ HikariCP๋ ์ปค๋ฅ์ (์ธ์ ) ๊ฐฑ์ ๊ธฐ๋ฅ์ ์ ๋ ๋ง๋ค์ด์ฃผ์ง ์์๊น?
๋คํํ๋ ์ด๋ฐ ๊ฒฝ์ฐ๋ฅผ ์ํด Spring Batch์์ ResourcelessTransactionManager ๋ผ๋๊ฑธ ๋ฐ๋ก ์ ๊ณตํ๋ค.
@Bean
public Step step() throws Exception {
return stepBuilderFactory.get("myStep")
.<ParseData, Item>chunk(chunkSize)
.reader(reader())
.processor(processor())
.writer(writer())
.transactionManager(new ResourcelessTransactionManager()) // No Transaction
.build();
}
์ฝ๊ฒ๋งํ๋ฉด SpringBatch์์ ํ์์๋ ํธ๋์ญ์
์ ๊ฑธ์ง์๊ณ StepExceution๊ณผ ๊ฐ์ ๋ฉํ ์ ๋ณด๋ฅผ ํ
์ด๋ธ์ ์ ์ฅํ์ง ์๋๋ค.
(์์ ) JobRepository๋ก ๋ฉํ์ ๋ณด๋ ์ ์ฅํ๋ค. ์ฒญํฌ๋จ์๋ก ํธ๋์ญ์
๋ง ๊ฑธ์ง ์์ ๋ฟ์ด๋ค. ResourceLessTxManager ์ฝ๋๋ฅผ ์ด์ด๋ณด๋ฉด ์ดํด๊ฐ ์ฌ์ธํ
๋ฐ, ๊ทธ๋ฅ ๋์ํ๋ ์ฒํ๋ ๊ฐ๋จํ ์ฝ๋๋ก ๊ตฌ์ฑ๋์ด์๋ค.
์ฆ ๋์์๋ ๋ณํจ์ด ์๋๋ฐ ๋จ์ง [์ฒญํฌ๋จ์ ํธ๋์ญ์ ]์ด ์์ ๋ฟ์ด๋ค. ๋ฐฐ์น๊ฐ ์๋ ์ผ๋ฐ์ฝ๋์์ Repository๋ฅผ ์ฌ์ฉํ๋ ๊ฒ๊ณผ ๋์ผ
๋ฌผ๋ก ๋ง๋ฅ์ ์๋๊ณ ์๋์ ๊ฐ์ ์ํฉ์์ ์ ์ฉํ๊ฒ ์ฌ์ฉํ ์ ์๋ค. ๋น์ฐํ๊ฑฐ์ง๋ง Reader์์ ๋ด ์ฝ๋๋ก ์ปค๋ฅ์
์ ์ง์ ์ด๊ณ ์์ฐ๋ค๊ฐ Writer์์ ์ฌ์ฌ์ฉํ๋ฉด ์ฒ์๊ณผ ๋์ผํ๊ฒ timeout์ด ๋ฐ์ํ ์ ์๋ค.
- Reader ์์๋ง DB๋ฅผ ์ฌ์ฉํ๊ณ Writer์์ ์ฌ์ฉํ์ง ์๋ ๊ฒฝ์ฐ (์ธ์ ์ด ๋ซํ๋ ์ง์ ์ฟผ๋ฆฌ๋ฅผ ๋ ๋ฆฌ์ง ์์ผ๋ ์๋ฌด ๋ฌธ์ ์๋ค.)
- Writer ์์๋ง DB๋ฅผ ์ฌ์ฉํ๊ณ Reader์์ ์ฌ์ฉํ์ง ์๋ ๊ฒฝ์ฐ (์ธ์ ์์ฒด๊ฐ writer ์์ ์ ์ด๋ฆฐ๋ค.)
2๏ธโฃ ๊ฐ๋ฅํ๋ฉด JPA ์์์ฑ ์ปจํ ์คํธ๋ฅผ ์ฌ์ฉํ์ง ๋ง์.
๋ฐฐ์น์์ ์ ํ๋ฉด์ ๋ณ ์๊ฐ์์ด ์ด๋ฏธ ๋ง๋ค์ด์ง Domain ์ฝ๋์ JpaRepository๋ฅผ ์ด์ฉํ๊ฑฐ๋ ์ญ์ ์์ ๋ฑ์๋ JpaCursorItemReader๋ฑ์ ํ์ฉํ๊ณค ํ์๋ค. ์ฒ์์๋ ์๋ฌด ๋ฌธ์ ์์์ง๋ง ์์ ๋์ด ์ปค์ง๋ ์ฌ์ฉ์๊ฐ ๋ง์ด ์๋๋ฐ๋ DB CPU ์ฌ์ฉ๋ฅ ์ด ๋๋ค๋ ์๋์ ๋ฐ๊ฒ ๋๋ค.
๋ฐฐ์น์์ ์ ํน์ฑ์ ChunkSize ๋งํผ I/O๊ฐ ๋ฐ์ํ๊ฒ๋๋ค. JPA๋ ๋ํฐ์ฒดํน์ผ๋ก ์ ๋ฐ์ดํธ๋ฅผ ์งํํ๊ธฐ ๋๋ฌธ์ ๋จ๊ฑด์ผ๋ก์กฐํํด์ Writer๊ฐ ์งํ๋๋ค. ์ฆ ๊ฐฏ์๋งํผ select ์์ฒญ์ db์ ๋ ๋ฆฌ๊ฒ ๋๋ค๋ ๋ง
์ด๋ฅผ ํด๊ฒฐํ๋๊ฑด ๊ฐ๋จํ์๋ค. JdbcReader๋ฅผ ์ฌ์ฉํ๊ฑฐ๋ Projections ์ ์ด์ฉํด์ JPA ์์์ฑ ์ปจํ ์คํธ๋ฅผ ๊ฑฐ์น์ง์๊ณ ๋ฐ๋ก ์ ๋ฐ์ดํธํ๋๋ก ์ฝ๋๋ฅผ ๋ณ๊ฒฝํ๋ ์ฝ๊ฒ ํด๊ฒฐ๋์๋ค. ๋ JPA๋ฅผ ์ฌ์ฉํ์ง ์์ผ๋ ์ฟผ๋ฆฌ๋ก update .. where in (ids) ์ ๊ฐ์ด ์ต์ ํ ํ ์ ์๋ ๋ถ๋ถ์ด ์๋๊ฑด ๋ค
- update ์์ ์์ฒด๊ฐ ๋ง์์ ๋ณ๊ฒฝ์ด ํ๋ค๋ค๋ฉด DB I/O ์์ ์ ๋ฌถ์ด์ ์ฒ๋ฆฌํ๋ jdbc executeBatch๋ฅผ ํ์ฉํ ์๋ ์๋ค.
- ๊ทธ ์ธ https://tech.kakaopay.com/post/ifkakao2022-batch-performance-read/ ๊ฐ์ ๋ฐฐ์น ์ฑ๋ฅ ํ๋์ ๊ฐ์ด ์ฐธ๊ณ ํ์.
3๏ธโฃ Domain ๋ก์ง์ด๋ ๋ณํ๋ ๊ฐ(time, option)์ ๋ฐฐ์น์์ ๋ถ๋ฆฌํ์.
์๋ฅผ ๋ค์ด ๋งค๋ฌ 1์ผ์ ์คํํ๋๋ก ๋ง๋๋ ๋ฐฐ์น๋ผ์ LocalDateTime.now() ๊ฐ์ด ์ฝ๋์ ๋ฐ์์ ์ฌ์ฉํ ์ ์๋๋ฐ, ๊ทธ๋ฌ์ง ์๋๊ฑธ ๊ถ์ฅํ๋ค.
- ์๋ฒ์๊ฐ์ด๋ ์คํํ๊ฒฝ์ ๋ฐ๋ผ ๊ฐ์ด ๋ฌ๋ผ์ง ์ ์๋ค.
- ๋น์ฅ์ ๋งค๋ฌ 1์ผ๋ง ์คํํ ๊ฒ ๊ฐ์ง๋ง, ์ํฉ์ ๋ฐ๋ผ (ํน์ ๋ฐฐ์น๊ฐ ์คํจํด์) ๋ค๋ฅธ ๋ ์ง์ ์คํํ ์๋ ์๋ค.
- ์ต์ ๊ฐ์ด ๋ณ๊ฒฝ๋๋ฉด ๋ฐฐ์น๋ฅผ ์๋ก ๋ฐฐํฌํด์ผํ๋ค.
์ฝ๋์์ ๋ฐ๋ก ๊ตฌํ ์ ์๋๋ผ๋ ์์ ๊ฐ์๊ฑธ ๊ณ ๋ คํด์ JobParameters ์ผ๋ก ๋ฐ์์ ์ฌ์ฉํ์.
@Value("#{jobParameters[batchDate]}") batchDate: String,
@Value("#{jobParameters[apiKey]}") apiKey: String
๊ฐ์ ๋งฅ๋ฝ์ผ๋ก ๊ตณ์ด ํ์ํ์ง ์๋ค๋ฉด Batch์์ ๊ฐ๋ฅํ๋ฉด Domain์ ๊ตฌํ๋ ์ฝ๋๋ฅผ ์ฌ์ฉํ์ง ์๊ณ ๋ณ๋์ ๋ชจ๋๋ก ๋ถ๋ฆฌํ๊ธฐ๋ฅผ ๊ถ์ฅํ๋ค. ๋ ๊ฐ์ ๋ณ๊ฒฝ ์์ ์ด ๋ค๋ฅธ๋ฐ ๋ฐฐํฌ๋ฅผ ๊ฐ์ดํด์ผํด์ ์ ๋งคํด์ง๊ธฐ๋ ํ๊ณ ๋๋ฉ์ธ์์ ๋ถ๋ฆฌํจ์ผ๋ก์ ๋ถํ์ํ ๊ณผ์ ์ ์ค์ด๊ณ ์ฟผ๋ฆฌ๋ฅผ ์ง์ ์ต์ ํ ํ ์ ์๋ค.
4๏ธโฃ Update, Delete ๋ฐฐ์น์์ ์ ๋ฐ์ดํฐ๊ฐ ๋๋ฝ๋์ง ์๊ฒ ์ฃผ์ํ์
์ ๋ง ๊ฐ๋จํ๊ฑด๋ฐ Update, Delete ๋ฐฐ์น ์์ ์ ๊ฒฝ์ฐ ํ์ด์ง์ด ๊นจ์ง๋ค๋ ๊ฑธ ์ ๋ ์์ง๋ง์. ๋ณ๊ฑฐ ์๋๋ฐ ๋ง์ ๋๋ ค๋ณด๋ฉด ์ ๋์๊ฐ๋ ๊ฒ ๊ฐ์ด ๋ณด์ด๊ธฐ ๋๋ฌธ์ ๋ชจ๋ฅด๊ณ ์์ผ๋ฉด ์ ๋ง ์ฐพ๊ธฐ ํ๋ค๋ค ๐ฅฒ
- pagingReader๋ก 10๊ฐ๋ฅผ ์ฝ์ด์ด
- read 10๊ฐ -> writer 10 ๊ฐ
- writer 10๊ฐ๋ฅผ ํ๊ธฐ ๋๋ฌธ์ ์ค๊ฐ์ ๋ช ๊ฐ๋ฅผ ๊ฑด๋๋ฐ๊ณ ๋ค์ ํ์ด์ง๊ฐ ๋ฐํ๋จ
์ ์ผ ํธํ ํด๊ฒฐ ๋ฐฉ๋ฒ์ CursorReader๋ก ์ฝ์ด๋ค์ด๊ฑฐ๋, ๊ทธ๊ฒ ์ด๋ ต๋ค๋ฉด ์๋์ ๊ฐ์ด pageSize=0์ผ๋ก ๊ณ ์ ํด์ ์ฝ์ผ๋ฉด ๋๋ค.
๋จ pageSize ๋ฅผ ๊ณ ์ ํ ๊ฒฝ์ฐ ๋ชจ๋ ์์ดํ ์ด ์๋ฃ๋์ง ์๋๋ค๋ฉด ๋ฐฐ์น๊ฐ ๋๋์ง ์๋ ๋ค๋๊ฑธ ๋ช ์ฌํ์.
@Bean
@StepScope
public ItemReader<Order> itemReader() {
MyBatisPagingItemReader<Order> itemReader = new MyBatisPagingItemReader<Order>() {
@Override
public int getPage() {
return 0;
}
};
itemReader.setQueryId("query-name");
itemReader.setPageSize(PAGE_SIZE);
itemReader.setSqlSessionFactory(sqlSessionFactory);
return itemReader;
}
// Kotlin์ด๋ฉด ์ด๋ ๊ฒ.
val reader: JpaPagingItemReader<Group> = object : JpaPagingItemReader<Group>() {
override fun getPage(): Int {
return 0
}
}.apply {
pageSize = batchPageSize
setName("reader")
setEntityManagerFactory(entityManagerFactory)
setQueryString( "SELECT * FROM Group")
}
๐ ๋ ํผ๋ฐ์ค
https://jojoldu.tistory.com/526
https://kwonnam.pe.kr/wiki/springframework/batch
https://pkgonan.github.io/2018/04/HikariCP-test-while-idle
https://kakaocommerce.tistory.com/45
https://devocean.sk.com/blog/techBoardDetail.do?ID=164123
https://www.inflearn.com/course/%EC%8A%A4%ED%94%84%EB%A7%81-%EB%B0%B0%EC%B9%98/dashboard
๋ธ๋ก๊ทธ์ ์ ๋ณด
JiwonDev
JiwonDev