포스트

Architecture

조건 기반 예측 캐싱: 고속 엑셀 다운로드 처리 구조 설계

전체 다운로드에 준하는 대량 데이터 요청을 실시간으로 처리하면서 API 서버 부하를 줄이고 응답 속도도 개선하려면 무엇을 바꿔야 하는가가 출발점이었다.

사전 생성은 어렵지만 반복되는 조건에 대해, 처리 비용을 먼저 예측해 분기하고 무거운 조건의 결과만 캐싱하는 구조를 설계했다.


배경: 사전 생성의 한계

앞서 전체 데이터를 필터 없이 다운로드하는 요청에 대해서는 S3에 미리 생성하여 대응하고 있었다. 하지만 아래와 같은 요청은 전체에 준하는 데이터량을 요구하면서도 필터 조건이 일부 포함되어 있어 사전 생성을 적용하기 어려웠다.

예를 들어, 다음과 같이 미리 생성하는게 거의 불가능한 조건이 있다.

  • 2025년 전체 + 특정 지역 필터
  • 전체 상품 중 카테고리 일부만 제외

이 경우에 문제는 다음과 같다.

  • 사전 생성이 불가능 → 매 요청마다 대량 조회 및 엑셀 생성
  • 반복 요청에도 항상 처리 → API 서버에 불필요한 부하

조건이 붙는 순간 사전 생성 파일을 쓸 수 없으므로, 같은 조건이 반복돼도 매번 처음부터 만들었다. 그래서 “조건마다 미리 만들기” 대신 “한 번 만든 결과를 조건 단위로 재사용하기”로 방향을 바꿨다.


해결 전략: 예측 기반 처리 + 캐시 분기

핵심 구성

  1. 처리 시간 예측 모델 기반의 조건 가중치 계산
  2. 최초 요청은 직접 처리
  3. 이후 동일 조건에 대해서는 캐시 활용

먼저 요청이 얼마나 무거운지 점수로 가늠하고, 그 결과로 실시간 처리와 캐싱 여부를 나눈다. 무거운 요청을 미리 판별하는 기준은 무거운 엑셀 다운로드 요청을 사전에 판별하는 방법에서 따로 다뤘다.


조건 조합에 대한 가중치 부여

  • 필터 조합을 Key로 가중치 점수 계산
  • 예측 처리 시간 ≒ 데이터 양 추정 → 캐싱 대상 판단
1
2
3
4
5
6
int score = 0;
if (filter.getDateRange().isAllYear()) score += 3;
if (filter.getRegion().isWideScope()) score += 2;
if (filter.getCategory().isNullOrEmpty()) score += 2;

int predictedTime = model.predict(score); // 내부 룰 기반 또는 ML 모델

처리 시간 예측 기준

Score예측 시간대응 전략
0~3< 1s실시간 처리
4~61~3s조건부 캐싱
7+> 3s캐싱 우선 처리 대상

분기 처리 로직 설계

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
String cacheKey = "excel::" + hash(condition);

Optional<ExcelCache> cached = cacheRepo.findByKey(cacheKey);
if (cached.isPresent() && !cached.get().isExpired()) {
    // 캐시 파일 S3 링크 즉시 제공
    return cached.get().getDownloadUrl();
}

if (isHeavyRequest(condition)) {
    // 최초 요청 → 실시간 생성 → 결과 캐싱
    byte[] file = generateExcel(condition);
    String s3Url = uploadToS3(file);
    cacheRepo.save(cacheKey, s3Url);
    return s3Url;
} else {
    // 경량 요청은 실시간 처리 후 반환 (캐싱 생략)
    return uploadToS3(generateExcel(condition));
}

캐시 구조 설계

필드설명
cacheKey필터 DTO 직렬화 → SHA256 해시
downloadUrl생성된 S3 엑셀 파일 주소
createdAt캐시 생성 시간
expiresAtTTL 기반 자동 만료 시간
  • Redis + S3 메타 정보 조합
  • 캐시 TTL(만료까지의 유효 시간)은 24시간 또는 조건별 정책 기반

성능 개선 효과

항목개선 전개선 후
조건 포함된 전체 요청 응답 시간평균 5.8초1.9초 (캐시 적용 시)
동일 조건 요청의 재처리매번 Excel 생성캐시 재사용
API 서버 처리 부하예측 불가요청 조건별 분산 처리

회고 및 확장 아이디어

시스템 유연성 확보

  • 사전 생성이 불가능한 조건에 대한 대응책을 마련함으로써, 캐싱 전략의 범용성을 확보
  • 조건 조합을 통해 “캐시 여부 판단 기준”을 명확히 시스템화

확장 방향

  • 예측 처리 시간 기반 캐싱 대상 자동화 (간단한 ML 모델 적용 가능)
  • 캐시 사용률 지표 수집 → 인기 조건 자동 사전 생성
  • 캐시 갱신 조건에 대한 사용자 정의 정책 도입

마무리하며

이번 설계에서 갈린 지점은 “캐싱할 수 있는가”보다 “무엇을 캐싱할 것인가”였다. 요청 조건으로 처리 비용을 먼저 점수화하고 그 점수에 따라 처리 전략을 분기했기 때문에, 반복되는 무거운 조건은 캐시로 응답하고 가벼운 조건은 저장 없이 바로 처리할 수 있었다.

장애 대응과 관측
이 글은 저작권자의 CC BY 4.0 라이선스를 따릅니다.

변경이력

1번 수정

  1. docs(notes): cite sources and ease reading in condition-based-excel-processing

댓글

아직 댓글이 없습니다