본문 바로가기
스프링 부트3

스프링 부트 3의 캐싱 기법

by 굿센스굿 2024. 12. 5.
반응형

 

애플리케이션의 성능 최적화는 사용자 경험과 시스템 효율성을 높이는 핵심 요소입니다. 특히, 데이터베이스나 외부 API와의 반복적인 호출은 응답 속도를 저하시킬 수 있습니다. 이러한 문제를 해결하기 위해 캐싱은 매우 효과적인 전략으로 사용됩니다. 이번 블로그에서는 스프링 부트 3에서 제공하는 캐싱 기법과 주요 사용 방법, 그리고 실제 활용 사례 3가지를 자세히 살펴보겠습니다.


1. 스프링 부트 3에서의 캐싱 개요

스프링 부트 3는 스프링 프레임워크의 캐싱 기능을 통합하여 간편한 설정으로 강력한 캐싱 기능을 제공합니다. 주요 특징은 다음과 같습니다:

  • 간단한 어노테이션 기반 구성: @Cacheable, @CachePut, @CacheEvict와 같은 어노테이션을 사용해 캐싱 로직을 쉽게 적용할 수 있습니다.
  • 다양한 캐시 제공자 지원: Ehcache, Caffeine, Redis 등과 같은 다양한 캐시 제공자와 손쉽게 통합 가능합니다.
  • 유연한 설정: YAML 또는 프로퍼티 파일을 통해 캐시 설정을 세부적으로 조정할 수 있습니다.

2. 캐싱의 주요 어노테이션과 사용법

2.1 @Cacheable

@Cacheable은 메서드의 결과를 캐시에 저장합니다. 동일한 파라미터로 메서드를 호출하면 캐시된 결과를 반환하여 성능을 향상시킵니다.

@Cacheable(value = "products", key = "#id")
public Product getProductById(Long id) {
    System.out.println("Fetching product from database...");
    return productRepository.findById(id).orElseThrow();
}
  • value: 캐시 이름을 지정합니다.
  • key: 캐시 항목을 식별하기 위한 키를 정의합니다. 기본적으로 파라미터 값을 사용합니다.

2.2 @CachePut

@CachePut은 메서드 실행 결과를 캐시에 저장하면서 항상 메서드를 실행합니다.

@CachePut(value = "products", key = "#product.id")
public Product updateProduct(Product product) {
    System.out.println("Updating product in database...");
    return productRepository.save(product);
}
  • 주요 사용 사례: 데이터 갱신 시 캐시도 함께 업데이트해야 하는 경우 유용합니다.

2.3 @CacheEvict

@CacheEvict는 캐시에 저장된 데이터를 삭제할 때 사용합니다.

@CacheEvict(value = "products", key = "#id")
public void deleteProduct(Long id) {
    System.out.println("Deleting product...");
    productRepository.deleteById(id);
}
  • allEntries: 캐시에 저장된 모든 데이터를 삭제하려면 allEntries = true로 설정합니다.

3. 주요 캐시 제공자와의 통합

스프링 부트 3는 여러 캐시 제공자와 쉽게 통합할 수 있도록 지원합니다. 아래는 대표적인 캐시 제공자와 설정 예시입니다.

3.1 Ehcache

Ehcache는 JVM 내에서 동작하는 고성능 캐시로, 설정이 간단합니다.

의존성 추가

<dependency>
    <groupId>org.ehcache</groupId>
    <artifactId>ehcache</artifactId>
</dependency>

설정 파일 (ehcache.xml)

    
        1000
        
            3600
        
    

3.2 Caffeine

Caffeine은 Google Guava 기반의 고성능 캐시 라이브러리입니다.

의존성 추가

<dependency>
    <groupId>com.github.ben-manes.caffeine</groupId>
    <artifactId>caffeine</artifactId>
</dependency>

설정 (application.yml)

spring:
  cache:
    type: caffeine
    caffeine:
      spec: maximumSize=1000,expireAfterWrite=3600s

3.3 Redis

Redis는 분산 캐시로 많이 사용되며, 네트워크를 통해 데이터를 공유할 수 있습니다.

의존성 추가

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>

설정 (application.yml)

spring:
  redis:
    host: localhost
    port: 6379
    cache:
      time-to-live: 3600s

4. 실무 활용 예시

예시 1: 상품 정보 캐싱

온라인 쇼핑몰에서 상품 정보를 자주 조회하지만, 데이터는 자주 변경되지 않을 때 캐시를 활용합니다.

@Cacheable(value = "productCache", key = "#productId")
public Product getProduct(Long productId) {
    return productRepository.findById(productId).orElseThrow();
}

예시 2: API 응답 캐싱

외부 API 호출 비용이 높은 경우, 결과를 캐싱해 재사용합니다.

@Cacheable(value = "weatherCache", key = "#location")
public WeatherData getWeather(String location) {
    return weatherApiClient.getWeather(location);
}

예시 3: 사용자 세션 데이터 캐싱

로그인 사용자 정보를 Redis를 활용해 캐싱하면 성능을 크게 개선할 수 있습니다.

@Cacheable(value = "userSession", key = "#userId")
public UserSession getUserSession(Long userId) {
    return userSessionRepository.findById(userId).orElseThrow();
}

결론

스프링 부트 3의 캐싱 기법은 애플리케이션 성능을 최적화하는 데 매우 효과적입니다. 간단한 설정으로 시작할 수 있으며, 다양한 캐시 제공자와 통합해 유연한 활용이 가능합니다. 위에서 다룬 예시를 참고하여 캐싱을 적절히 적용하면 성능 향상뿐 아니라 시스템 리소스를 절약하는 데도 큰 도움이 될 것입니다.

여러분의 애플리케이션에도 캐싱을 도입해 보세요! 🚀

반응형