본문 바로가기
트러블슈팅

TTL , Evict 설계 기준

by hhw1 2026. 3. 26.

상품 전체 조회

상품 전체 조회의 경우, 거래소에 등록되는 물품들은 사람들이 동시에 많이 구매하고 등록하면서 변화가 잦은 데이터이기 때문에 모든 keyword나 page마다 캐싱하는 것 보다는 사람들이 기본적으로 가장 많이 요청하는 page=0 이고 keyword가 없는 최신순으로 정렬되는 기본 페이지만 캐싱하는 것이 가장 효율적이라고 판단되었다.

 

TTL 의 경우에는 첫 페이지를 캐싱하는 목적이 신규 아이템의 등록 확인 같은 이유보다는 거래소의 첫 페이지를 빠르게 로딩하는 목적이 더 크다고 판단되어서 상품 등록, 상품 취소 등으로 첫 페이지가 자주 변할 수 있는 환경이더라도 TTL 을 3분 정도로 비교적 길게 잡아서 캐시 히트율을 높이고 DB 조회 횟수를 최소화할 수 있도록 하였다. (자신이 등록한 상품이 안보이는 시간이 너무 길어도 문제가 있을 것 같다고 생각해서 3분으로 잡음)

1

CacheEvict 의 경우에도 이와 같이 캐싱의 목적이 신규 상품 확인보다 거래소의 첫 페이지를 빠르게 로딩하는 것에 있다고 판단되어 “상품 등록 시” 를 evict 조건에서 제거하여 신규 상품이 등록되어도 캐시 데이터가 삭제되지 않도록 설계하였다.

  • cacheNames: marketListingFirstPage
  • key : first
  • TTL : 3분
  • @Cacheable 의 condition 옵션을 사용하여 Pageable의 page 값은 0, keyword 는 null 이거나 Blank, 정렬 조건은 따로 지정해주지 않은 경우에만 캐싱이 이루어지도록 처리
  • 모든 상품에 대해서 상품 구매, 상품 취소 발생 시 @CacheEvict(allEntries=true) 를 사용하여 캐시 데이터 삭제

 

상품 단건 조회

상품 단건 조회의 경우 상품 전체 조회 보다 캐시 데이터 변경 상황이 더 적고 인기 있는 아이템의 경우 조회 횟수가 높을 수 있기 때문에 캐싱을 하는 것이 좋다고 판단되었다.

 

TTL의 경우 단건 상품의 캐시 데이터는 상품 전체 조회에서의 첫 페이지 캐시보다는 변경 가능성이 낮지만, 상품을 단건으로 조회하는 경우에는 보통 구매의 목적이 크므로 데이터의 정확도가 상당히 중요하다고 판단되어 비교적 짧은 10분 정도로 설계하였다.

  • cacheNames: marketListingItem
  • key : {marketListingId}
  • TTL : 10분
  • 단건 상품에 대해서 상품 구매, 상품 취소 발생 시 @Caching 어노테이션 사용하여 상품 전체 조회에서 생성된 캐시를 같이 evict 처리
  • 단건 조회의 경우, DB 조회 결과가 없을 때 굳이 캐싱할 필요가 없다고 판단되어 unless 조건을 사용해서 DB 조회 결과가 null 일 경우 캐싱 x

 

내 아이템 전체 조회

내 아이템 전체 조회의 경우 유저가 자신이 소유한 아이템을 조회하는 경우가 많기 때문에 조회에 걸리는 시간이 느릴 경우 UX 측면에서 매우 나쁠 것으로 생각이 들어서 캐시를 무조건 사용하는 것이 좋다고 판단된다.

 

TTL의 경우, 위에서 말한 것처럼 인벤토리 아이템을 조회하는 경우가 매우 잦기 때문에 유저의 평균 접속시간을 고려해서 1시간 정도로 설정하고 cacheEvict 의 경우, 유저가 아이템을 습득하거나 판매했는데 인벤토리에 보이는 아이템 정보가 다르면 안되므로 아이템 획득 로직 발생 시, 아이템 상품 등록 시 evict 처리를 하고자 한다.

  • cacheNames: inventoryList
  • key : {memberId}
  • TTL : 1시간
  • 상품 등록, 개별 정산 시 아이템인 경우에 해당 유저의 캐시를 evict 처리

 

내 아이템 단건 조회

내 아이템 단건 조회의 경우는 전체 조회보다 조회 빈도수는 낮지만 특정 아이템만 따로 조회하는 만큼 정확도가 중요하다고 판단되어서 아이템 전체 조회와 마찬가지로 유저의 평균 접속시간을 고려해서 TTL을 1시간 정도로 설정하고자 한다.

 

cacheEvict 의 경우에도 전체 조회 case와 마찬가지로 아이템을 획득하거나 상품 등록을 했을 때 evict 처리를 하고자 한다.

  • cacheNames: inventoryItem
  • key : {memberId}:{itemId}
  • TTL : 1시간
  • 상품 등록 시 캐시 evict 처리
  • 개별 정산 시 타입이 아이템이고, 이미 유저가 보유하고 있었던 아이템인 경우에만 evict 처리

'트러블슈팅' 카테고리의 다른 글

k6 성능 테스트 전략 설계 과정  (0) 2026.03.26
최적화 전략 설계 방법  (0) 2026.03.26
스프링 plus 프로젝트 리팩토링  (0) 2026.03.04
클라우드 아키텍쳐 설계 & 배포  (0) 2026.02.03
Spring 코드 개선  (0) 2026.01.27