백엔드/스프링 프레임워크 & 스프링 부트

스프링 프레임워크 `@Cacheable`을 알아보자

slowcloud_ 2025. 5. 13. 22:45

@Configuration 클래스에 @EnableCaching 어노테이션을 적용하면 캐싱이 가능하다. 메소드에 @Cacheable을 사용하면 해당 메소드에 캐싱이 적용되며, 같은 파라미터 입력에 대해 캐싱된 출력을 즉시 반환한다. @Cacheable 외에도 @CacheEvict, @CachePut, @Caching @CacheConfig 등의 어노테이션들이 존재한다.

 

@Cacheable이 적용된 메소드에서 입력받은 파라미터는 KeyGenerator를 통해 SimpleKey를 생성하며, 이를 통해 캐싱한 데이터를 저장하고, 또 찾는다. 이 때, 객체의 hashCode 메소드equals 메소드를 사용한다.

 

파라미터의 어떤 속성을 기반으로 키를 생성할 것인지 설정할 수도 있다. 이 경우 SpEL을 활용한다.

 

멀티쓰레드 환경에서도 캐시를 사용할 수 있으며, 이 경우 Lock 적용을 위해 sync=true 속성을 주어야 한다.

@Cacheable(cacheNames="foos", sync=true) 
public Foo executeExpensiveOperation(String id) {...}

 

@CacheEvict가 추가된 메소드가 실행되면 동일한 이름의 캐시스토어에 대해, 입력받은 파라미터를 기반으로 해당 캐시를 제거한다.

@CacheEvict(cacheNames="books", allEntries=true) // <-- allEntries를 키면 모든 캐시를 제거한다.
public void loadBooks(InputStream batch)

 

@CachePut@Cacheable과 동일하나, 캐싱된 데이터를 반환하지 않는다. 캐시를 사용하지 않되, 반환값을 추가하거나 업데이트해야 할 때 사용할 수 있다.

@CachePut(cacheNames="book", key="#isbn") // <-- isbn 기반 키 설정
public Book updateBook(ISBN isbn, BookDescriptor descriptor)

 

캐시는 빈으로 등록된 CacheManager에서 관리하며, 스프링 프레임워크에서 일부 구현체를 제공하고 있다. 스프링 부트의 경우, 만약 자동 설정을 통해 CacheManager를 등록했다면, CacheManagerCustomizer를 빈으로 등록하여 초기화를 수행해줄 수 있다. 직접 CacheManager 빈을 등록했다면 생략해도 된다.

@Configuration(proxyBeanMethods = false)
public class MyCacheManagerConfiguration {

	@Bean
	public CacheManagerCustomizer<ConcurrentMapCacheManager> cacheManagerCustomizer() {
		return (cacheManager) -> cacheManager.setAllowNullValues(false);
	}

}

 

 

캐시된 데이터들은 기본적으로 인 메모리에 저장하나, 외부 저장소를 활용할 수 있다. 외부 저장소들은 Spring Data에서 지원하는 저장소들을 위주로 제공하며, 각 문서에서 자세한 설정을 확인할 수 있다. 스프링 부트 캐시 문서에서 지원하는 외부 저장소들과 properties를 한 눈에 확인할 수 있다.

 

구현체에 따라 TTL, 정책 등을 따로 설정할 수 있다. 스프링 부트에서는 properties에서 설정이 가능하다. 아래는 레디스 예시이다.

spring.cache.redis.time-to-live=10m # 10분의 TTL 설정

 

자세한 사항은 아래 문서들을 통해 확인하는 것을 추천한다.

참고