728x90
프로젝트를 진행하다가 Chunk는 멀티스레딩 방식이기 때문에 동시성 문제가 발생할 것이라 생각하여 Tasklet 방식으로 선회하려고 했다. 그런데 chunk방식이나 tasklet 방식이나 싱글쓰레드 방식이라고 한다. 그렇다면 왜 속도차이가 발생하는 것일까? Chunk 방식과 Tasklet 방식에 대해 먼저 살펴본다.
데이터 처리 방식
Chunk

- chunk는 spring batch의 가장 일반적인 구현방식으로 데이터를 read하여 각 “chunk”를 만들어내고 프로세스를 수행한 후 write단계에서 저장한다.

- 좀 더 자세히 표햔하면 위 그림과 같다. ItemRedaer에서 chunk의 크기만큼 데이터를 읽어 Read 하고 Processor 단계에서 비즈니스 로직을 처리한 후 write단계에서 저장한다.
- 즉 chunk방식은 Read → Process → write 단계를 새분화하여 데이터가 처리된다.
Tasklet
- chunk 방식에 비해 Tasklet 방식은 자유롭다. Read, process, write 단계를 따르지 않고 하나의 class 파일이 실행된다. 마음대로 값을 읽을 수 있고 마음대로 저장할 수 있다.
Commit 단위
- chunk는 한 chunk단위가 끝날 때 마다 커밋이 일어난다. 즉 1000개의 데이터를 chunk-size = 100 으로 처리했다면 100개의 데이터씩 총 10번의 커밋이 일어난다.
- tasklet은 하나의 클래스파일이 끝날 때 커밋이 일어난다. 즉 1000개의 데이터를 처리했다면 1번에 1000개의 데이터가 커밋된다.
왜 chunk가 빠를까?
- chunk / tasklet의 차이는 역할을 새분화한 것 말고는 없어보이는데 왜 차이가 발생할까? 게다가 두 방식 모두 멀티쓰레드 방식이 아니다! 그저 데이터를 처리하는 방식때문이다.
JDBC Batch 기능 활용
- JdbcBatchItemWriter는 내부적으로 PreparedStatement.addBatch() → executeBatch() 호출한다. 이것은 여러 SQL을 한 번에 서버로 전송해 네트워크 왕복 횟수와 DB 커넥션 오버헤드를 최소화해준다.
- 100개의 insert할 데이터들이 write단계에 들어온다. 이 때 단 건 insert하는 것이 아니라 일괄로 처리해버린다는 의미이다.
요약
- Tasklet, chunk 모두 싱글스레드 방식이다.
- 유사한 업무를 반복처리해야하는 경우는 chunk, 여러 분기처리 및 처리데이터가 적으면 tasklet 사용
- chunk의 write가 빠른 것은 JDBC Batch 기능을 활용한 일괄처리(Bulk) 방식을 사용하기 때문이다.
'개발 > Spring Boot' 카테고리의 다른 글
| [Spring Batch] 5.0 버전에서 달라진 점과 기본 예제 (0) | 2025.03.23 |
|---|---|
| [SpringBoot] Github Action을 사용한 BlueGreen배포 (0) | 2024.12.12 |
| [SpringBoot] Github Action을 사용한 jar빌드 후 전송 (0) | 2024.12.11 |
| [Spring Security] 수동 로그인 구현하기 (0) | 2024.10.29 |
| [Spring Security] 스프링시큐리티의 기본 로그인을 사용하지 못했던 문제 (0) | 2024.10.27 |