[java] 함수형 인터페이스를 사용하여 캐싱을 구현하는 방법은 어떻게 되나요?
- 캐시 인터페이스 정의하기: 캐시에 엑세스하기 위한 인터페이스를 정의합니다. 예를 들어,
Cache
인터페이스를 만들 수 있습니다. 이 인터페이스는 값을 가져오는get
메서드와 값을 저장하는put
메서드를 포함할 수 있습니다.
public interface Cache<K, V> {
V get(K key);
void put(K key, V value);
}
- 캐시 래퍼 클래스 만들기: 캐시를 사용하여 실제 작업을 수행하는 래퍼 클래스를 만듭니다. 이 래퍼 클래스는 캐시 인터페이스를 구현하고, 실제 작업을 수행하기 전에 캐시에서 값을 가져오거나 캐시에 값을 저장할 수 있습니다.
public class CachingWrapper<K, V> implements Cache<K, V> {
private final Cache<K, V> cache;
public CachingWrapper(Cache<K, V> cache) {
this.cache = cache;
}
@Override
public V get(K key) {
V value = cache.get(key);
if (value == null) {
// 값이 캐시에 없으면 실제 작업을 수행하고 캐시에 저장
value = performActualTask(key);
cache.put(key, value);
}
return value;
}
@Override
public void put(K key, V value) {
cache.put(key, value);
}
private V performActualTask(K key) {
// 실제 작업 수행
// ...
return value;
}
}
- 캐시 인스턴스 생성하기: 캐시를 사용하는 프로젝트에서 캐시 인스턴스를 생성합니다. 만약 메모리 기반의 캐시를 사용하려면
HashMapCache
같은 구현체를 만들 수 있습니다.
public class HashMapCache<K, V> implements Cache<K, V> {
private final Map<K, V> cache = new HashMap<>();
@Override
public V get(K key) {
return cache.get(key);
}
@Override
public void put(K key, V value) {
cache.put(key, value);
}
}
// 캐싱 기능을 사용하는 코드
Cache<String, Integer> cache = new CachingWrapper<>(new HashMapCache<>());
int value = cache.get("key"); // 캐시에서 값을 가져옴
cache.put("key", value); // 캐시에 값을 저장
위의 예제에서는 CachingWrapper
클래스를 사용하여 캐싱 기능을 추가했습니다. 이를 통해 실제 작업이 수행될 때마다 캐시에서 값을 가져오고 캐시에 값을 저장할 수 있습니다. 이렇게 캐싱을 구현하면 작업 성능을 향상시킬 수 있습니다.
참고 자료: