배경
antcamp은 가상 주식 대회 플랫폼이다. 대회가 종료되면 모든 참가자의 최종 총자산을 계산해 순위를 확정해야 한다.
총자산은 아래 공식으로 계산된다.
총자산 = 현금 잔액 + (보유 종목별 확정가 × 보유 수량)
이때 확정가는 대회 종료 시점의 실제 주가여야 하므로, 한투(한국투자증권) API를 호출해 가격을 가져와야 한다.
문제
캐싱 전 이미지 삽입
단순하게 구현하면 참가자 수 × 보유 종목 수만큼 한투 API를 호출하게 된다.
예를 들어 참가자 100명이 각자 5개 종목을 보유하고 있다면 최대 500번 API를 호출해야 한다.
이 방식에는 두 가지 문제가 있다.
- 한투 API에는 **호출 횟수 제한(Rate Limit)**이 있어 초과 시 오류가 발생한다.
- 외부 API 호출이 많을수록 정산 처리 시간이 길어진다.
해결 — Redis 캐싱으로 중복 호출 제거
캐싱 후 이미지 삽입
같은 종목은 어느 참가자가 보유하든 대회 종료 시점의 가격이 동일하다. 삼성전자를 50명이 들고 있어도 그 시점의 가격은 하나다.
이 점을 활용해 Redis를 캐시로 사용했다. 종목 가격을 처음 조회할 때만 한투 API를 호출하고, 이후 같은 종목이 나오면 저장해둔 값을 그대로 꺼내 쓴다.
String cacheKey = "stock:price:" + competitionId + ":" + stockCode;
Long price = redisTemplate.opsForValue().get(cacheKey);
if (price == null) {
// 캐시에 없을 때만 한투 API 호출
price = stockPriceClient.getPriceAt(stockCode, endedAt).getData().longValue();
redisTemplate.opsForValue().set(cacheKey, price, 1, TimeUnit.HOURS);
}
priceCache.put(stockCode, price); // 인메모리 Map에도 저장해 Redis 조회도 줄임
처리가 끝나면 Redis에 저장해둔 가격 데이터를 즉시 삭제해 불필요한 데이터가 남지 않도록 했다.
결과
개선 전개선 후
| 한투 API 호출 수 | 참가자 수 × 보유 종목 수 | 고유 종목 수 |
| 100명 × 5종목 기준 | 최대 500번 | 최대 20번 |
같은 데이터를 반복해서 가져올 필요가 없다는 점에서 출발한 단순한 아이디어지만, API 호출 횟수를 크게 줄여 Rate Limit 위험을 없애고 정산 속도도 높일 수 있었다.
'Project' 카테고리의 다른 글
| Kafka 역직렬화 에러 해결하기 (0) | 2026.05.04 |
|---|---|
| 모의 주식 프로젝트에서 Kafka로 서비스 간 이벤트를 주고받기 (0) | 2026.05.03 |
| 모의 주식 대회 프로젝트에서 잘못된 상태 판단 로직을 수정한 과정 (0) | 2026.04.29 |
| 주식 대회 정산 시 가격 조회 캐싱이 필요한가? (0) | 2026.04.28 |
| 테이블 필요성에 대한 설계 고민과 소통 (0) | 2026.04.20 |