배치 애플리케이션의 성능 문제는 대개 특정 시점에 갑자기 발생하기보다, 서비스 운영 기간이 길어질수록 점진적으로 드러나는 경우가 많습니다. 초기에는 정상적으로 동작하던 작업이 데이터 규모 증가와 함께 실행 시간이 길어지고, 어느 순간부터 CPU 사용률이 지속적으로 높아지거나 메모리 사용량이 안정적으로 회수되지 않는 상황이 반복됩니다. 이후 GC 빈도가 증가하고, 배치 수행 시간이 예측하기 어려운 상태가 되면서 구조적인 개선 필요성이 제기됩니다. 이 시점에서 많은 팀이 Spring Batch 도입을 검토하게 됩니다. 다만 Spring Batch를 단순히 성능 개선 도구로 이해하면 기대와 다른 결과를 얻을 수 있습니다. Spring Batch는 처리 속도를 직접 높여주는 라이브러리가 아니라, 대용량 데이터를..
Spring 기반 API 서버를 운영하다 보면 일정 주기로 수행해야 하는 작업이 자연스럽게 등장합니다. 오래된 데이터 정리, 통계 집계, 외부 시스템 동기화, 상태 갱신과 같은 작업들은 대부분 실시간 요청 처리와는 다른 흐름으로 수행됩니다. 이런 요구가 처음 등장할 때 가장 손쉽게 선택되는 방법이 바로 Spring Framework에서 제공하는 @Scheduled 어노테이션 기반 스케줄 작업입니다. 별도의 인프라를 구성하지 않아도 되고, 기존 애플리케이션 내부에서 간단하게 작업을 등록할 수 있다는 점에서 @Scheduled 방식은 매우 실용적인 출발점이 됩니다. 그러나 API 서버가 성장하고 트래픽과 데이터 규모가 커지면서, 스케줄 작업이 단순한 보조 기능이 아니라 중요한 데이터 처리 흐름으로 발전하는 ..
JPA EntityListener 라이프사이클 이해와 권장 가이드를 따르는 접근 JPA EntityListener는 엔티티의 생명주기 이벤트에 반응할 수 있는 공식적인 확장 지점입니다. 엔티티가 저장되거나 수정되는 시점에 후처리를 결합할 수 있다는 점에서 편리해 보이지만, 실제 운영 환경에서는 이 기능이 예상치 못한 예외로 이어지는 경우가 있습니다. 대표적인 사례가 ConcurrentModificationException입니다. 이 글은 JPA EntityListener 사용 중 발생한 ConcurrentModificationException을 출발점으로 삼아, 이 문제가 왜 발생했는지, 그리고 JPA EntityListener 라이프사이클과 공식 문서에서 제시하는 권장 가이드를 따를 때 어떤 해결 전략..
안녕하세요. 이번 글에서는 JVM 리소스 모니터링의 필요성과 이를 위한 유틸리티 클래스의 구현 및 활용 방법에 대해 알아보겠습니다. 특히 APM(Application Performance Monitoring) 미연동 환경에서, 표준 API를 활용하여 메모리 사용량을 로깅하는 방법을 중심으로 설명드리겠습니다.1. 소개 & 배경JVM(Java Virtual Machine)은 자바 애플리케이션의 실행을 담당하는 가상 머신으로, 메모리 관리와 가비지 컬렉션 등의 핵심 기능을 제공합니다. 그러나 애플리케이션의 성능 최적화와 안정적인 운영을 위해서는 JVM의 리소스 사용량을 지속적으로 모니터링하는 것이 필수적입니다. 특히 힙 메모리 사용량은 애플리케이션의 메모리 누수나 성능 저하의 주요 원인이 될 수 있습니다. 예..
이 글에서는 Spring Batch의 멀티스레딩 환경과 파티셔닝에서 스레드 안정성을 확보하는 방법을 설명합니다. Spring Batch 공식 문서를 기준으로 병렬 처리 모델과 스레드 안전성 요구사항을 기술합니다.소개 · 배경Spring Batch는 대용량 데이터를 효율적으로 처리하기 위해 병렬 처리 기능을 제공합니다. Spring Batch Reference Manual에 따르면, 병렬 처리는 처리 시간을 단축하고 리소스 활용을 최적화하기 위한 설계입니다. 특히 파티셔닝(Partitioning)은 대용량 데이터를 여러 파티션으로 나누어 병렬로 처리하는 기법입니다. 파티셔닝 환경에서는 각 파티션이 독립적인 스레드에서 실행됩니다. Spring Batch는 이러한 병렬 실행을 위해 Master/Worker S..
안녕하세요. 이번 글에서는 Spring Batch 에서 파티셔닝(Partitioning)을 사용한 실무 사례들을 소개해보겠습니다. 대용량 데이터를 효율적으로 처리하기 위한 파티셔닝의 개념부터 실제 구현 사례까지 단계별로 설명드리겠습니다.소개 & 배경Spring Batch는 대용량 데이터를 안정적으로 처리하기 위한 배치 프레임워크입니다. 하지만 처리 대상 데이터의 규모가 커질수록 단일 스레드 기반 처리에는 한계가 발생합니다. 이러한 문제를 해결하기 위한 대표적인 방법 중 하나가 파티셔닝(Partitioning) 입니다. 파티셔닝은 전체 데이터를 여러 개의 작은 작업 단위로 나누어 병렬로 처리함으로써, 처리 시간을 단축하고 시스템 자원을 보다 효율적으로 활용할 수 있도록 도와줍니다. 이번 글에서는 Sprin..
안녕하세요. 이번 글에서는 Spring Boot 환경에서 리스트 형태의 데이터를 처리할 때, 실패한 요소만 롤백하고 나머지는 정상적으로 커밋하는 방법에 대해 알아보겠습니다. 트랜잭션의 기본 원칙과 실무에서 필요한 부분 롤백 전략을 단계별로 설명드리겠습니다.도입 & 배경대용량 데이터를 일괄 처리하는 배치 작업으로 API 서버에서 리스트 형태의 데이터를 처리할 때, 모든 요소를 하나의 트랜잭션으로 묶으면 하나의 요소에서 예외가 발생했을 때 전체 작업이 롤백됩니다. 이는 데이터의 무결성을 보장하는 측면에서는 바람직하지만, 실무에서는 다른 접근이 필요할 수 있습니다. 예를 들어, 1,000건의 주문 데이터를 처리하는 과정에서 5건의 데이터에만 문제가 있다고 가정해봅시다. 전통적인 트랜잭션 방식으로는 이 5건 ..
안녕하세요. 이번 글에서는 Spring Batch에서 여러 Step으로 구성된 Job에서 Step 간에 데이터를 공유하는 방법에 대해 정리해보겠습니다. Spring Batch가 공식적으로 제공하는 ExecutionContext 개념과, StepExecutionListener를 활용한 방식을 설명합니다. 배치 Job이 복잡해질수록 Step 간에 상태나 계산 결과를 전달해야 하는 요구는 자연스럽게 발생합니다. 이러한 요구를 해결하기 위해 Spring Batch는 별도의 커스텀 저장소 없이도 사용할 수 있는 상태 관리 메커니즘을 제공합니다. 소개 및 배경Spring Batch Job은 여러 Step으로 구성되며, 각 Step은 기본적으로 독립적인 실행 단위입니다. 하지만 실무에서는 한 Step의 실행 결과..
- Total
- Today
- Yesterday
- TTL 설계
- 백엔드 성능
- Java Performance
- 백엔드 아키텍처
- 동시성처리
- Initialization-on-Demand Holder Idiom
- InterruptedException
- Redis vs DB
- Eager Initialization
- 스레드 생명주기
- 백엔드 성능 튜닝
- Hot Key 문제
- 트래픽 처리
- Spring Batch
- Redis 성능 개선
- Cache Avalanche
- mybatis
- Double-Checked Locking
- DB 트랜잭션
- 캐시 성능 비교
- 백엔드 성능 설계
- 트랜잭션 관리
- Redis 캐시 전략
- 캐시와 인덱스
- spring batch 5
- 캐시 장애
- Enum 기반 싱글톤
- DB 인덱스 성능
- Cache Aside
- Cache Penetration
| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 1 | 2 | 3 | 4 | 5 | 6 | 7 |
| 8 | 9 | 10 | 11 | 12 | 13 | 14 |
| 15 | 16 | 17 | 18 | 19 | 20 | 21 |
| 22 | 23 | 24 | 25 | 26 | 27 | 28 |
| 29 | 30 | 31 |

