๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
Spring/Batch

์Šคํ”„๋ง ๋ฐฐ์น˜๊ฐ€ ์ œ๊ณตํ•˜๋Š” ๊ธฐ๋ณธ ItemReader ์ƒ์†ํ•ด์„œ ์‚ฌ์šฉํ•˜๊ธฐ

by ํ‘์‹œ๋ฐ” 2023. 9. 10.

๐Ÿค” ๋ฐฐ๊ฒฝ

ํ”„๋กœ์ ํŠธ ๋ฐฐ์น˜ ๋ชจ๋“ˆ ๊ฐœ๋ฐœ ์ปจ๋ฒค์…˜์„ ์ •ํ•˜๋Š” ๊ณผ์ •์—์„œ ์ฒ˜์Œ์— Job ์„ค์ • ํŒŒ์ผ์— ๊ด€๋ จ๋œ ๋ชจ๋“  Bean(Job, Step, ItemReader, ๋“ฑ)์„ ๋„ฃ์ž๊ณ  ํ–ˆ์„ ๋•Œ "๊ทธ๋Ÿฌ๋ฉด Chunk ๊ธฐ๋ฐ˜ Step์„ ๊ตฌ์„ฑ ์ค‘์— ItemReader์™€ ItemWriter ์ค‘ ํ•˜๋‚˜๋Š” ์Šคํ”„๋ง์—์„œ ์ œ๊ณตํ•˜๋Š” ๊ธฐ๋ณธ์ ์ธ ํด๋ž˜์Šค๋ฅผ ์‚ฌ์šฉํ•˜๊ณ , ํ•˜๋‚˜๋Š” ๊ธฐ๋Šฅ์ด ๋ณต์žกํ•ด์„œ ๋ณ„๋„๋กœ ๋งŒ๋“ ๋‹ค๊ณ  ํ•˜๋ฉด ์–ด๋–ป๊ฒŒ ํ•˜๋Š” ๊ฒŒ ์ข‹์„๊นŒ?" ๋ผ๋Š” ์งˆ๋ฌธ์ด ๋‚˜์™”๋‹ค.

 

์˜ˆ๋ฅผ ๋“ค๋ฉด, ItemReader๋Š” ๊ตฌํ˜„์ด ๋‹จ์ˆœํ•ด์„œ FlatFileItemReader๋ฅผ ์‚ฌ์šฉํ•˜๊ณ , Writer๋Š” ๋ณต์žกํ•ด์„œ ๋ณ„๋„ ํด๋ž˜์Šค์— ItemWriter๋ฅผ ๊ตฌํ˜„ํ•œ๋‹ค๋Š” ์˜๋ฏธ์ด๋‹ค.

 

ํ•ด๋‹น ์งˆ๋ฌธ์„ ๋“ฃ๊ณ  ๋‚˜๋Š” "ItemReader๋Š” ์„ค์ • ํŒŒ์ผ์— Bean์œผ๋กœ ๋“ฑ๋กํ•˜๊ณ , Writer๋Š” ๋ณ„๋„ ํด๋ž˜์Šค๋กœ ๋นผ๋Š” ๊ฒŒ ๋งž๋Š” ๊ฑธ๊นŒ?" ์ด๋Ÿฐ ์˜๋ฌธ์ด ๋“ค๋ฉด์„œ "๋งŒ์•ฝ, ์Šคํ”„๋ง์—์„œ ์ œ๊ณตํ•˜๋Š” ๊ธฐ๋ณธ ๋ฐฐ์น˜ ํด๋ž˜์Šค๋ฅผ Bean์œผ๋กœ ๋“ฑ๋กํ•˜์ง€ ์•Š๊ณ  ์ƒ์†ํ•ด์„œ ๊ตฌํ˜„ํ•˜๋ ค๋ฉด ์–ด๋–ป๊ฒŒ ํ•ด์•ผ ํ• ๊นŒ?"๋ผ๋Š” ๊ณ ๋ฏผ์„ ํ•˜๊ฒŒ ๋˜์—ˆ๋‹ค.

 

    @Bean
    @StepScope
    public FlatFileItemReader<FileItem> blackShibaItemReader(@Value("#{jobParameter[filePath]}") String filePath) {
        DefaultLineMapper<FileItem> lineMapper = new DefaultLineMapper<>();
        DelimitedLineTokenizer tokenizer = new DelimitedLineTokenizer();

        tokenizer.setNames("id","name","address");
        lineMapper.setLineTokenizer(tokenizer);
        lineMapper.setFieldSetMapper(fieldSet -> {
            int id = fieldSet.readInt("id");
            String name = fieldSet.readString("name");
            String address = fieldSet.readString("address");

            return new FileItem(id,name,address);
        });

        return new FlatFileItemReaderBuilder<FileItem>()
                .name("blackShibaItemReader")
                .encoding("UTF-8")
                .resource(new ClassPathResource(filePath))
                .linesToSkip(1)
                .lineMapper(lineMapper)
                .build();
    }

 

์œ„ ์ฝ”๋“œ์ฒ˜๋Ÿผ Bean์œผ๋กœ ๋“ฑ๋กํ•˜๋Š” FlatFileItemReader๋ฅผ ๋ณ„๋„ ํด๋ž˜์Šค๋กœ ์ƒ์†๋ฐ›์•„์„œ ๊ตฌํ˜„ํ•˜๋ ค๋ฉด ์–ด๋–ป๊ฒŒ ํ•ด์•ผ ํ• ๊นŒ?

๊ทธ๋ฆฌ๊ณ  ์ด๋Ÿฐ ๊ฒฝ์šฐ์— JobParameter๋Š” ์–ด๋–ป๊ฒŒ ์ฃผ์ž…ํ•ด ์ค„ ์ˆ˜ ์žˆ์„๊นŒ?

 

@Component
@StepScope
public class BlackShibaItemReader extends FlatFileItemReader<FileItem> {

    public BlackShibaItemReader(@Value("#{jobParameter[filePath]}") String filePath) {
        super();

        DefaultLineMapper<FileItem> lineMapper = new DefaultLineMapper<>();
        DelimitedLineTokenizer tokenizer = new DelimitedLineTokenizer();

        tokenizer.setNames("id","name","address");
        lineMapper.setLineTokenizer(tokenizer);
        lineMapper.setFieldSetMapper(fieldSet -> {
            int id = fieldSet.readInt("id");
            String name = fieldSet.readString("name");
            String address = fieldSet.readString("address");

            return new FileItem(id,name,address);
        });

        setName("blackShibaItemReader");
        setEncoding("UTF-8");
        setResource(new ClassPathResource(filePath));
        setLinesToSkip(1);
        setLineMapper(lineMapper);
    }
}

 

์Šคํ”„๋ง ๋ฐฐ์น˜๊ฐ€ ๊ธฐ๋ณธ์œผ๋กœ ์ œ๊ณตํ•˜๋Š” ํด๋ž˜์Šค์—์„œ๋Š” setter๋ฅผ ํ†ตํ•ด์„œ ์ฃผ์ž…์ด ๊ฐ€๋Šฅํ•˜๋„๋ก ๊ธฐ๋Šฅ์„ ์ง€์›ํ•˜๊ณ  ์žˆ๋‹ค.

๋”ฐ๋ผ์„œ ์ƒ์„ฑ์ž ๋‹จ์—์„œ ๋™์ผํ•œ ๊ธฐ๋Šฅ์„ setter๋ฅผ ํ†ตํ•ด ์„ค์ •ํ•˜๋ฉด ๋œ๋‹ค.

 

๋งŒ์•ฝ JobParameter ๋“ฑ์„ ์ฃผ์ž…๋ฐ›๋Š” ๊ฒฝ์šฐ @StepScope ์–ด๋…ธํ…Œ์ด์…˜์„ ํด๋ž˜์Šค ๋‹จ์— ์„ค์ •ํ•ด์•ผ ํ•œ๋‹ค.

๋Œ“๊ธ€