Chunk 단위 처리와 OOM 방지
청크 지향 처리 — 메모리를 일정하게 유지하는 법
OOM 이 왜 발생하는지 힙 수준에서 계산하고, N건씩 읽기→처리→쓰기→해제를 반복하는 청크 처리기를 직접 구현해, 100만 건이든 1억 건이든 같은 메모리로 처리하고 병렬화까지 할 수 있게 됩니다.
1. 왜 배우는가
배치 장애의 가장 흔한 형태는 java.lang.OutOfMemoryError: Java heap space 입니다. 그리고 이 오류의 특징은 개발 환경에서는 절대 재현되지 않는다는 것입니다. 개발 DB 에는 1만 건, 운영 DB 에는 3천만 건이 있기 때문입니다. 코드는 옳고, 테스트도 통과했고, 운영에서 첫 실행 날 새벽에 죽습니다.
원인은 거의 항상 같습니다. 어딘가에서 "전체"를 메모리에 올렸습니다. findAll(), readAllLines(), stream().toList(), Collectors.groupingBy 로 전체 집계, 결과를 List 에 모아서 마지막에 한 번에 저장. 이런 코드는 데이터가 힙보다 작을 때만 동작합니다.
청크(chunk) 지향 처리는 이 문제의 표준 해법입니다. 전체를 N건씩 잘라, 한 청크를 읽고·처리하고·쓰고·버린 뒤 다음 청크로 넘어갑니다. 힙에는 언제나 청크 하나 분량만 존재하므로 입력이 100만 건이든 10억 건이든 메모리 사용량이 같습니다. Spring Batch 의 chunk(100) 이 바로 이것이고, 이 레슨에서는 그것을 직접 만들고 힙 사용량을 숫자로 확인합니다.