..

Spring Boot 캐싱(Caching) 전략과 @Cacheable 활용

1. 개요 (Overview)

서비스의 성능을 높이는 가장 확실한 방법 중 하나는 캐싱(Caching)입니다. 반복적으로 수행되는 무거운 연산이나 DB 조회의 결과를 메모리에 저장해두고, 동일한 요청이 왔을 때 즉시 응답함으로써 시스템 부하를 줄이고 속도를 비약적으로 높일 수 있습니다.

2. 의존성 추가 (Dependencies)

Spring Boot 환경에서 캐싱 기능을 사용하기 위해 필요한 핵심 의존성들입니다.

# build.gradle
dependencies {
    // 스프링 캐시 기본 인터페이스 및 매니저 제공
    implementation 'org.springframework.boot:spring-boot-starter-cache'
}

3. 설정 (Configuration)

3-1. 캐싱 활성화

설정 클래스 상단에 @EnableCaching 어노테이션을 추가하여 캐싱 기능을 활성화합니다.

@Configuration
@EnableCaching
public class CachingConfig {
    // 기본적으로 ConcurrentMapCacheManager가 자동 구성됩니다.
}

3-2. 캐시 세부 설정 (Customizer)

특정 캐시의 이름을 지정하거나 세부적인 동작을 커스터마이징하고 싶을 때 CacheManagerCustomizer를 활용합니다.

@Component
public class SimpleCacheCustomizer implements CacheManagerCustomizer<ConcurrentMapCacheManager> {
    @Override
    public void customize(ConcurrentMapCacheManager cacheManager) {
        // 사용할 캐시 이름들을 미리 정의
        cacheManager.setCacheNames(List.of("auditEndPointList"));
    }
}

4. 실전 활용: @Cacheable

메소드 위에 @Cacheable을 선언하는 것만으로 간단하게 캐싱 로직을 적용할 수 있습니다.

  • 동작 방식: 메소드 호출 시 지정된 캐시에 값이 있는지 먼저 확인합니다.
    • Cache Miss: 캐시에 값이 없으면 내부 로직을 수행하고 결과값을 캐시에 저장합니다.
    • Cache Hit: 캐시에 값이 있으면 내부 로직을 실행하지 않고 즉시 캐시된 값을 반환합니다.
@Cacheable(value = "auditEndPointList")
public List<String> getAuditList() {
    // DB에서 목록을 가져오는 무거운 작업 수행...
    return endPointMapper.selectAllContextPaths();
}

기본 캐시 매니저는 로컬 메모리를 사용하므로, 분산 환경(서버가 여러 대인 경우)에서는 Redis나 Ehcache 같은 전문 캐싱 솔루션을 도입하는 것이 좋습니다.