CS 정리

Java 대용량 데이터 처리 (4) - 비동기 데이터 수집

문쿼리 2025. 4. 29. 00:53

4. 즉시저장 → 모아서 저장 (비동기 데이터 수집)

즉시 저장 vs 모아서 저장 (비동기 처리)

  • 즉시 저장은 데이터가 들어올 때마다 매번 DB에 저장하는 방식.
    하지만 대량의 트래픽이 발생하면 DB 부하가 급격히 증가하고, 성능 저하 발생 가능.
  • 모아서 저장 (비동기 처리)는 데이터를 메모리 큐 등에 임시로 저장하고,
    일정 수 이상이 모이거나 일정 시간이 지나면 한꺼번에 DB에 저장.
    이를 통해 시스템 부하를 줄이고, 응답 속도를 빠르게 유지할 수 있음.

비동기 처리 예제

Bad case: 동기 처리

public class SynchronousSave {
    public void saveData(Data data) {
        // 요청이 들어오자마자 즉시 DB 저장
        saveToDatabase(data);
        System.out.println("저장 완료");
    }

    private void saveToDatabase(Data data) {
        // DB 저장 시 시간이 오래 걸릴 수 있음
        try {
            Thread.sleep(100);  // DB I/O 지연 시뮬레이션
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}

 

Good case: 비동기 처리, 버퍼 저장 + 일괄 처리

public class AsyncBufferedSave {
    private static BlockingQueue<Data> queue = new LinkedBlockingQueue<>();
    private static ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1);

    // 요청이 들어오면 큐에 적재
    public void collect(Data data) {
        queue.offer(data);
        System.out.println("데이터 큐에 저장됨");
    }

    // 주기적으로 큐에 모인 데이터를 DB에 일괄 저장
    public void startBatchSaver() {
        scheduler.scheduleAtFixedRate(() -> {
            List<Data> batch = new ArrayList<>();
            queue.drainTo(batch, 100);  // 최대 100개 꺼냄
            if (!batch.isEmpty()) {
                saveBatchToDatabase(batch);
            }
        }, 0, 5, TimeUnit.SECONDS);
    }

    private void saveBatchToDatabase(List<Data> batch) {
        System.out.println("DB에 일괄 저장 중: " + batch.size() + "건");
    }
}

 

요약 정리

  • 즉시 저장은 요청마다 I/O가 발생해 고성능 환경에서 병목 발생 가능.
  • 비동기 수집 + 모아서 저장은 시스템 부하를 줄이고 응답 속도를 향상.
  • 큐 기반 버퍼링 방식은 데이터 유실, 동기화, 장애 처리에 대한 대비가 필요.
  • 백그라운드 쓰레드, 스케줄링, 에러 로그 추적 등의 체계가 함께 설계되어야 함.
  • 실시간 알림, 모니터링과 연계하면 사용자 경험과 시스템 안정성 모두 확보 가능.