[java] 자바 프록시 패턴을 활용한 캐싱 기능 구현

개요

프록시 패턴은 하나의 객체가 다른 객체에 대한 인터페이스로 동작하도록 하여 객체에 대한 접근을 제어하는 디자인 패턴이다. 이 패턴을 활용하여 메소드 호출의 결과를 캐싱하는 기능을 구현할 수 있다.

프록시 패턴을 이용한 캐싱 기능 구현

프록시 패턴을 사용하여 메소드 호출 결과를 캐싱하는 기능을 구현하려면 다음과 같이 코드를 작성할 수 있다.

  1. 캐싱할 메소드를 가진 인터페이스를 정의한다.

     public interface DataService {
         String fetchData(String key);
     }
    
  2. 실제 데이터를 제공하는 클래스를 구현한다.

     public class DataServiceImpl implements DataService {
         @Override
         public String fetchData(String key) {
             // 데이터를 가져오는 로직
             return "Data for key: " + key;
         }
     }
    
  3. 캐싱 기능을 추가한 프록시 클래스를 구현한다.

     import java.util.HashMap;
     import java.util.Map;
    
     public class CachingProxy implements DataService {
         private DataService dataService;
         private Map<String, String> cache = new HashMap<>();
    
         public CachingProxy(DataService dataService) {
             this.dataService = dataService;
         }
    
         @Override
         public String fetchData(String key) {
             if (cache.containsKey(key)) {
                 return cache.get(key);
             } else {
                 String data = dataService.fetchData(key);
                 cache.put(key, data);
                 return data;
             }
         }
     }
    
  4. 클라이언트에서 프록시를 통해 메소드를 호출한다.

     public class Main {
         public static void main(String[] args) {
             DataService dataService = new DataServiceImpl();
             DataService proxy = new CachingProxy(dataService);
    
             System.out.println(proxy.fetchData("key1")); // 데이터를 가져와서 캐싱
             System.out.println(proxy.fetchData("key1")); // 캐싱된 데이터 사용
         }
     }
    

결론

프록시 패턴을 사용하여 메소드 호출 결과를 캐싱하는 기능을 구현할 수 있다. 이를 통해 매번 동일한 메소드 호출에 대해 중복된 계산을 피하고 성능을 향상시킬 수 있다.

참고문헌: