caffeine-library / pro-spring-5

🌱 전문가를 위한 스프링5를 읽는 스터디
5 stars 0 forks source link

[keyword] 18장 스프링 프로젝트 키워드 정리 #109

Closed binchoo closed 2 years ago

binchoo commented 2 years ago

주제

18장 스프링 프로젝트 키워드 정리를 읽고 중요✨ 하다고 생각하는 키워드와 선택한 이유에 대해서 코멘트로 달아주세요

연관 챕터

108

@caffeine-library/readers-pro-spring-5

binchoo commented 2 years ago

스프링 배치

[spring-batch] 모듈로 제공되는 일괄처리 프레임워크.

일괄처리 어플리케이션

사용자 인터랙션 없이 주기적으로 수행되는 데이터 처리와 관련된 응용들.

배치 잡 자바 구성

image

@EnableBatchProcessing

자바 구성 예

@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가지 컴포넌트가 등장한다. image

데이터가 흐르는 방식

데이터가 흘러가도록 각 컴포넌트는 아래 정책 중 하나를 사용한다.

필터의 종류

스프링 인티그레이션

스프링 인티그레이션은 파이프&필터 아키텍처를 구성하여 다양한 유형의 애플리케이션 사이에 메시지 중심의 워크플로를 구축하게 한다. 메시징 프레임워크는 메시지, 채널(파이프), 엔드포인트로(필터) 구성된다.

예제 파이프라인

csv 파일 탐지> 배치 잡 요청으로 변환> 파일 내용을 DB 튜플로 변환> DB에 저장 image

<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"/>
binchoo commented 2 years ago

https://gist.github.com/staltz/868e7e9bc2a7b8c1f754