대용량 데이터 처리 4

Java 대용량 데이터 처리 (6) - 멀티 쓰래드/병렬 처리

6. 싱글 쓰레드 → 멀티 쓰레드 / 병렬 처리 (10만 명에게 알림 발송)싱글 쓰레드 vs 멀티 쓰레드/병렬 처리싱글 쓰레드 방식은 하나의 작업 흐름으로 모든 알림을 순차적으로 처리.사용자는 많고, 각 알림 발송 시간이 지연되면 전체 처리 시간도 길어짐.멀티 쓰레드 / 병렬 처리는 여러 쓰레드를 활용해 동시에 알림을 전송.작업을 분산해 처리 속도를 높이고, 전체 처리 시간을 획기적으로 단축할 수 있음. 비동기 병렬 처리 예제 Bad case: 싱글 쓰레드public class NotificationService { public void sendNotifications(List users) { for (String user : users) { send(user); ..

CS 정리 2025.05.04

Java 대용량 데이터 처리 (2) - Stream 메모리 효율 높이기

2. List -> Stream (장기간 저장된 로그 분석) Stream 처리 예제Bad case : 모두 조회, 모두 처리List logs = logRepository.findAll(); // 100만 건logs.forEach(this::analyze);OutOfMemoryError 발생 위험GC 부하응답속도 지연 Stream 처리란?데이터를 한 번에 다 불러오지 않고, 하나씩 처리하면서 다음 데이터를 읽는 방식List에 모두 올리지 않기Iterator처럼 지연(Lazy) 처리Good case : stream으로 하나씩 처리@QueryHints(value = @QueryHint(name = org.hibernate.jpa.QueryHints.HINT_FETCH_SIZE, value = "1000"))@..

CS 정리 2025.04.20

Java 대용량 데이터 처리(1) - Cursor 방식

1. 한 번에 처리하기 -> 작게 나눠서 천천히 처리하기Cursor-based 예제Bad case : 모두 조회, 모두 처리List allData = repository.findAll();processAll(allData);Good case : Cursor 방식으로, 배치 사이즈로 조회하여, 부분처리Long lastId = 0L;int batchSize = 1000;while (true) { List batch = repository.findBatch(lastId, batchSize); if (batch.isEmpty()) break; processAll(batch); lastId = batch.get(batch.size() - 1).getId();}@Query(value = "SE..

CS 정리 2025.04.20

Java 대용량 데이터 처리(0)

Java에서 대용량 데이터란 무엇인가?1) 한 번에 메모리에 올리기 어렵다.2) 처리/응답 속도가 저하된다.3) I/O 병목 발생4) GC 부하 발생5) DB 부하 발생 * 성능에 영향을 줄 만큼 크거나 빈번한 데이터를 의미함.그러므로, "절대 크기"보다는 "시스템 리소스 대비 상대적"인 성격을 가진다. Java에서 대용량 데이터 처리 방안은 무엇인가?1. 한 번에 처리하기 -> 작게 나눠서 천천히 처리하기 (1년치 주문 데이터 정산)2. List -> Stream (장기간 저장된 로그 분석)3. 즉시응답 -> 비동기 예약 (10만 건 엑셀 다운로드)4. 즉시저장 -> 모아서 저장 (비동기 데이터 수집)5. DB만 사용 -> DB와 캐시와 계층구조 활용 (상품 상세정보 조회)6. 싱글 쓰래드 -> 멀티..

CS 정리 2025.04.19