Closed binchoo closed 2 years ago
[spring-batch] 모듈로 제공되는 일괄처리 프레임워크.
일괄처리 어플리케이션
사용자 인터랙션 없이 주기적으로 수행되는 데이터 처리와 관련된 응용들.
ItemReader
와 ItemWriter
를 필수로 요구한다. FlatFileItemReader
: CSV 파일에서 라인을 읽어들이는 역할JdbcBatchItemWriter
: JDBC 소스에 데이터를 쓰는 역할@EnableBatchProcessing
@StepScope
를 갖도록 할 수 있다. 해당 빈이 스텝 내에서 싱글턴으로 존재하도록 한다.jobRepository
, jobLauncher
, jobBuilders
, stepBuilders
인프라 빈들을 생성해 준다.@Configuration
@EnableBatchProcessing
@Import(DataSourceConfig.class)
@ComponentScan("com.apress.prospring5.ch18")
public class BatchConfig {
@Autowired
private JobBuilderFactory jobs;
@Autowired
private StepBuilderFactory steps;
@Autowired DataSource dataSource;
@Autowired ResourceLoader resourceLoader;
@Autowired StepExecutionStatsListener executionStatsListener;
@Bean
public Job job(@Qualifier("step1") Step step1) {
return jobs.get("singerJob").start(step1).build();
}
@Bean
protected Step step1(ItemReader<Singer> reader, ItemProcessor<Singer,Singer> itemProcessor, ItemWriter<Singer> writer) {
return steps.get("step1").listener(executionStatsListener)
.<Singer, Singer>chunk(10)
.reader(reader)
.processor(itemProcessor)
.writer(writer)
.build();
}
@Bean
public ItemReader itemReader() {
FlatFileItemReader itemReader = new FlatFileItemReader();
itemReader.setResource(resourceLoader.getResource("classpath:support/test-data.csv"));
DefaultLineMapper lineMapper = new DefaultLineMapper();
DelimitedLineTokenizer tokenizer = new DelimitedLineTokenizer();
tokenizer.setNames("firstName","lastName","song");
tokenizer.setDelimiter(",");
lineMapper.setLineTokenizer(tokenizer);
BeanWrapperFieldSetMapper<Singer> fieldSetMapper = new BeanWrapperFieldSetMapper<>();
fieldSetMapper.setTargetType(Singer.class);
lineMapper.setFieldSetMapper(fieldSetMapper);
itemReader.setLineMapper(lineMapper);
return itemReader;
}
@Bean
public ItemWriter itemWriter() {
JdbcBatchItemWriter<Singer> itemWriter = new JdbcBatchItemWriter<>();
itemWriter.setItemSqlParameterSourceProvider(new BeanPropertyItemSqlParameterSourceProvider<>());
itemWriter.setSql("INSERT INTO singer (first_name, last_name, song) VALUES (:firstName, :lastName, :song)");
itemWriter.setDataSource(dataSource);
return itemWriter;
}
}
스트림 데이터를 처리하는 소프트웨어 아키텍처.
재사용가능한 필터를 파이프에 배치하여 소프트웨어를 구성한다. ①데이터 소스 ②필터 ③파이프 ④데이터 싱크 4가지 컴포넌트가 등장한다.
데이터가 흘러가도록 각 컴포넌트는 아래 정책 중 하나를 사용한다.
액티브 필터
패시브 파이프가 필요하다. 필터가 파이프에서 데이터를 가져오고, 변환한 데이터를 파이프에 쓴다.
패시브 필터
액티브 파이프가 필요하다. 파이프 쪽에서 필터로 데이터를 넣어주고, 가져간다.
스프링 인티그레이션은 파이프&필터 아키텍처를 구성하여 다양한 유형의 애플리케이션 사이에 메시지 중심의 워크플로를 구축하게 한다. 메시징 프레임워크는 메시지, 채널(파이프), 엔드포인트로(필터) 구성된다.
Message<Object>
자바 객체를 래핑한 메시지 객체. 헤더와 페이로드에는 프레임워크에서 사용하는 메타 데이터가 결합되어, 래핑된 객체의 처리를 결정함.
채널
생산자가 메시지를 보내고, 소비자가 메시지를 수신하는 곳. 파이프&필터 아키텍처의 파이프에 해당함.
엔드포인트
파이프&필터 아키텍처의 필터에 해당한다. 어플리케이션 코드를 메시징 프레임워크에 결합시킨다.
다양한 엔드포인트가 이미 구현되어 있어 다양한 리소스(AMQP, 파일, HTTP, JMX, Sysog, Twitter ...) 와 통합이 가능함. 엔드포인트 서머리
csv 파일 탐지> 배치 잡 요청으로 변환> 파일 내용을 DB 튜플로 변환> DB에 저장
<int:channel id="inbound"/>
<int:channel id="outbound"/>
<int:channel id="loggingChannel"/>
<int-file:inbound-channel-adapter id="inboundFileChannelAdapter" channel="inbound"
directory="file:///C:/Users/wnwoq/integration" filename-pattern="*.csv">
<int:poller fixed-rate="1000"/>
</int-file:inbound-channel-adapter>
<int:transformer input-channel="inbound"
output-channel="outbound">
<bean class="com.apress.prospring5.ch18.MessageToJobLauncher">
<constructor-arg ref="singerJob"/>
<constructor-arg value="file.name"/>
</bean>
</int:transformer>
<batch-int:job-launching-gateway request-channel="outbound" reply-channel="loggingChannel"/>
<int:logging-channel-adapter channel="loggingChannel"/>
주제
18장 스프링 프로젝트 키워드 정리를 읽고 중요✨ 하다고 생각하는 키워드와 선택한 이유에 대해서 코멘트로 달아주세요
연관 챕터
108
@caffeine-library/readers-pro-spring-5