Project

대회 종료 시 최종 자산 정산 고도화

kinim329 2026. 5. 8. 16:22

배경

antcamp은 가상 주식 대회 플랫폼이다. 대회가 종료되면 모든 참가자의 최종 총자산을 계산해 순위를 확정해야 한다.

총자산은 아래 공식으로 계산된다.

총자산 = 현금 잔액 + (보유 종목별 확정가 × 보유 수량)

이때 확정가는 대회 종료 시점의 실제 주가여야 하므로, 한투(한국투자증권) API를 호출해 가격을 가져와야 한다.

문제

캐싱 전 이미지 삽입

단순하게 구현하면 참가자 수 × 보유 종목 수만큼 한투 API를 호출하게 된다.

예를 들어 참가자 100명이 각자 5개 종목을 보유하고 있다면 최대 500번 API를 호출해야 한다.

이 방식에는 두 가지 문제가 있다.

  1. 한투 API에는 **호출 횟수 제한(Rate Limit)**이 있어 초과 시 오류가 발생한다.
  2. 외부 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 위험을 없애고 정산 속도도 높일 수 있었다.