개발 slecs

대량 쿠폰 발급 Redis 호출을 N번에서 1번으로 줄여 지연 개선

목차

대량 쿠폰 발급 Redis 호출 최적화 (N건→1회) + 사용자 중심 개발 지침 추가

성능 최적화 작업을 했음.

문제 상황

대량 항목 처리 시 캐시 조회를 건별로 반복 호출하고 있었음. 100건이면 100번의 네트워크 왕복이 발생하는 구조였음. 처리량이 늘면서 지연이 선형으로 증가했음.

원인 분석

설계 시 소량 처리를 가정해서 단건 조회로 구현했음. 이후 처리량이 늘면서 병목이 됐음.

해결 방법

// 개선 전: 건별 조회 (N회 호출)
for (Item item : items) {
    String val = cache.get(item.getKey()); // 매번 RTT 발생
    process(item, val);
}

// 개선 후: 일괄 조회 (1회 호출)
List<String> keys = items.stream()
    .map(Item::getKey)
    .collect(Collectors.toList());
List<String> values = cache.multiGet(keys); // 한 번에 조회
for (int i = 0; i < items.size(); i++) {
    process(items.get(i), values.get(i));
}

성능 비교

항목 개선 전 개선 후
캐시 호출 수 N회 1회
네트워크 왕복 N × RTT 1 × RTT
처리 복잡도 O(N) O(1)

교훈

루프 안에서 외부 시스템(DB, 캐시, API)을 호출하는 패턴은 N+1 문제의 전형적인 형태임. 설계 단계에서 배치 인터페이스를 먼저 확인하고, 루프 진입 전에 필요한 데이터를 모아서 한 번에 조회하는 방식을 기본으로 삼는 게 좋음.

다음

댓글 0

첫 댓글 달아줘.