@Cacheable: 복잡한 코드 없이 메모리 기반 데이터 캐싱 수행

상위 맥락

03. Async와 Caching < 01. AOP와 빈 관리 원리 < 01. Spring MVC1 기초와 아키텍처 < MVC < Spring < Web

핵심 정리

@Cacheable은 반복되는 계산이나 조회 결과를 캐시에 저장하고, 같은 요청이 다시 들어오면 실제 메서드를 실행하지 않고 캐시된 값을 반환하게 해주는 기능입니다. 캐싱 로직을 비즈니스 코드에 직접 작성하지 않아도 된다는 점에서 AOP 기반 기능 확장의 대표적인 예시입니다.

동작 원리

@Cacheable이 붙은 메서드가 외부에서 호출되면, 스프링 프록시가 먼저 개입합니다. 프록시는 동일한 조건의 결과가 캐시에 이미 있는지 확인합니다.

  • 캐시에 값이 있으면 실제 타겟 메서드를 실행하지 않고 캐시 값을 반환합니다.
  • 캐시에 값이 없으면 타겟 메서드를 실행하고, 그 결과를 캐시에 저장한 뒤 반환합니다.

자료에서는 스프링이 기본적으로 SimpleCacheManager와 ConcurrentHashMap 기반의 메모리 캐싱을 활용할 수 있다고 설명합니다.

비즈니스 로직과의 분리

캐싱을 직접 구현하려면 “캐시 조회 → 없으면 실제 로직 실행 → 결과 저장 → 반환” 흐름을 메서드마다 작성해야 합니다. @Cacheable은 이 반복 로직을 프록시 쪽으로 분리합니다. 따라서 타겟 메서드는 실제 계산이나 조회만 담당하고, 캐시 확인과 저장은 스프링 인프라가 담당합니다.

@Async와의 공통점

@Cacheable과 @Async는 모두 AOP 기반 기능 확장입니다. 둘 다 메서드에 어노테이션을 붙이는 선언적 방식으로 적용되며, 실제 동작은 프록시가 외부 호출을 가로챌 때 이루어집니다. 따라서 둘 다 @Enable 설정이 필요하고, 내부 호출 문제의 영향을 받습니다.

한 문장 요약

@Cacheable은 캐시 조회와 저장이라는 반복적인 성능 최적화 코드를 프록시에 맡기고, 타겟 메서드는 순수한 데이터 처리에 집중하게 합니다.

핵심 연결

AOP, 프록시와 함께 읽으면 좋습니다.