Partitioner와 Multi Thread를 활용한 Spring Batch 성능 개선


8비트 MSX로 컴퓨터를 배웠으나 나의 첫 컴퓨터는 IBM XT였고, 꽤 오랜 기간 DOS를 사용했다. 그래서인지 아직도 배치하면 AUTOEXEC.BAT가 같이 생각난다. 이번에 정리할 내용은 많이 사용하는 스프링 배치의 성능 개선에 대한 것이다.

배경
백엔드 서비스를 운영하는 개발팀은 이미 다양한 배치를 운영하고 있을 것이고, 스프링 배치로 구현되었을 확률이 높다. 많은 배치는 서비스 사용량이 적은 새벽에 실행되고, 서비스가 작을 때는 성능에 민감하지 않아도 괜찮다. 하지만, 서비스가 커지고 배치가 처리해야 하는 데이터의 양이 증가하면서 배치의 실행 시간도 같이 증가할 것이다. 예를 들어 매일 새벽 3시에 시작하는 배치의 실행 시간이 점진적으로 증가하여 9시까지 실행되고 있다면 문제가 될 수 있고, 1시간 주기로 실행되는 배치의 실행 시간이 증가하여 1시간을 넘기면 문제가 된다. 즉, 성능을 개선해야 할 필요가 생긴 것이다. 글의 말미에서 성능 차이를 확인한다.

예제
많은 스프링 배치 예제가 배치 설명에 집중하기 위해 다루기 간편한 파일을 대상으로 I/O를 구성하고 인메모리 데이터 변환 정도로 예제를 구성한다. 하지만, 실무에서는 여러 데이터베이스와 외부 API를 사용하며 실행되는 배치들도 많다. DB를 대상으로 배치를 구성하면 배치의 성능을 개선했을 때 DB의 성능 그래프가 다르게 그려지는 것을 시각적으로 간단히 확인할 수 있다는 장점도 있다. 아래에서 볼 것이다. 하여, 이번 포스팅에서 다루는 내용의 프로젝트는 예제 치고는 크지만, 실무에서 자주 볼 수 있는 구성으로 만들었고 아래와 같다.

프로젝트 구성
* MySQL 8.3 - Docker Compose 3.1
* Source Database - UserNames
* Target Database - Nicknames
* Spring Boot Web 2.7
* Nickname Generator API Server
* Spring Batch 4.3 - Spring Boot 2.7
* DBInitializerBatch
* MigrationBatch

코드는 모두 GitHub에 올라가 있다.
SpringBatchMultiThreadedPartitions Repository에는 2개의 Batch의 코드와 Docker Compose 구성이 있다.
NicknameGeneratorAPI Repository에는 API 서버의 코드가 있다.

이 글에서 다루는 범위
배치 예제치고는 프로젝트 구성이 복잡해진 만큼 사용된 기술 스택이 많아졌다. 이 글을 읽는 데 필요한 배경지식으로 Java, Multi Thread, Spring Framework, Spring Batch, JPA, REST API, Docker Compose, Gradle에 대한 기본적인 내용을 이해하고 있으며 Docker Compose는 설치되어 있다고 가정한다. NicknameGeneratorAPI에 대한 내용은 설명하지 않고, JPA 관련 설명도 하지 않는다. SpringBatchMultiThreadedPartitions 예제에서 job 패키지에 대한 부분을 전체가 아닌 코드 조각을 가지고 중요한 부분만 설명하는 정도로 정리한다. 2개의 예제 프로젝트에는 21개의 테스트가 준비되어 있으니 참고 바란다.

...후략...

https://prostars.net/357

#스프링배치 #SpringBatch #스프링부트 #SpringBoot #성능 #최적화 #멀티스레드 #MultiThread #파티셔너 #Partitioner #포스팅

Partitioner와 Multi Thread를 활용한 Spring Batch 성능 개선

I'm Prostars

Partitioner와 Multi Thread를 활용한 Spring Batch 성능 개선

다음 내용이 궁금하다면?

또는

이미 회원이신가요?

2024년 5월 21일 오후 12:19

댓글 0

    함께 읽은 게시물

    이젠 Claude 모델이 그렇게 압도적으로 좋은 건 아닌데, Claude Code는 진짜 분명하게 좋음. 아마도 프롬프트가 잘 되어 있어서 그런 것 같음. Claude의 다른 프롬프트들은 공개해뒀는데 Claude Code용 프롬프트는 공개를 안해줌. 역시 아무리 투명하게 공개한다고 해도 진짜 좋은 건 다 기업비밀임..


    첫 회사보다 중요한 것

    ... 더 보기

    - YouTube

    undefined

     - YouTube

    넷플릭스는 왜 WebFlux를 사용하지 않을까?

    ... 더 보기

    넷플릭스는 왜 WebFlux를 사용하지 않을까?

    kr.linkedin.com

    넷플릭스는 왜 WebFlux를 사용하지 않을까?

    나는 종종 생산성을 올리기 위한 각종 개발 툴은 물론, 라이브러리나 소스 코드를 구매하기도 한다.


    소스 코드의 경우 실제로 써먹지 못하는 경우도 상당수 되긴 하지만, 그래도 구성이나 코드를 보면서 배우는게 있기 때문에 학습 비용이라고 생각하고 가끔 구매하는 편이다.


    ... 더 보기

    토스 데이터 직군 집중 채용 - 면접만 봐도 100만원!

    ... 더 보기

    토스 DATA·ML 집중채용

    toss.im

    토스 DATA·ML 집중채용

    ChatGPT의 GPT-5 Pro와 API의 GPT-5 High는 완전히 수준이 다르네요.


    그냥 GPT-5나 GPT-5 Thinking이 GPT-4.5정도의 느낌이라면, Pro, High는 진정한 GPT-5라고 느껴짐.

    조회 1,493