단일스레드 vs 멀티스레드 단일 스레드 : 프로세스 내 특정 작업을 처리하는 스레드가 하나인 경우 멀티 스레드 : 프로세스 내 특정 작업을 처리하는 스레드가 여러개인 경우 작업 처리에 있어서 단일 스레드와 멀티 스레드의 선택 기준은 "어떤 방식이 자원을 효율적으로 사용하고 성능 처리에 유연한가" 이다. 일반적으로 복잡한 처리나 대용량 데이터를 다루는 작업일 경우 전체 소요 시간 및 성능상의 이점을 가져오기 위해 멀티 스레드 방식을 선택한다. 멀티 스레드 처리 방식은 데이터 동기화 이슈가 존재하기 때문에 최대한 고려해서 결정해야한다. 스프링 배치 스레드 모델 스프링 배치는 기본적으로 단일 스레드 방식으로 작업을 처리한다. 성능 향상과 대규모 데이터 작업을 위한 비동기 처리 및 Scale out 기능을 제공..
ItemReaderAdapter SpringBatch에서 Job 안에 이미 있는 DAO나 다른 서비스를 ItemReader 안에서 사용하고자 할 때 위임 역할을 한다. Adapter 패턴을 도입하여 지정한 서비스를 호출하도록 한다. Job 생성 ItemReaderAdapterConfiguration.java package com.project.springbatch._57_readerAdapter; import lombok.RequiredArgsConstructor; import org.springframework.batch.core.Job; import org.springframework.batch.core.Step; import org.springframework.batch.core.configurat..
Paging 방식 페이징 단위로 데이터를 조회하는 방식으로 Page Size만큼 한번에 메모리로 가지고 온 다음 한개씩 읽는다. 한 페이지를 읽을때마다 Connection을 맺고 끊기 때문에 대량의 데이터를 처리하더라도 SocketTimeout 예외가 거의 발생하지 않는다. 시작 행 번호를 지정하고 페이지에 반환시키고자 하는 행의 수를 지정한 후 사용한다. (offset-limit) 페이징 단위의 결괌나 메모리에 할당하기 때문에 메모리 사용량이 적다. Connection 연결 유지 기간이 길지 않고 메모리 공간을 효율적으로 새용해야하는 데이터 처리에 적합하다. JdbcPagingItemReader Paging 기반의 JDBC 구현체로써, 쿼리에 시작 행 번호(offset)와 페이지에서 반환할 행수(lim..
Cursor 방식 JDBC ResultSet의 기본 메커니즘을 사용한다. 현재 행에 커서를 유지하며 다음 데이터를 호출하면 다음 행으로 커서를 이동하며 데이터 반환이 이루어진다. (Streaming 방식) ResultSet이 open()될 때마다 next()가 호출되어 Database의 데이터가 반환되고 객체와 매핑이 이루어진다. DB Connection이 연결되면 배치 처리가 완료될 때까지 데이터를 읽어오기 때문에 DB와 SocketTimeout을 충분한 값으로 설정해야한다. 모든 결과를 메모리에 할당하므로 메모리 사용량이 많다. Connection 연결 유지 시간과 메모리 공간이 충분하다면 대량의 데이터 처리에 적합할 수 있다. JdbcCursorItemReader Cursor 기반의 JDBC 구현체..
Xml 파일 읽어오기 resources/item51/customer.xml 1 hong gil dong1 40 2 hong gil dong2 42 3 hong gil dong3 43 Customer.java package com.project.springbatch._52_reader_json; import lombok.AllArgsConstructor; import lombok.Data; @Data @AllArgsConstructor public class Customer { private final long id; private final String name; private final int age; } build.gradle implementation 'org.springframework:sprin..
Job 생성 FlatFileConfiguration.java package com.project.springbatch._47_reader_FlatFiles; import lombok.RequiredArgsConstructor; import org.springframework.batch.core.Job; import org.springframework.batch.core.Step; import org.springframework.batch.core.configuration.annotation.JobBuilderFactory; import org.springframework.batch.core.configuration.annotation.StepBuilderFactory; import org.springfr..
Job 생성 ItemStreamConfiguration.java package com.project.springbatch._41_itemStream; import com.project.springbatch._41_itemStream.custom.CustomItemStreamReader; import com.project.springbatch._41_itemStream.custom.CustomItemStreamWriter; import lombok.RequiredArgsConstructor; import org.springframework.batch.core.Job; import org.springframework.batch.core.Step; import org.springframework.batch.c..
Job 생성 ItemConfiguration.java import com.project.springbatch._40_item.custom.CustomItemProcessor; import com.project.springbatch._40_item.custom.CustomItemReader; import com.project.springbatch._40_item.custom.CustomItemWriter; import com.project.springbatch._40_item.custom.Customer; import lombok.RequiredArgsConstructor; import org.springframework.batch.core.Job; import org.springframework.batc..
1번째 Job 생성 ChunkConfiguration.java import lombok.RequiredArgsConstructor; import org.springframework.batch.core.Job; import org.springframework.batch.core.Step; import org.springframework.batch.core.StepContribution; import org.springframework.batch.core.configuration.annotation.JobBuilderFactory; import org.springframework.batch.core.configuration.annotation.StepBuilderFactory; import org.sprin..
Job 생성 JobExecutionDeciderConfiguration.java import lombok.RequiredArgsConstructor; import org.springframework.batch.core.Job; import org.springframework.batch.core.Step; import org.springframework.batch.core.StepContribution; import org.springframework.batch.core.configuration.annotation.JobBuilderFactory; import org.springframework.batch.core.configuration.annotation.StepBuilderFactory; import..
Job 생성 CustomExitStatusConfiguration.java import lombok.RequiredArgsConstructor; import org.springframework.batch.core.ExitStatus; import org.springframework.batch.core.Job; import org.springframework.batch.core.Step; import org.springframework.batch.core.StepContribution; import org.springframework.batch.core.configuration.annotation.JobBuilderFactory; import org.springframework.batch.core.conf..
Job 생성 import lombok.RequiredArgsConstructor; import org.springframework.batch.core.Job; import org.springframework.batch.core.Step; import org.springframework.batch.core.StepContribution; import org.springframework.batch.core.configuration.annotation.JobBuilderFactory; import org.springframework.batch.core.configuration.annotation.StepBuilderFactory; import org.springframework.batch.core.job.bu..