Spring Framework에서 제공하는 캐싱 기능은 애플리케이션의 성능을 극대화하는 중요한 도구입니다.
캐싱을 통해 불필요한 데이터베이스 쿼리나 복잡한 계산을 줄일 수 있으며, 이로 인해 시스템의 응답 시간이 크게 향상됩니다.
본 글은 Spring의 Cache Manager와 @Cacheable 어노테이션에 대해 공부한 내용을 정리한 글입니다.
Cache Manager란❓
Cache Manager는 Spring에서 캐시를 관리하는 핵심 컴포넌트입니다.
애플리케이션 전반에 걸쳐 캐시를 구성하고 관리하는 역할을 담당하며, 다양한 캐시 저장소를 지원합니다. CacheManager 인터페이스는 여러 캐시를 관리할 수 있는 기능을 제공하며, 각 캐시는 Cache 인터페이스로 표현됩니다.
Cache Manager 주요 기능
캐시 저장소 관리
- 캐시 저장소를 제공하고 이를 효율적으로 관리합니다.
캐시 조작
- 특정 키에 대해 값을 저장하거나 가져오는 작업을 처리합니다.
어노테이션 지원
- @Cacheable, @CachePut, @CacheEvict와 같은 캐시 관련 어노테이션이 정상적으로 동작할 수 있도록 지원합니다.
Cache Manager의 종류
CacheManager | 캐시 저장 위치 | 설명 |
ConcurrentMapCacheManager | 메모리 상에 캐시 저장 | ConcurrentHashMap 기반 캐시 구현체입니다. |
CaffeineCacheManager | 메모리 상에 캐시 저장 | Caffeine 기반 캐시 구현체로, 높은 성능을 제공합니다. |
SimpleCacheManager | 메모리 상에 캐시 저장 | 단순한 구조의 캐시 구현체로, 복잡한 설정이 필요 없습니다. |
EhCacheCacheManager | 디스크 또는 데이터베이스에 저장 | Ehcache 기반 캐시 구현체로, 고급 설정과 지속성을 지원합니다. |
HazelcastCacheManager | 메모리 상에 캐시 저장 | 분산 캐시 기능을 제공하는 Hazelcast 기반 캐시 구현체입니다. |
InfinispanCacheManager | 메모리 상에 캐시 저장 | Infinispan 기반 캐시 구현체로, 분산 캐시 기능을 제공합니다. |
RedisCacheManager | Redis 내의 데이터베이스에 저장 | Redis를 사용한 캐시 구현체로, 주로 분산 캐시에 사용됩니다. |
CouchbaseCacheManager | Couchbase 내의 데이터베이스에 저장 | Couchbase 기반 캐시 구현체로, 문서 지향 데이터베이스와의 연동이 특징입니다. |
GemfireCacheManager | 자체 저장소에 저장 | Apache Geode 또는 Pivotal GemFire 기반 캐시 구현체입니다. |
CoherenceCacheManager | 자체 저장소에 저장 | Oracle Coherence 기반 캐시 구현체로, 대규모 분산 환경에서 사용됩니다. |
@Cacheable 어노테이션
@Cacheable은 메서드의 실행 결과를 캐시에 저장하기 위해 사용되는 어노테이션입니다.
이 어노테이션이 적용된 메서드는 첫 번째 호출 시 캐시에 결과를 저장하고, 이후 동일한 인풋으로 메서드를 호출할 때는 캐시에 저장된 값을 반환하여 메서드 실행을 생략할 수 있습니다.
@Cacheable 어노테이션의 속성
value,cacheNames
- 캐시의 이름을 지정합니다.
- 하나 이상의 캐시 이름을 설정할 수 있으며, 지정된 이름의 캐시에 값이 저장됩니다.
key
- 캐시에 저장할 때 사용할 키를 지정합니다.
- 기본적으로 메서드의 인자를 기반으로 키가 생성되지만, SpEL 표현식을 사용하여 커스터마이징할 수 있습니다.
condition
- 특정 조건이 참일 때만 캐싱을 적용합니다.
- 예를 들어, 인자의 값이 특정 범위에 속할 때만 캐싱하도록 설정할 수 있습니다.
unless
- condition과 반대로, 조건이 참일 경우
캐싱을 하지 않습니다.
@Cacheable 어노테이션 예시
import org.springframework.cache.annotation.Cacheable;
import org.springframework.stereotype.Service;
@Service
public class UserService {
@Cacheable(value = "users", key = "#userId")
public User getUserById(Long userId) {
// DB나 외부 API 호출 등 시간이 오래 걸리는 작업
return findUserInDatabase(userId);
}
private User findUserInDatabase(Long userId) {
// 사용자 조회 로직
}
}
위 코드 예시에서 getUserById 메서드는 처음 호출될 때 결과가 "users"라는 이름의 캐시에 저장됩니다. 이후 동일한 userId로 메서드를 호출하면, 캐시된 값이 반환되며 메서드 실행을 생략하게 됩니다.
Cache Manager @Cacheable 어노테이션의 차이점
Cache Manager와 @Cacheable 어노테이션은 Spring에서 캐싱을 처리하는 데 관련된 두 가지 주요 구성 요소이지만, 각각의 역할과 사용 목적이 다릅니다.
먼저, 캐시를 사용하기 위해서는 설정 파일(Config)이 필요합니다.
Cache Manager는 캐시를 관리하는 주요 구성 요소로, 어떤 캐시 구현체를 사용할지, 그리고 그 캐시의 구체적인 설정(예: 캐시 크기, 만료 시간 등)을 결정해야 합니다. 이를 위해 Spring에서는 주로 설정 파일(application.properties 또는 application.yml)이나 Java 구성 클래스를 통해 Cache Manager를 설정합니다.
반면, @Cacheable 어노테이션은 캐시를 적용할 메서드를 지정하기 위해 사용되며, 이때 Cache Manager가 미리 설정되어 있어야 합니다. 이 설정은 주로 메서드 레벨에서 이루어지며, Cache Manager가 설정된 상태에서 제대로 동작합니다. 따라서 둘은 같이사용되는 것이 일반적입니다.
@Service
public class MyService {
private final CacheManager cacheManager;
public MyService(CacheManager cacheManager) {
this.cacheManager = cacheManager;
}
public void clearCache(String cacheName) {
Cache cache = cacheManager.getCache(cacheName);
if (cache != null) {
cache.clear();
}
}
}
그러나 CacheManager를 단독으로 사용할 수도 있습니다. 예를 들어, 직접 CacheManager를 주입받아 캐시 데이터를 조회하거나 삭제하는 작업을 코드에서 수행할 수 있습니다. 이 경우 @Cacheable 어노테이션을 사용하지 않고도 캐싱 기능을 활용할 수 있습니다.
@EnableCaching이란❓
캐시관련 설정 파일(Config)를 만들었다면, 캐시를 사용하기 위해 캐싱기능을 활성화 해야합니다. @EnableCaching은 Spring에서 캐싱 기능을 활성화하기 위해 사용하는 어노테이션입니다.
import org.springframework.cache.annotation.EnableCaching;
import org.springframework.context.annotation.Configuration;
@Configuration
@EnableCaching
public class CacheConfig {
// 캐시 관련 설정 및 CacheManager 빈 등록
}
이 어노테이션을 사용하면 Spring이 캐싱 관련 기능을 자동으로 설정하고, @Cacheable, @CachePut, @CacheEvict와 같은 캐싱 관련 어노테이션을 사용할 수 있게 됩니다.
주요 기능 및 역할
- 캐시 매니저 설정 활성화
- @EnableCaching은 애플리케이션에서 캐시 관리 기능을 활성화합니다.
- 이를 통해 Spring은 CacheManager 빈을 자동으로 탐색하고, 애플리케이션에서 사용할 수 있도록 합니다.
- 만약 애플리케이션에 여러 개의 CacheManager가 있다면, 기본적으로 우선순위가 높은 CacheManager를 사용하거나, 특정 CacheManager를 지정할 수도 있습니다.
- 캐싱 어노테이션 활성화
- 이 어노테이션을 추가하면, @Cacheable, @CachePut, @CacheEvict 등의 캐싱 관련 어노테이션을 사용할 수 있게 됩니다.
- 예를 들어, @Cacheable이 적용된 메서드의 결과를 캐시에 저장하고, 동일한 인풋으로 호출할 경우 캐시된 결과를 반환합니다.
'Framework > Spring\Spring boot' 카테고리의 다른 글
[Spring boot] @Pattern 어노테이션: 정규 표현식으로 입력 검증 간편하게 하기 (0) | 2024.08.27 |
---|---|
[Spring boot] @PostConstruct : 빈의 안전한 초기화 콜백 (0) | 2024.08.25 |
[Spring Boot] Spring Boot에서 데이터 검증: @Valid와 @Column(nullable = false)의 차이와 함께 사용하는 방법 (0) | 2024.08.15 |
[Spring boot] @Builder 어노테이션의 장점 (0) | 2024.08.09 |
[Spring Cloud] Zipkin을 이용한 분산 추적: 요청 흐름과 성능 모니터링 (0) | 2024.08.07 |