Skip to main content
@cache 데코레이터를 사용하여 Model이나 Frame 메서드의 결과를 자동으로 캐싱할 수 있습니다.

기본 사용법

간단한 예제

작동 방식:
  1. 첫 번째 호출: DB 조회 → 결과 캐싱
  2. 두 번째 호출 (10분 내): 캐시에서 반환 (DB 조회 없음)
  3. 10분 경과 후: 다시 DB 조회 → 캐시 갱신

데코레이터 옵션

전체 옵션

key: 캐시 키 설정

키를 지정하지 않으면 자동으로 생성됩니다.
패턴: ModelName.methodName:serializedArgs인자 직렬화 규칙:
  • 단일 primitive (string/number/boolean): 그대로 사용
  • 복잡한 객체: JSON.stringify 사용
  • 인자 없음: suffix 없이 ModelName.methodName

ttl: 만료 시간

TTL(Time To Live)은 캐시가 유효한 시간입니다.
TTL 없이 사용하면: BentoCache 기본값 적용 (일반적으로 무제한)

grace: Stale-While-Revalidate

Grace period는 TTL 만료 후에도 오래된 캐시(Stale)를 반환하면서 백그라운드에서 갱신하는 기능입니다.
작동 방식:
  1. 0~1분: 신선한 캐시 반환
  2. 1~11분: Stale 캐시 즉시 반환 + 백그라운드 갱신
  3. 11분 이후: 캐시 미스, 새로 계산
장점:
  • 사용자는 항상 빠른 응답 (Stale이라도 즉시 반환)
  • 백그라운드에서 갱신되어 다음 사용자는 신선한 데이터 받음

tags: 태그 기반 무효화

태그를 사용하여 관련 캐시를 그룹으로 무효화할 수 있습니다.
무효화 패턴:
자세한 내용은 캐시 무효화를 참고하세요.

store: 특정 스토어 사용

여러 스토어를 설정한 경우, 특정 스토어를 지정할 수 있습니다.

forceFresh: 캐시 무시

항상 새로운 데이터를 가져오고 싶을 때 사용합니다.
용도: 디버깅이나 특수한 경우에만 사용 (일반적으로 불필요)

실전 예제

1. API 응답 캐싱

2. 데이터 변경 시 캐시 무효화

3. 복잡한 키 생성

4. Stale-While-Revalidate 활용

시나리오:
  • 0~5분: 신선한 캐시
  • 5~65분: Stale 캐시 즉시 반환 + 백그라운드 재계산
  • 65분 이후: 캐시 미스, 새로 계산

5. 설정값 영구 캐싱

내부 메서드 호출과 캐시 공유

Model 내부에서 다른 메서드를 호출할 때도 캐시가 공유됩니다.
작동 방식:

캐시 키 생성 로직

인자 직렬화

예시:

전체 키 생성

복잡한 캐시 키 생성 예제

실전에서 마주치는 복잡한 캐시 키 생성 시나리오와 해결 방법입니다.

예제 1: 중첩된 객체 파라미터

예제 2: 배열 파라미터

예제 3: 날짜 파라미터

예제 4: 사용자별 캐싱

예제 5: 순환 참조 객체

예제 6: 다중 필터 조건

예제 7: 큰 객체 최적화

캐시 키 설계 Best Practices

캐시 키 설계 주의사항:
  1. 키 길이: 너무 긴 키는 성능 저하 (권장: 250자 이내)
  2. 직렬화 오류: 순환 참조, Date, Function 등 주의
  3. 키 충돌: 서로 다른 데이터가 같은 키를 가지지 않도록
  4. 정규화: 객체/배열 순서가 달라도 동일한 키 생성
캐시 키 디버깅 팁:
  • 생성된 키를 로깅하여 확인
  • 예상치 못한 캐시 미스는 키 정규화 확인
  • 캐시 통계로 히트율 모니터링

직접 캐시 조작

데코레이터 없이 직접 캐시를 조작할 수도 있습니다.
데코레이터 vs 직접 조작:
  • 데코레이터: 간결, 선언적, 자동 키 생성
  • 직접 조작: 복잡한 로직, 조건부 캐싱, 세밀한 제어

주의사항

@cache 데코레이터 사용 시 주의사항:
  1. 캐시 매니저 초기화 필수: sonamu.config.ts에 캐시 설정이 없으면 에러 발생 에러 메시지:
    발생 시점:
    • @cache 데코레이터가 적용된 메서드를 처음 호출할 때 발생
    • 서버 시작 시가 아니라 실제 메서드 호출 시점에 발생
    원인:
    • sonamu.config.tsserver.cache 설정이 없음
    • 또는 설정이 잘못됨
    해결 방법: sonamu.config.ts에 최소한의 캐시 설정을 추가하세요:
    최소 설정 설명:
    • default: 기본 스토어 이름 (여기서는 “main”)
    • stores: 스토어 객체 정의
      • main: 스토어 이름 (원하는 이름 사용 가능)
      • store().useL1Layer(...): 메모리 드라이버를 L1 캐시로 사용
      • maxSize: "50mb": 메모리 캐시 최대 크기
    테스트 환경에서는: bootstrap(vi) 호출 시 자동으로 메모리 드라이버가 설정되므로 별도 설정이 불필요합니다.
    일반적인 실수:
  2. 비동기 메서드만 가능: 동기 메서드에는 사용 불가
  3. 스토어 이름 일치: store 옵션은 설정에 정의된 이름과 일치해야 함
  4. 직렬화 가능한 값만: 함수, Symbol 등은 캐싱 불가
  5. 인자 순서 중요: 같은 값이라도 순서가 다르면 다른 키

다음 단계

캐시 설정

Stores와 Drivers 설정하기

캐시 무효화

Tag 기반 캐시 무효화

캐시 전략

TTL, Grace, Namespace 활용