조건 기반 예측 캐싱: 고속 엑셀 다운로드 처리 구조 설계
전체 다운로드에 준하는 대량 데이터 요청을 실시간 처리하면서도, API 서버 부하를 줄이고 사용자 응답 속도를 개선할 수 있는 방법은 없을까?
사전 생성이 어렵지만 반복되는 조건”에 대해 예측 기반 분기 처리 + 조건 캐싱 전략을 적용하여, 실시간성과 성능의 균형을 맞춘 구조를 설계해보았다.
배경: 사전 생성의 한계
앞서 전체 데이터를 필터 없이 다운로드하는 요청에 대해서는 S3에 미리 생성하여 대응하고 있었다. 하지만 아래와 같은 요청은 전체에 준하는 데이터량을 요구하면서도 필터 조건이 일부 포함되어 있어 사전 생성을 적용하기 어려웠다.
예를 들어, 다음과 같이 미리 생성하는게 거의 불가능한 조건이 있다.
2025년 전체 + 특정 지역 필터
전체 상품 중 카테고리 일부만 제외
이 경우에 문제는 다음과 같다.
- 사전 생성이 불가능 → 매 요청마다 대량 조회 및 엑셀 생성
- 반복 요청에도 항상 처리 → API 서버에 불필요한 부하
해결 전략: 예측 기반 처리 + 캐시 분기
핵심 구성
- 처리 시간 예측 모델 기반의 조건 가중치 계산
- 최초 요청은 직접 처리
- 이후 동일 조건에 대해서는 캐시 활용
조건 조합에 대한 가중치 부여
- 필터 조합을 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~6 | 1~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 | 캐시 생성 시간 |
expiresAt | TTL 기반 자동 만료 시간 |
- Redis + S3 메타 정보 조합
- 캐시 TTL은 24시간 또는 조건별 정책 기반
성능 개선 효과
항목 | 개선 전 | 개선 후 |
---|---|---|
조건 포함된 전체 요청 응답 시간 | 평균 5.8초 | 1.9초 (캐시 적용 시) |
동일 조건 요청의 재처리 | 매번 Excel 생성 | 캐시 재사용 |
API 서버 처리 부하 | 예측 불가 | 요청 조건별 분산 처리 |
회고 및 확장 아이디어
시스템 유연성 확보
- 사전 생성이 불가능한 조건에 대한 대응책을 마련함으로써, 캐싱 전략의 범용성을 확보
- 조건 조합을 통해 “캐시 여부 판단 기준”을 명확히 시스템화
확장 방향
- 예측 처리 시간 기반 캐싱 대상 자동화 (간단한 ML 모델 적용 가능)
- 캐시 사용률 지표 수집 → 인기 조건 자동 사전 생성
- 캐시 갱신 조건에 대한 사용자 정의 정책 도입
마무리하며
대량 데이터를 다루는 구조에서는 “캐싱할 수 있는가?”보다 “무엇을 캐싱할 것인가”가 중요하다. 이번 설계는 단순히 데이터를 저장하고 재사용하는 것을 넘어, 요청 조건에 따라 처리 전략을 분기함으로써 예측 가능성과 성능 최적화라는 두 마리 토끼를 잡은 경험이었다.
This post is licensed under CC BY 4.0 by the author.