[Spring Batch] Paging ๊ธฐ๋ฐ˜์˜ ItemReader ์‚ฌ์šฉ ์‹œ ๋ฐœ์ƒํ•˜๋Š” ๋ฐ์ดํ„ฐ ๊ฑด๋„ˆ๋›ฐ๊ธฐ ํ˜„์ƒ (ํ•ด๊ฒฐ ๋ฐฉ๋ฒ• 2๊ฐ€์ง€)

1. ๋ฌธ์ œ ์ƒํ™ฉ

๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ๊ธฐ์ค€์œผ๋กœ ItemReader์˜ ๊ตฌํ˜„์ฒด๋ฅผ ๋‚˜๋ˆŒ ๋•Œ, Cursor Based ItemReader๊ณผ Paging Based ItemReader์œผ๋กœ ๋‚˜๋ˆŒ ์ˆ˜ ์žˆ๋‹ค.

 

Cursor ๊ธฐ๋ฐ˜์˜ ItemReader์˜ ๊ฒฝ์šฐ, ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ปค๋„ฅ์…˜์„ ์ง€์†์ ์œผ๋กœ ๋…์ ์œผ๋กœ ์‚ฌ์šฉํ•˜์—ฌ ์ฒ˜๋ฆฌ๊ฐ€ ์™„๋ฃŒ๋˜๋Š” ์‹œ์ ๊นŒ์ง€ ์ปค๋„ฅ์…˜์„ ๋†“์•„์ฃผ์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์—, ๊ฒฝ์šฐ์— ๋”ฐ๋ผ ์„ฑ๋Šฅ์ƒ์— ์˜ํ–ฅ์„ ์ค„ ์ˆ˜ ์žˆ๋‹ค.

 

๋”ฐ๋ผ์„œ Paging ๊ธฐ๋ฐ˜์˜ ItemReader๋ฅผ ์„ ํƒํ–ˆ๊ณ  ์ตœ๊ทผ์— ์Šค์ผ€์ค„๋Ÿฌ์™€, ๋ฐฐ์น˜ ๋กœ์ง์„ ๊ฐœ๋ฐœํ–ˆ๋‹ค. 

ํ•˜์ง€๋งŒ ์‹ค์ œ ๋กœ์ง ์ˆ˜ํ–‰ ๊ฒฐ๊ณผ๋Š” ์›ํ•˜๋Š”๋ฐ๋กœ ๋˜์ง€ ์•Š์•˜๊ณ , ๋ช‡ ๊ฐœ์˜ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฑด๋„ˆ๋›ด์ฑ„๋กœ ์ˆ˜ํ–‰๋˜์—ˆ๋‹ค. 

 

 

 

๋‚˜์˜ ๋ฐฐ์น˜ ๋กœ์ง์€ ํŠน์ • ์กฐ๊ฑด์„ ๋งŒ์กฑํ•˜๋ฉด PENDING ์ค‘์ด๋˜ Apply๋ฅผ CANCELED๋กœ ๋ณ€๊ฒฝํ•ด์ฃผ๋Š” ๊ฒƒ์ด๋‹ค. ์‚ฌ์ง„์—์„œ work_date_id๊ฐ€ 1์ธ ๋ฐ์ดํ„ฐ๋Š” ์ „๋ถ€ CANCELED๋กœ ๋ณ€๊ฒฝ๋˜์•ผ ํ•˜์ง€๋งŒ 4๊ฐœ์˜ ๋ฐ์ดํ„ฐ ์ค‘ 2๊ฐœ๋งŒ ๋ฐ”๋€ ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ๋‹ค. 

 

 

 

 

 

 

2. ์›์ธ

์›์ธ์€ ๋ณ€๊ฒฝ๋œ ๋ฐ์ดํ„ฐ ๋•Œ๋ฌธ์ด๋‹ค. 

 

 

๋งŒ์•ฝ ์•„๋ž˜์˜ ์ฟผ๋ฆฌ๋ฅผ ๋‚ ๋ฆฐ๋‹ค๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์กฐํšŒ๋  ๊ฒƒ์ด๋‹ค.

SELECT * FROM Pay 
WHERE successStatus = false 
offset 0 limit 10

 

 

์ด ์กฐํšŒ๋œ ๋ฐ์ดํ„ฐ๋ฅผ Update ํ•ด๋ณด์ž.
์—ฌ๊ธฐ์„œ ์ค‘์š”ํ•œ ๊ฒƒ์€ ์กฐํšŒํ•œ ๋ฐ์ดํ„ฐ๋ฅผ Updateํ•  ๋•Œ ๋ณ€๊ฒฝ๋œ ํ•„๋“œ๊ฐ€ ์กฐํšŒํ•  ๋•Œ ์กฐ๊ฑด์— ์‚ฌ์šฉ๋˜๋Š” ๊ฒƒ์ด๋‹ค.


์ด Update๋กœ ์ธํ•ด์„œ ์ด์ œ ํ…Œ์ด๋ธ”์—๋Š” false์ธ ๋ฐ์ดํ„ฐ๊ฐ€ 40๊ฐœ๋งŒ ์กด์žฌํ•œ๋‹ค.

 

 

์ด ์ƒํƒœ์—์„œ ๋‹ค์Œ Paging ์ฟผ๋ฆฌ๋ฅผ ์‹คํ–‰ํ•œ๋‹ค๋ฉด ์–ด๋–ป๊ฒŒ ๋ ๊นŒ??

SELECT * FROM Pay 
WHERE successStatus = false 
offset 11 limit 10

 

 

์กฐํšŒ ๊ฒฐ๊ณผ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

 

40๊ฐœ ๋ฐ์ดํ„ฐ์—์„œ 11๋ฒˆ์งธ ๋ถ€ํ„ฐ์ธ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์˜ค๊ฒŒ ๋œ๋‹ค.

 

์•ž์„œ ์‹คํ–‰๋œ ์ฟผ๋ฆฌ์—์„œ ๋Œ€์ƒ์„ Updateํ•˜์—ฌ ์ œ์™ธ๋˜์–ด ์‹ค์ œ๋กœ 21๋ฒˆ์งธ์ธ ๋ฐ์ดํ„ฐ๊ฐ€ 11๋ฒˆ์งธ ๋ฐ์ดํ„ฐ๋กœ ์กฐํšŒ๊ฐ€ ๋ฉ๋‹ˆ๋‹ค.

 

๊ทธ๋Ÿฌ๋‹ค๋ณด๋‹ˆ 11๋ฒˆ์งธ ๋ฐ์ดํ„ฐ๋ถ€ํ„ฐ 20๋ฒˆ์งธ๊นŒ์ง€ ๋ฐ์ดํ„ฐ๊ฐ€ ์กฐํšŒ๋˜์ง€ ์•Š๋Š”๋‹ค.

 

 

 

 

 

3. ํ•ด๊ฒฐ ๋ฐฉ์•ˆ

 

1. Cursor ์ด์šฉ

๊ฐ€์žฅ ๊ฐ„๋‹จํ•œ ํ•ด๊ฒฐ ๋ฐฉ์•ˆ์€ cursor ๊ธฐ๋ฐ˜ read ๋ฐฉ์‹์œผ๋กœ ๋ณ€๊ฒฝํ•˜๋Š” ๊ฒƒ์ด๋‹ค. 

Cursor๋Š” ํ•œ๋ฒˆ ์ปค๋„ฅ์…˜์„ ๋งบ๊ณ  Database Cursor๋ฅผ ์˜ฎ๊ธฐ๋Š” ๋ฐฉ์‹์ด๊ธฐ ๋•Œ๋ฌธ์— ์•ž์„œ ์กฐํšŒํ–ˆ๋˜ ๊ฒฐ๊ณผ๊ฐ€ ๋ฐ”๋€๋‹ค๊ณ  ๋‹ค์Œ ์กฐํšŒ์— ์˜ํ–ฅ์„ ๋ฏธ์น˜์ง€ ์•Š๋Š”๋‹ค.

 

Paging ๊ธฐ๋ฐ˜์˜ ์ด์ ์„ ์‚ด๋ฆฌ๋ฉด์„œ ์กฐํšŒํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์€ ์—†์„๊นŒ??

PagingReader ์˜ค๋ฒ„๋ผ์ด๋”ฉ์„ ํ†ตํ•ด ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋‹ค. 

 

2. PagingReader ์ปค์Šคํ…€

Update๋ ๋•Œ๋งˆ๋‹ค ๋Œ€์ƒ ๋ฐ์ดํ„ฐ ๋ฒ”์œ„๊ฐ€ ์ค„์–ด๋“œ๋‹ˆ, ์ผ๋ถ€๋Ÿฌ Page ๋ฒˆํ˜ธ๋ฅผ ๊ณ„์† ๋ณ€๊ฒฝ์‹œํ‚ค์ง€ ์•Š๊ณ  0๋ฒˆ์งธ๋กœ ๊ณ ์ •์‹œํ‚ค๋Š” ๊ฒƒ์ด๋‹ค. 

 

    @Bean
    public ItemReader<Apply> applyReader() {
        LocalDate tomorrow = LocalDate.now().plusDays(1);
        JpaPagingItemReader<Apply> reader = new JpaPagingItemReader<>() {
            @Override
            public int getPage() {
                return 0;
            }
        };
        reader.setName("applyReader");
        reader.setPageSize(1);
        reader.setEntityManagerFactory(entityManagerFactory);
        reader.setQueryString("select a from Apply a join fetch a.workDate w join fetch a.member m join fetch a.workDate.jobPost j where w.workDate <= :tomorrow and a.status = 'PENDING'");
        Map<String, Object> parameters = new HashMap<>();
        parameters.put("tomorrow", tomorrow);
        reader.setParameterValues(parameters);
        return reader;
    }

 

๋ชจ๋“  ์ฟผ๋ฆฌ์—์„œ ์•„๋ž˜ ์‚ฌ์ง„๊ณผ ๊ฐ™์ด offset์ด 0์œผ๋กœ ๊ณ ์ •๋๊ณ  ๊ฑด๋„ˆ ๋›ฐ๋Š” ํ˜„์ƒ ์—†์ด ๋ชจ๋“  ๋ฐ์ดํ„ฐ๊ฐ€ ์ •์ƒ์ ์œผ๋กœ ๋ฐ”๋€Œ๋Š” ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์—ˆ๋‹ค. 

 

 

 

 

 

 

 

4. ๊ฒฐ๋ก 

DB Connection ์‹œ๊ฐ„๊ณผ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ๊ณ ๋ คํ–ˆ์„ ๋•Œ๋Š” Paging ๋ฐฉ๋ฒ•์ด ๋” ์ข‹๋‹ค. ๋ฌผ๋ก  ์„œ๋ฒ„๊ฐ€ Connection ์‹œ๊ฐ„๊ณผ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ๋ฐ›์ณ์ค„ ์ˆ˜ ์žˆ๋‹ค๋ฉด Cursor๋ฐฉ์‹์ด ๋” ๊ฐ„ํŽธํ•˜๊ณ  ๋น ๋ฅด๊ณ  ์ข‹์€ ๊ฒƒ ๊ฐ™๋‹ค.

 

๋‹ค๋งŒ, Paging์„ ์„ ํƒํ•  ๊ฒฝ์šฐ ์ •๋ ฌ, ๋ˆ„๋ฝ ๋ฐ์ดํ„ฐ ๋“ฑ์— ์‹ ๊ฒฝ์“ฐ๋ฉด์„œ ๊ฐœ๋ฐœํ•ด์•ผ ํ•œ๋‹ค.