Spring Framework/Spring & Spring Boot

[Spring] Spring Batch๋กœ ํ•œ ๋‹ฌ ์ง€๋‚œ ๋ฐ์ดํ„ฐ ์‚ญ์ œํ•˜๊ธฐ

soogoori 2024. 7. 29. 13:23

Amazon EventBridge ์Šค์ผ€์ค„๋Ÿฌ๋ฅผ ์ด์šฉํ•ด์„œ ์ฃผ๊ธฐ์ ์œผ๋กœ ๋””๋ฐ”์ด์Šค๋ฅผ ์‹คํ–‰์‹œ์ผฐ๋‹ค.

์Šค์ผ€์ค„ ๋ฐ์ดํ„ฐ๊ฐ€ ๊ณ„์† ๋Š˜์–ด๋‚˜๊ธฐ ๋•Œ๋ฌธ์— ๋ฐ์ดํ„ฐ๋ฅผ update (๋˜๋Š” create)ํ•œ์ง€ ํ•œ ๋‹ฌ์ด ์ง€๋‚˜๋ฉด ์ž๋™์œผ๋กœ ์‚ญ์ œ๋˜๋Š” ๊ธฐ๋Šฅ์„ ๊ฐœ๋ฐœํ•ด์•ผํ–ˆ๋‹ค.

 

Spring Batch ์‚ฌ์šฉ์€ ์ฒ˜์Œ์ด๋ผ ์–ด๋–ป๊ฒŒ ํ• ์ง€ ๊ตฌ๊ธ€๋งํ•˜๋˜ ์ค‘์— ๋„ค์ด๋ฒ„ ๊ฐœ๋ฐœ์ž ๋ถ„ ์ค‘ Spring Batch๋ฅผ ๋” ์šฐ์•„ํ•˜๊ฒŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์„ ์ œ์‹œํ•œ ๊ฒŒ์‹œ๊ธ€์„ ๋ณด๊ฒŒ ๋˜์—ˆ๋‹ค. ์‹ฌ์ง€์–ด ์ฝ”ํ‹€๋ฆฐ์œผ๋กœ ํ™œ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•๊นŒ์ง€ ์žˆ์–ด์„œ ์ฐธ๊ณ ํ•˜๊ธฐ ์ข‹์€ ๊ธ€์ด์—ˆ๋‹ค๋งŒ..๐Ÿ˜Š

๐Ÿ‘‰ํ•˜์ง€๋งŒ ์‚ฌ์šฉํ•˜๋ ค๊ณ  ๋œฏ์–ด๋ณด๋‹ˆ..  ๋ฌธ์ œ๊ฐ€ ์žˆ์–ด์„œ ๋‹ค๋ฅธ ๋ฐฉ๋ฒ•์„ ํƒํ–ˆ๋‹ค๐Ÿฅฒ (๋ฐ‘ ๊ธ€ ์ฐธ๊ณ )

 

Spring Batch๋ฅผ ํ™œ์šฉํ•ด ๊ฐœ๋ฐœํ•œ ๊ฒƒ์„ ๊ธฐ๋กํ•ด๋ณด๊ฒ ๋‹ค

(์ฐธ๊ณ ๋กœ ํ”„๋กœ์ ํŠธ์—์„œ ํ™œ์šฉํ•œ Spring Batch๋Š” 4.X.X์ด๋‹ค.)

๐Ÿ’ช ๋ชฉํ‘œ : update(๋˜๋Š” create)๋œ์ง€ ํ•œ ๋‹ฌ์ด ์ง€๋‚œ ๋ฐ์ดํ„ฐ ์‚ญ์ œํ•˜๊ธฐ !

Spring Batch๋ž€?

"A lightweight, comprehensive batch framework designed to enable the development of robust batch applications vital for the daily operations of enterprise systems." 

์ •ํ•ด์ง„ ์‹œ๊ฐ„์— ์ผ๊ด„์ ์œผ๋กœ ๋Œ€์šฉ๋Ÿ‰์˜ ๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ๋ฅผ ์œ„ํ•œ batch ์ฒ˜๋ฆฌ ํ”„๋ ˆ์ž„์›Œํฌ๋กœ, ์Šค์ผ€์ค„๋Ÿฌ๋ฅผ ๋Œ€์ฒดํ•˜๊ธฐ๋ณด๋‹ค๋Š” ์Šค์ผ€์ค„๋Ÿฌ์™€ ํ•จ๊ป˜ ์ž‘๋™
  • ๋‹ค์–‘ํ•œ batch ์ฒ˜๋ฆฌ ์ง€์›
    • ๋Œ€๋Ÿ‰์˜ ๋ฐ์ดํ„ฐ ์ฝ๊ธฐ/์“ฐ๊ธฐ
    • ๋ฐ์ดํ„ฐ ๋ณ€ํ™˜ ๋ฐ ์ฒ˜๋ฆฌ
    • ๋ณ‘๋ ฌ ์ฒ˜๋ฆฌ ๋ฐ ๋‹ค์ค‘ ์Šค๋ ˆ๋“œ ์ง€์›
  • ํŠธ๋žœ์žญ์…˜ ๊ด€๋ฆฌ
  • ๋ชจ๋‹ˆํ„ฐ๋ง ๋ฐ ๊ด€๋ฆฌ ๊ธฐ๋Šฅ 


๐Ÿ”ท ์ฃผ์š” ๊ตฌ์„ฑ ์š”์†Œ

  • Job
    • batch ์ž‘์—…์˜ ๋…ผ๋ฆฌ์  ๋‹จ์œ„๋กœ, ์—ฌ๋Ÿฌ step์œผ๋กœ ๊ตฌ์„ฑ๋จ ๐Ÿ‘‰ ์ „์ฒด batch process ์ •์˜
    • ๋ฐฐ์น˜ ์ž‘์—…์˜ ๋ฉ”ํƒ€ ๋ฐ์ดํ„ฐ ๊ด€๋ฆฌ
    • Step ์ˆœ์„œ ์ •์˜
    • JobParameters ๋ฐ›์Œ

  • Step
    • ์‹ค์ œ Batch ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋Š” ์—ญํ• 
    • Job์˜ ์„ธ๋ถ€ ์ž‘์—… ๋‹จ์œ„๋กœ, ๊ฐœ๋ณ„์ ์œผ๋กœ ์‹คํ–‰๋จ
    • chunk ๊ธฐ๋ฐ˜ (chunk-oriented), tasklet ๊ธฐ๋ฐ˜์œผ๋กœ ๋‚˜๋‰จ
    • ItemReader, ItemProcessor, ItemWriter๋กœ ๊ตฌ์„ฑ

Chunk-oriented Processing with Item Processor

  • ItemReader
    • ๋ฐ์ดํ„ฐ ์ฝ์–ด์˜ค๋Š” ์—ญํ• 
  • ItemProcessor
    • ์ฝ์–ด์˜จ ๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ
  • ItemWriter
    • ์ฒ˜๋ฆฌ๋œ ๋ฐ์ดํ„ฐ ์ €์žฅ
ItemReader, ItemProcessor, ItemWriter๋ฅผ ๋ฌถ์–ด์„œ Tasklet์œผ๋กœ ๋ถ€๋ฅด๊ธฐ๋„ ํ•œ๋‹ค. 
๐Ÿ‘‰ ํ•˜๋‚˜์˜ ํŠธ๋žœ์žญ์…˜์—์„œ ์ฒ˜๋ฆฌํ•˜๋ฏ€๋กœ ๋‹จ์ˆœํ•œ ์ฒ˜๋ฆฌ ์‹œ ์ฃผ๋กœ ์‚ฌ์šฉ
  • JobRepository
    • Job ์‹คํ–‰ ์ •๋ณด๋ฅผ ์ €์žฅํ•˜๊ณ  ๊ด€๋ฆฌ
    • Step ์ €์žฅ

๐Ÿ”น Spring Batch ์Šคํ‚ค๋งˆ ๊ตฌ์กฐ 

๐Ÿ‘‰ ๋ฐฐ์น˜ ์‹คํ–‰ํ•˜๊ณ  ๊ด€๋ฆฌํ•˜๊ธฐ ์œ„ํ•œ ๋ฉ”ํƒ€ ๋ฐ์ดํ„ฐ ์ €์žฅ

  • ์ดˆ๊ธฐ ์„ค์ • ํ•„์š”
  • Spring Batch Framework์— ์†ํ•˜๋Š” ๋ถ€๋ถ„์ด๋ฏ€๋กœ ์ˆ˜์ •ํ•˜์ง€ ์•Š๊ณ  ์กฐํšŒ๋งŒ ํ•จ
  • Job ์ด๋ ฅ, ํŒŒ๋ผ๋ฏธํ„ฐ ๋“ฑ ์‹คํ–‰ ๊ฒฐ๊ณผ ์กฐํšŒ

 

 

Spring Batch Plus

https://github.com/naver/spring-batch-plus
๐Ÿ‘‰ Spring Batch๋ฅผ ์กฐ๊ธˆ ๋” ํŽธ๋ฆฌํ•˜๊ฒŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ์œ ์šฉํ•œ ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•˜๋Š” ํ—ฌํผ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ

 

 

๐Ÿ”ท DeleteMetadataJob

  • ๋‚ ์งœ๋ฅผ ๊ธฐ์ค€์œผ๋กœ ํ•ด๋‹น ๋‚ ์งœ ์ด์ „์— ์ˆ˜ํ–‰๋œ ๋ชจ๋“  Job, Step์˜ metadata๋ฅผ ์‚ญ์ œํ•˜๋Š” Job

๐Ÿ‘‰ ์ด๊ฑธ ์‚ฌ์šฉํ•˜๋ ค๊ณ  ํ–ˆ์œผ๋‚˜ ...

ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ dataSource๋ฅผ ๋„˜๊ฒจ์ฃผ์–ด์•ผํ–ˆ๋‹ค.

 

ํ•˜์ง€๋งŒ MongoDB๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ํ”„๋กœ์ ํŠธ๋ผ์„œ JDBC API๋ฅผ ํ†ตํ•ด ๊ด€๊ณ„ํ˜• ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์™€ ์ƒํ˜ธ์ž‘์šฉํ•˜๋Š” DataSource๋ฅผ MongoDB์— ์ ์šฉ์‹œํ‚ฌ ์ˆ˜ ์—†์—ˆ๊ธฐ ๋•Œ๋ฌธ์— ๋‹ค๋ฅธ ๋ฐฉ๋ฒ•์„ ํƒํ•ด์•ผํ–ˆ๋‹ค..ใ… 

 

 

 

 

update๋œ์ง€ ํ•œ ๋‹ฌ ์ง€๋‚œ ์Šค์ผ€์ค„ ์‚ญ์ œ ๋ฐฐ์น˜ ์ฒ˜๋ฆฌ

  • DB์— ์ €์žฅ๋œ ๋ฐ์ดํ„ฐ ์ค‘ update๋œ์ง€ ํ•œ ๋‹ฌ์ด ์ง€๋‚œ ์Šค์ผ€์ค„ ์ฐพ๋Š” ๋กœ์ง ๊ตฌํ˜„ ๐Ÿ‘‰ ItemReader
  • ๋Œ€์ƒ ๋ฐ์ดํ„ฐ๋ฅผ ์‚ญ์ œํ•˜๋Š” ํ”„๋กœ์„ธ์Šค ๊ตฌํ˜„ ๐Ÿ‘‰ ItemProcessor & ItemWriter 
    • ๋‹จ์ˆœํžˆ ์‚ญ์ œ๋งŒ ํ•˜๋ฉด ๋˜๊ธฐ ๋•Œ๋ฌธ์— Tasklet์„ ํ™œ์šฉํ•ด ํ”„๋กœ์„ธ์Šค๋ฅผ ๊ตฌํ˜„ํ–ˆ๋‹ค.

๐Ÿ”ท Batch ์ฒ˜๋ฆฌ ์ˆœ์„œ 

  1. ์Šค์ผ€์ค„ Job ์„ค์ •
  2. ์Šค์ผ€์ค„ Step ์„ค์ •
  3. ์Šค์ผ€์ค„ Reader, Processor, Writer ๐Ÿ‘‰ tasklet ์„ค์ •

 

๐Ÿ”ถJob ์„ค์ •

@Configuration
class DeviceControlBatchConfiguration(
    private val jobBuilderFactory: JobBuilderFactory,
    private val stepBuilderFactory: StepBuilderFactory,
    private val deviceControlTasklet: DeleteDeviceControlTasklet
){

    val log = LoggerFactory.getLogger(this::class.simpleName)

    @Bean
    fun deleteJob(): Job {
        return jobBuilderFactory.get("deleteDeviceControlJob")
            .start(deleteStep())
            .build()
    }
}
  • Job ๊ฐ์ฒด๋ฅผ ์‰ฝ๊ฒŒ ์ƒ์„ฑํ•˜๊ณ  ๊ตฌ์„ฑํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•˜๋Š” JobBuilderFactory๋ฅผ ์ฃผ์ž…๋ฐ›์Œ
  • "deleteDeviceControlJob"์˜ ์ด๋ฆ„์„ ๊ฐ€์ง„ JobBuilder ์ƒ์„ฑ
  • start(deleteStep())์œผ๋กœ Job์˜ ์ฒซ๋ฒˆ์งธ Step ์„ค์ •

 

๐Ÿ”ถ Step ์„ค์ •

@Bean
fun deleteStep(): Step {
    return stepBuilderFactory.get("deleteDeviceControlStep")
        .tasklet(deviceControlTasklet)
        .build()
}
  • Step ๊ฐ์ฒด๋ฅผ ์‰ฝ๊ฒŒ ์ƒ์„ฑํ•˜๊ณ  ๊ตฌ์„ฑํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•˜๋Š” StepBuilderFactory๋ฅผ ์ฃผ์ž…๋ฐ›์Œ
  • "deleteDeviceControlStep"์˜ ์ด๋ฆ„์„ ๊ฐ€์ง„ StepBuilder ์ƒ์„ฑ
  •  tasklet(deviceControlTasklet)์œผ๋กœ ์ด Step์—์„œ ์‹คํ–‰ํ•  Tasklet ์„ค์ •
โœจ Tasklet์ด๋ž€?
๐Ÿ‘‰ Spring Batch์—์„œ ๋ฐฐ์น˜ ์ž‘์—…์˜ ๋‹จ๊ณ„๋ฅผ ์ •์˜ํ•˜๋Š” ์ธํ„ฐํŽ˜์ด์Šค๋กœ, ๋‹จ์ผ ์ž‘์—… ๋‹จ์œ„๋กœ ํ•œ ๋ฒˆ์— ํ•˜๋‚˜์˜ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋จ = Step ์•ˆ์—์„œ ์ˆ˜ํ–‰๋  ๊ธฐ๋Šฅ ๋ช…์‹œ
- StepContribution : ํ˜„์žฌ step์˜ ์‹คํ–‰์— ๋Œ€ํ•œ ๋ฉ”ํƒ€ ๋ฐ์ดํ„ฐ๋ฅผ ๋‚˜ํƒ€๋ƒ„ ๐Ÿ‘‰๋ฐฐ์น˜ ์ฒ˜๋ฆฌ ์ค‘์— ๋ฐœ์ƒํ•˜๋Š” ๋‹ค์–‘ํ•œ ์ •๋ณด ์ถ”์ 
- ChunkContext : ์ฒญํฌ ์ฒ˜๋ฆฌ์— ๋Œ€ํ•œ ์ปจํ…์ŠคํŠธ ์ •๋ณด ์ œ๊ณต
- RepeatStatus : ์ž‘์—…์ด ๊ณ„์† ๋ฐ˜๋ณต๋ ์ง€, ์™„๋ฃŒ๋˜์—ˆ๋Š”์ง€ ์—ฌ๋ถ€ ๋‚˜ํƒ€๋ƒ„

 

 

๐Ÿ”ถ Tasklet ์„ค์ •

@Component
class DeleteDeviceControlTasklet(
    private val deviceControlScheduleRepository: DeviceControlScheduleRepository
) : Tasklet {
    // ๋ฐฐ์น˜ ์ž‘์—…์—์„œ ์‹ค์ œ๋กœ ์ˆ˜ํ–‰๋  ์ž‘์—… ์ •์˜
    override fun execute(contribution: StepContribution, chunkContext: ChunkContext): RepeatStatus {
        val oneMonthAgo = LocalDateTime.now().minusMonths(1)
        deviceControlScheduleRepository.findAllByUpdatedAtBefore(oneMonthAgo)
            .flatMap{ deviceControlSchedule -> deviceControlScheduleRepository.deleteById(deviceControlSchedule.id!!)}
            .then(Mono.empty<Void>())
            .block()
        return RepeatStatus.FINISHED
    }
}
  • findAllByUpdatedAtBefore(oneMonthAgo) : update๋œ์ง€ ํ•œ๋‹ฌ์ด ์ง€๋‚œ ๋ฐ์ดํ„ฐ ์ฐพ๊ธฐ
  • deleteById() : ํ•ด๋‹นํ•˜๋Š” id๊ฐ’์„ ๊ฐ€์ง„ ๊ฐ์ฒด ์‚ญ์ œํ•˜๊ธฐ
  • .block() : ๋น„๋™๊ธฐ ์ž‘์—…์˜ ๊ฒฐ๊ณผ ๊ธฐ๋‹ค๋ฆฌ๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ ๐Ÿ‘‰ ํ˜„์žฌ ์Šค๋ ˆ๋“œ ์ฐจ๋‹จํ•˜๊ณ  ๊ฒฐ๊ณผ ๋ฐ˜ํ™˜๋ฐ›์Œ
  • return RepeatStatus.FINISHED : ์ƒ์ˆ˜๋ฅผ ๋ฐ˜ํ™˜ํ•˜์—ฌ Spring Batch๋Š” ํ˜„์žฌ ๋‹จ๊ณ„๊ฐ€ ์™„๋ฃŒ๋˜์—ˆ์œผ๋ฉฐ ๋‹ค์Œ ๋‹จ๊ณ„ ์ง„ํ–‰ ๋˜๋Š”  ๋ฐฐ์น˜ ์ž‘์—… ์ข…๋ฃŒํ•  ์ค€๋น„๋˜์—ˆ์Œ์„ ์˜๋ฏธ

 

๐Ÿ”ถ ์Šค์ผ€์ค„๋Ÿฌ ์‚ฌ์šฉํ•ด์„œ ์ฃผ๊ธฐ์ ์œผ๋กœ Batch ์‹คํ–‰์‹œํ‚ค๊ธฐ

  • JobParameters : Spring Batch์˜ Job ์‹คํ–‰ ์‹œ ์ „๋‹ฌ๋˜๋Š” ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ๋ฐฐ์น˜ ์ž‘์—…์˜ ๋™์ž‘ ์ œ์–ด ๐Ÿ‘‰ ํŒŒ์ผ ๊ฒฝ๋กœ, ๋‚ ์งœ, ID ๋“ฑ๊ณผ ๊ฐ™์€ ๋™์  ๊ฐ’์„ ๋ฐฐ์น˜ ์ž‘์—…์— ์ „๋‹ฌ 

  • JobParametersBuilder : JobParameters ๊ฐ์ฒด๋ฅผ ์‰ฝ๊ฒŒ ๊ตฌ์„ฑํ•  ์ˆ˜ ์žˆ๋„๋ก ๋„์™€์ฃผ๋Š” ๋นŒ๋” ํด๋ž˜์Šค
  • JobLauncher : Job ์‹คํ–‰ ๐Ÿ‘‰ ๋ฐฐ์น˜ ์ž‘์—… ์‹œ์ž‘ํ•˜๊ณ  ์ž‘์—… ์‹คํ–‰์˜ ์ƒํƒœ ๊ด€๋ฆฌ ๋ฐ ์ž‘์—… ํŒŒ๋ผ๋ฏธํ„ฐ ์ „๋‹ฌ ๊ธฐ๋Šฅ ์ œ๊ณต

 

 

@Component
class DeviceControlBatchScheduler (
    @Autowired private val jobLauncher: JobLauncher,
    @Autowired private val deleteJob: Job,
){
    private val log = LoggerFactory.getLogger(DeviceControlBatchScheduler::class.java)

    @Scheduled(cron="0 40 * * * ?")
    fun runJob(){
        val jobParameters = JobParametersBuilder()
            .addLong("startTime", System.currentTimeMillis())
            .toJobParameters()

        val jobExecution = jobLauncher.run(deleteJob, jobParameters)
        log.info("Job Execution Status: ${jobExecution.status}")
    }
}

๐Ÿ‘‰ find using query๋ฅผ ๋ณด๋ฉด ํ•œ ๋‹ฌ ์ „์˜ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์˜ค๋Š” ๊ฒƒ์œผ๋กœ ๋ณด์ธ๋‹ค.
๊ฐ€์ ธ์˜จ ํ›„ remove using query๋ฅผ ํ†ตํ•ด ์‚ญ์ œ๋˜๋Š” ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค. 

 

 

 

์˜ค๋ฅ˜

๐Ÿ”ท Could not autowire. No beans of 'JobBuilderFactory' type found.

๐Ÿ‘‰ cache ์‚ญ์ œ ํ›„ ์ •์ƒ ์ž‘๋™

 

 

๐Ÿ”ท Bean ๋“ฑ๋ก ๋ฐ datasource ์˜ค๋ฅ˜

 

์ฒ˜์Œ์—๋Š”

implementation 'org.springframework.boot:spring-boot-starter-batch'

์ด๊ฑธ๋กœ ์˜์กด์„ฑ ์ถ”๊ฐ€๋ฅผ ํ•ด์ฃผ์—ˆ๋Š”๋ฐ dataSource์™€ Bean ๊ด€๋ จํ•ด์„œ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ–ˆ๋‹ค. 

implementation("org.springframework.batch:spring-batch-core:4.3.7")

๐Ÿ‘‰ ์œ„์— ์žˆ๋Š” ๊ฑธ๋กœ ๋ณ€๊ฒฝํ–ˆ๋”๋‹ˆ ์ •์ƒ์ ์œผ๋กœ ์‹คํ–‰๋๋‹ค.

 

๐Ÿ’ฅ์œ„์˜ ๋‘ ์ฐจ์ด์ ์€ ..?

  • spring-boot-starter-batch๋Š” ์ž๋™ ๊ตฌ์„ฑ์„ ์ œ๊ณตํ•˜๊ณ  ๊ธฐ๋ณธ์ ์ธ ๋ฐฐ์น˜ ์ž‘์—… ์„ค์ •์„ ๊ฐ„ํŽธํ•˜๊ฒŒ ํ•  ์ˆ˜ ์žˆ๋‹ค.

https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-batch/3.3.2

  • spring-batch-core
  • spring-boot-starter
  • spring-boot-starter-jdbc

 

  • spring-batch-core๋Š” Spring Batch์˜ ํ•ต์‹ฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋งŒ ํฌํ•จํ•˜๋Š” ์˜์กด์„ฑ์œผ๋กœ, Spring Batch ๊ธฐ๋ณธ ๊ธฐ๋Šฅ๋งŒ ์ œ๊ณตํ•˜๋ฉฐ Spring Boot์˜ ์ž๋™ ๊ตฌ์„ฑ ๊ธฐ๋Šฅ์€ ํฌํ•จ๋˜์–ด์žˆ์ง€ ์•Š์œผ๋ฏ€๋กœ Spring Boot์˜ ์ž๋™ ๊ตฌ์„ฑ, ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์„ค์ • ๋“ฑ์€ ๋ณ„๋„๋กœ ์„ค์ •ํ•ด์•ผํ–ˆ๋‹ค.

 

ํ˜„์žฌ ํ”„๋กœ์ ํŠธ๋Š” ์•ž์„œ ๋งํ–ˆ๋“ฏ์ด mongoDB๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๋‹ค.

ํ•˜์ง€๋งŒ spring-batch๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ RDB๋ฅผ ์‚ฌ์šฉํ•ด ๋ฐฐ์น˜์ž‘์—…์˜ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•˜๊ณ  ๊ด€๋ฆฌํ•œ๋‹ค.

๊ทธ๋Ÿฌ๋ฏ€๋กœ spring-boot-starter-batch๋กœ ์˜์กด์„ฑ์„ ์ถ”๊ฐ€ํ•  ๊ฒฝ์šฐ, spring-boot-starter-jdbc๋กœ ์ธํ•ด RDB๋ฅผ ๊ธฐ๋ณธ์ ์œผ๋กœ ํ™œ์šฉํ•  ๊ฒƒ์œผ๋กœ ์ƒ๊ฐ๋˜์–ด DB๋ฅผ ํ˜ธํ™˜ํ•˜๋Š”๋ฐ ๋ฌธ์ œ๊ฐ€ ์žˆ๋Š” ๊ฒƒ์œผ๋กœ ๋ณด์ธ๋‹ค. 

 

spring-batch-core๋Š” starter์™€ ๋‹ฌ๋ฆฌ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์„ค์ •์„ ๋ณ„๋„๋กœ ํ•ด์•ผํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์•„๋งˆ ์ •์ƒ์ ์œผ๋กœ ์‹คํ–‰๋˜๋Š” ๊ฒƒ ๊ฐ™๊ณ , ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ๋ฅผ RDB ์™ธ์˜ ์ €์žฅ์†Œ์— ์ €์žฅํ•˜๋ ค๋ฉด ์ปค์Šคํ„ฐ๋งˆ์ด์ง•ํ•ด์•ผํ•  ๊ฒƒ ๊ฐ™๋‹ค. 

 

MongoDB๋กœ ์ปค์Šคํ„ฐ๋งˆ์ด์ง•ํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ์ถ”ํ›„์— ์ •๋ฆฌํ•  ์˜ˆ์ •์ด๋‹ค...๐Ÿ™‚

 

 

 

์ฐธ๊ณ ์ž๋ฃŒ

https://d2.naver.com/helloworld/9879422

https://github.com/naver/spring-batch-plus/blob/main/doc/ko/job/delete-metadata-job.md

https://tech.kakaopay.com/post/spring-batch-performance/

https://spring.io/projects/spring-batch

https://docs.spring.io/spring-batch/reference/domain.html