Spring 2

[Spring Batch] JpaPagingItemReader 성능 차이 확인 필수 (Fetch Join OOM부터 transacted의 숨겨진 함정까지)

Spring Batch에서 대용량 데이터를 처리할 때 JpaCursorItemReader에서 JpaPagingItemReader로 넘어오는 것은 흔한 수순이다.하지만 JpaPagingItemReader를 만만하게 보고 기존 웹 애플리케이션에서 하던 것처럼 쿼리를 짰다가는, 시스템이 혼란에 빠지는 것을 목격하게 될 것이다. 오늘은 이 녀석이 숨기고 있는 치명적인 메모리 함정과 프레임워크 내부의 기이한 동작 방식까지 전부 파헤쳐본다.1. Fetch Join과 페이징의 끔찍한 혼종 (OOM의 서막)JPA를 좀 다뤄본 개발자라면 N+1 문제를 피하기 위해 숨 쉬듯 Fetch Join을 사용할 것이다. JpaPagingItemReader의 queryString()에도 자연스럽게 JOIN FETCH를 집어넣게 되는..

Spring 2026.02.28

[트러블슈팅] DAU ~100, 굳이 Redis를 써야 할까? (Local Cache 도입기)

1. 배경 및 문제 상황 (Background)최근 사내 프로젝트 개발 중, 특정 API의 응답 속도가 현저히 느려지는 현상을 발견했습니다. 프로파일링 결과, 범인은 사용자 정보를 불러오는 로직이었습니다.현상: 사용자 정보 조회 시 응답 시간이 약 2,000ms (2초)까지 지연됨.원인: 레거시 시스템 연동 및 복잡한 조인 연산으로 인해 DB 조회 비용이 매우 높음.제약 사항:현재 다른 핵심 기능 개발로 인해 인프라를 변경하거나 대대적인 리팩토링을 할 시간적 여유가 없음.하지만 사용자의 체감 성능 향상을 위해 즉각적인 개선이 필요함.2. 기술 검토: Local Cache vs Global CacheDB 튜닝이 어렵다면 가장 효과적인 대안은 캐싱(Caching)입니다. 캐시 저장소를 어디에 둘 것인가를 두..

Spring 2026.02.01