본문 바로가기

Study Information Technology

Spring Boot에서 캐싱을 활용하는 방법

728x90
반응형

Spring Boot에서 캐싱을 활용하는 방법

Overview

Spring Boot는 강력하고 유연한 프레임워크로, 데이터베이스나 외부 API와의 상호작용에서 성능을 개선하기 위해 캐싱을 활용할 수 있습니다. 캐싱은 자주 요청되는 데이터를 메모리에 저장하여 불필요한 계산이나 데이터베이스 조회를 줄이는 기술입니다. 이 글에서는 Spring Boot에서 캐싱을 설정하고 활용하는 방법을 자세히 설명하겠습니다.

1. Spring Boot 캐싱 개요

Spring Boot는 @Cacheable, @CachePut, @CacheEvict 어노테이션을 제공하여 캐시 처리를 쉽게 할 수 있도록 도와줍니다. 캐싱은 주로 데이터베이스 쿼리 결과나 외부 API 호출 결과를 메모리에 저장하여 성능을 개선하는 데 사용됩니다. Spring Boot는 다양한 캐시 구현체를 지원하며, 가장 일반적으로 사용되는 구현체로는 EhCache, Redis, Caffeine 등이 있습니다.

2. Spring Boot 캐싱 설정

  1. 의존성 추가

Spring Boot의 캐싱 기능을 사용하려면 먼저 프로젝트에 캐싱 관련 의존성을 추가해야 합니다. 예를 들어, Maven을 사용하는 경우 pom.xml에 다음 의존성을 추가할 수 있습니다:

<dependencies>
  <!-- Spring Boot Starter Cache -->
  <dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-cache</artifactId>
  </dependency>

  <!-- EhCache (예시로 추가) -->
  <dependency>
    <groupId>org.ehcache</groupId>
    <artifactId>ehcache</artifactId>
  </dependency>
</dependencies>

Gradle을 사용하는 경우 build.gradle에 다음을 추가할 수 있습니다:

dependencies {
// Spring Boot Starter Cache
implementation 'org.springframework.boot:spring-boot-starter-cache'

// EhCache (예시로 추가)
implementation 'org.ehcache:ehcache'
}
  1. 캐시 구성

Spring Boot에서 캐시를 사용하려면 @EnableCaching 어노테이션을 사용하여 캐싱을 활성화해야 합니다. 이를 보통 @SpringBootApplication이 붙은 메인 클래스에 추가합니다.

import org.springframework.cache.annotation.EnableCaching;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
@EnableCaching
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
  1. 캐시 설정

캐시 설정을 위해 application.properties 또는 application.yml 파일에 필요한 설정을 추가할 수 있습니다. 예를 들어, EhCache를 사용하는 경우 ehcache.xml 파일을 추가하여 캐시 설정을 정의합니다.

src/main/resources/ehcache.xml:

<?xml version="1.0" encoding="UTF-8"?>
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xmlns="http://www.ehcache.org/v3"
        xsi:schemaLocation="http://www.ehcache.org/v3
                            http://www.ehcache.org/v3/schemas/ehcache-v3.xsd">
  <cache alias="myCache">
    <key-type>java.lang.String</key-type>
    <value-type>java.lang.String</value-type>
    <heap unit="entries">100</heap>
  </cache>
</config>

application.properties:

spring.cache.type=ehcache
spring.cache.ehcache.config=classpath:ehcache.xml

application.yml:

spring:
cache:
type: ehcache
ehcache:
config: classpath:ehcache.xml

3. 캐시 어노테이션 사용

  1. @Cacheable

@Cacheable 어노테이션은 메서드의 결과를 캐시에 저장합니다. 메서드가 호출될 때, 먼저 캐시를 확인하고, 캐시에 결과가 있으면 이를 반환하고, 없으면 메서드를 호출하여 결과를 캐시에 저장합니다.

import org.springframework.cache.annotation.Cacheable;
import org.springframework.stereotype.Service;

@Service
public class MyService {

@Cacheable("myCache")
public String getData(String param) {
// 비즈니스 로직, 예를 들어 데이터베이스 조회
return "Data for " + param;
}
}

위의 코드에서 getData 메서드는 myCache라는 캐시에 데이터를 저장하고, 다음에 동일한 param으로 호출될 때 캐시된 데이터를 반환합니다.

  1. @CachePut

@CachePut 어노테이션은 메서드를 호출할 때마다 캐시를 업데이트합니다. 메서드의 결과를 캐시에 저장하지만, 캐시 조회와는 관련이 없습니다.

@Service
public class MyService {

@CachePut(value = "myCache", key = "#param")
public String updateData(String param) {
// 비즈니스 로직
return "Updated data for " + param;
}
}

이 경우 updateData 메서드를 호출하면, 항상 캐시가 업데이트됩니다.

  1. @CacheEvict

@CacheEvict 어노테이션은 캐시에서 데이터를 제거합니다. 주로 데이터가 변경될 때 호출됩니다.

@Service
public class MyService {

@CacheEvict(value = "myCache", key = "#param")
public void removeData(String param) {
// 데이터 제거 또는 처리 로직
}
}

removeData 메서드는 myCache에서 지정된 키의 데이터를 제거합니다.

4. 캐시 성능 모니터링 및 에러 처리

캐시 성능을 모니터링하고 오류를 처리하는 것도 중요합니다. 예를 들어, 캐시가 제대로 작동하지 않거나 예상치 못한 결과를 반환할 때 문제가 발생할 수 있습니다. 이를 해결하기 위해 다음과 같은 조치를 취할 수 있습니다.

  1. 로그 확인

캐시 관련 로그를 확인하여 캐시가 제대로 동작하는지 모니터링할 수 있습니다. 로그 레벨을 DEBUG로 설정하여 캐시의 히트 및 미스를 추적할 수 있습니다.

logging.level.org.springframework.cache=DEBUG
  1. 캐시 오류 처리

캐시 구현체가 특정 상황에서 오류를 발생시킬 수 있습니다. 예를 들어, EhCache에서 CacheNotFoundException이 발생할 수 있습니다. 이 경우, 캐시 설정이 올바른지, 캐시 이름이 정확한지 확인해야 합니다.

import org.ehcache.Cache;
import org.ehcache.CacheManager;
import org.ehcache.config.builders.CacheConfigurationBuilder;
import org.ehcache.config.builders.CacheManagerBuilder;
import org.ehcache.config.builders.ResourcePoolsBuilder;

public class EhCacheExample {

public static void main(String[] args) {
CacheManager cacheManager = CacheManagerBuilder.newCacheManagerBuilder().build(true);

Cache<String, String> cache = cacheManager.createCache("myCache",
CacheConfigurationBuilder.newCacheConfigurationBuilder(String.class, String.class,
ResourcePoolsBuilder.heap(100)));

try {
String value = cache.get("key");
} catch (CacheNotFoundException e) {
// 캐시가 존재하지 않을 때 처리 로직
System.out.println("캐시가 존재하지 않습니다.");
}
}
}

참고문서

  1. Spring Boot 공식 문서 - Caching
  2. Spring Framework 공식 문서 - Caching
  3. EhCache 공식 문서
  4. Caffeine 캐시 공식 문서

이 설명은 Spring Boot에서 캐싱을 설정하고 활용하는 방법에 대해 깊이 있게 다루었으며, 실제 프로젝트에서 캐싱을 효과적으로 사용할 수 있도록 돕기 위한 내용으로 구성되었습니다.

728x90
반응형