공공부하자개발 · 영어 학습 노트
자바
실무 확장Excel · 파일 업로드 · DB 연동0/22 완료
  • 01Excel(XLSX) 구조와 순수 JDK로 읽기/쓰기
  • 02Apache POI로 Excel 업로드/다운로드
  • 03파일 업로드/다운로드 서버 (HttpServer)
  • 04JDBC 기초와 트랜잭션 (H2)
  • 05MyBatis 어노테이션 매퍼로 쿼리 연동
  • 06MyBatis XML 매퍼 · Oracle 방언 · PageHelper · Spring Boot
  • 07REST API 서버와 JSON
  • 08Vue 3 SPA 와 Java 서버 연동
  • 09@Scheduled 운영
  • 10로깅 실무: 레벨·계층, MDC 추적, 예외·성능, 마스킹, 롤링, JSON 로그
  • 11외부 API 연동
  • 12테스트 실무
  • 13암호화·개인정보 보호
  • 14인코딩·한글 실무
  • 15@Transactional 심화
  • 16긴 작업 비동기 처리와 진행률
  • 17SFTP·FTP 파일 연계
  • 18로컬 캐시와 @Cacheable
  • 19메일·알림 발송
  • 20웹 보안 체크리스트
  • 21빌드 도구와 폐쇄망 의존성 반입
  • 22성능 측정: p50·p95·p99, 측정 계층, JFR, JMH 함정, 자체 부하 테스트, 병목 순위
사이트 소개개인정보처리방침연락처
© 2026 공부하자
홈 › 실무 확장 › 18 / 22

로컬 캐시와 @Cacheable

TTL, 크기 제한, 스탬피드 방지, 무효화, Caffeine 설정
섹션 7진행 0 / 22
1왜 배우는가2핵심 원리3코드 예제4응용 변형 예제5자주 하는 실수 (Tip)6연습 문제7정리‹ 이전다음 ›

5. 자주 하는 실수 (Tip)

실수 1: 자주 바뀌는 데이터를 캐시한다

재고 수량, 계좌 잔액처럼 정합성이 중요한 값을 캐시하면 오래된 값을 보여주는 사고로 이어집니다. 캐시 여부를 정하기 전에 "이 값이 잠깐 오래돼도 괜찮은가"를 먼저 물어봐야 합니다.

실수 2: TTL 없이 무한정 캐시한다

TTL 을 안 두면 원본 데이터가 바뀌어도 서버를 재시작할 때까지 옛날 값이 계속 나갑니다. 코드 테이블처럼 거의 안 바뀌는 데이터도 최소한의 TTL(예: 1시간)은 두는 편이 안전합니다.

실수 3: 크기 제한 없이 캐시 키가 무한정 늘어난다

사용자별·요청 파라미터별로 키가 계속 늘어나는 캐시에 크기 제한이 없으면 힙 메모리를 다 써버릴 수 있습니다. maximumSize 를 항상 TTL 과 함께 설정합니다.

실수 4: 캐시 스탬피드를 방치한다

인기 키가 만료되는 순간 동시 요청이 전부 DB 를 때리면, 트래픽이 많은 시스템에서는 DB 커넥션 풀이 순식간에 고갈됩니다. computeIfAbsent 류로 계산을 키당 한 번만 실행하도록 막아야 합니다.

실수 5: self-invocation 으로 캐시가 조용히 무시된다

같은 클래스 내부에서 this.메서드() 로 @Cacheable 메서드를 호출하면 프록시를 안 거쳐 캐시가 동작하지 않는데도 에러가 나지 않습니다. 캐시 적중률이 0%로 나온다면 self-invocation 을 가장 먼저 의심합니다.

실수 6: 쓰기 후 캐시 무효화를 잊는다

update 나 delete 메서드에 @CacheEvict 를 빼먹으면, 조회 캐시가 수정 전 값을 계속 돌려줘 "분명히 고쳤는데 화면엔 옛날 값이 나온다"는 문의로 이어집니다. 쓰기 메서드마다 캐시 무효화가 필요한지 항상 점검합니다.

실수 7: 다중 인스턴스에서 로컬 캐시 불일치를 간과한다

서버 A 에서 evict 해도 서버 B 의 로컬 캐시는 그대로입니다. 인스턴스가 여러 대인 시스템에서 로컬 캐시로 이 문제를 겪는다면 분산 캐시 전환을 검토해야 합니다.

실수 8: 캐시에 개인정보를 그대로 담아 힙 덤프에 노출한다

주민등록번호, 계좌번호 같은 민감 정보를 캐시 값에 그대로 담으면 장애 분석용 힙 덤프에 그대로 남습니다. 캐시에는 마스킹된 값이나 식별자만 담고, 원본 조회는 필요할 때만 DB 로 가는 편이 안전합니다.

자주 하는 실수 (Tip)
  • 실수 1: 자주 바뀌는 데이터를 캐시한다
  • 실수 2: TTL 없이 무한정 캐시한다
  • 실수 3: 크기 제한 없이 캐시 키가 무한정 늘어난다
  • 실수 4: 캐시 스탬피드를 방치한다
  • 실수 5: self-invocation 으로 캐시가 조용히 무시된다
  • 실수 6: 쓰기 후 캐시 무효화를 잊는다
  • 실수 7: 다중 인스턴스에서 로컬 캐시 불일치를 간과한다
  • 실수 8: 캐시에 개인정보를 그대로 담아 힙 덤프에 노출한다
이전 섹션4 응용 변형 예제5 / 7다음 섹션6 연습 문제