[java] Ehcache와 특정 요청에 대한 캐싱 정책 설정

Ehcache는 자바용 오픈 소스 캐시 라이브러리로, 메모리 기반 캐싱 솔루션을 제공합니다. 이를 통해 애플리케이션의 성능을 향상시킬 수 있습니다. 이번 블로그 포스트에서는 Ehcache를 사용하여 특정 요청에 대한 캐싱 정책을 설정하는 방법에 대해 알아보겠습니다.

Ehcache 라이브러리 추가

먼저, 프로젝트에 Ehcache 라이브러리를 추가해야 합니다. 이를 위해 Maven을 사용하는 경우 pom.xml 파일에 다음 의존성을 추가합니다:

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

Gradle을 사용하는 경우 build.gradle 파일에 다음 종속성을 추가합니다:

implementation 'org.ehcache:ehcache:3.8.1'

캐싱 정책 설정

Ehcache를 사용하여 특정 요청에 대한 캐싱 정책을 설정하려면 다음 단계를 따르세요:

  1. Ehcache 설정 파일을 생성합니다. ehcache.xml 등의 이름으로 파일을 생성하고, 다음과 같이 기본적인 설정을 추가합니다:
<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/schema/ehcache-core-3.0.xsd">

    <cache alias="myCache">
        <resources>
            <heap unit="entries">100</heap>
            <offheap unit="MB">10</offheap>
        </resources>
    </cache>

</config>

위 예제에서는 myCache라는 이름으로 캐시를 생성하고, 힙 메모리에 최대 100개의 항목을 저장하며, 오프힙 메모리에 최대 10MB의 데이터를 저장합니다.

  1. 애플리케이션에서 Ehcache를 초기화하고 캐시 인스턴스를 생성합니다. 다음은 Java 코드로 이를 구현한 예입니다:
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;
import org.ehcache.config.units.EntryUnit;
import org.ehcache.config.units.MemoryUnit;

public class MyCacheManager {
    private static final String CACHE_NAME = "myCache";
    private static final String EHCACHE_CONFIG_PATH = "ehcache.xml";
    
    private CacheManager cacheManager;
    private Cache<String, Object> cache;
    
    public void initCache() {
        cacheManager = CacheManagerBuilder.newCacheManagerBuilder()
                            .withCache(CACHE_NAME,
                                CacheConfigurationBuilder.newCacheConfigurationBuilder(String.class, Object.class,
                                    ResourcePoolsBuilder.newResourcePoolsBuilder()
                                        .heap(100, EntryUnit.ENTRIES)
                                        .offheap(10, MemoryUnit.MB)))
                            .withConfig(new File(EHCACHE_CONFIG_PATH))
                            .build();
        
        cacheManager.init();
        
        cache = cacheManager.getCache(CACHE_NAME, String.class, Object.class);
    }
    
    public void put(String key, Object value) {
        cache.put(key, value);
    }
    
    public Object get(String key) {
        return cache.get(key);
    }
    
    public void closeCacheManager() {
        cacheManager.close();
    }
}

위 예제에서는 MyCacheManager 클래스를 생성하여 Ehcache를 초기화하고 캐시 인스턴스를 생성합니다. initCache 메서드에서는 Ehcache 설정 파일(ehcache.xml)과 함께 캐시를 빌드하고 초기화합니다. put 메서드를 사용하여 캐시에 데이터를 추가하고, get 메서드를 사용하여 캐시에서 데이터를 검색할 수 있습니다. 마지막으로, closeCacheManager 메서드를 사용하여 캐시 매니저를 닫습니다.

  1. 캐싱 정책을 적용할 특정 요청에서 MyCacheManager 클래스를 사용합니다. 예를 들어, 다음은 HTTP 요청을 핸들링하는 Spring MVC 컨트롤러 메서드에서 캐싱을 적용하는 예입니다:
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.ResponseBody;

@Controller
public class MyController {
    private MyCacheManager cacheManager = new MyCacheManager();
    
    @GetMapping("/api/data/{id}")
    @ResponseBody
    public String getData(@PathVariable("id") String id) {
        // 캐시에서 데이터를 가져옵니다.
        String cachedData = (String) cacheManager.get(id);
        
        // 캐시에 데이터가 없는 경우
        if (cachedData == null) {
            // 데이터를 조회하고
            String data = fetchDataFromDatabase(id);
            
            // 데이터를 캐시에 저장합니다.
            cacheManager.put(id, data);
            
            return data;
        }
        
        return cachedData;
    }
    
    private String fetchDataFromDatabase(String id) {
        // 데이터베이스 조회 로직
        // ...
    }
}

위 예제에서는 getData 메서드에서 요청된 ID에 해당하는 데이터를 캐시에서 검색하고, 캐시에 데이터가 없는 경우 데이터베이스에서 조회한 후 캐시에 저장합니다. 데이터를 캐시에 저장했다면 캐시 데이터를 반환하고, 캐시에 데이터가 없었다면 데이터베이스에서 조회한 데이터를 반환합니다.

이처럼 Ehcache를 사용하여 특정 요청에 대한 캐싱 정책을 설정할 수 있습니다. 캐시 라이브러리를 사용하면 반복적인 작업을 최소화하고 애플리케이션 성능을 향상시킬 수 있습니다.

더 많은 정보를 찾으려면 Ehcache 공식 문서를 참조하세요.