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