[Spring] AOP ④ - (예제) HashMap으로 Cache 기능구현

2020. 9. 30. 23:16개발공부/Spring

AOP 시간 마무리로 HashMap을 이용한 Cache 기능 구현을 해보려 합니다. Factorial(팩토리얼) 메서드를 인터페이스에서 implements하여 클래스 두 가지로 나눠 담았습니다.  

ProceedingJoinPoint는 Java API JoinPoint Class인데 getArgs() 메서드는 execution 메서드. 즉 공통(횡단) 메서드의 매개변수를 배열로 반환해 줍니다. 메서드 return 값을 반환해주는 proceed() 메서드의 데이터 타입은 Object 이기 때문에 주의해야 합니다. 

핵심은 cache 기능을 Map 인터페이스의 HashMap 클래스로 구현하는 부분입니다. 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
 
import java.util.HashMap;
import java.util.Map;
 
@Aspect
public class CacheAspect {
 
    private Map<Long, Object> cache = new HashMap<>();
 
    @Around("execution(public * factorial(long))")
    public Object execute(ProceedingJoinPoint pjp) throws Throwable{
        Long num = (Long)pjp.getArgs()[0]; //객체 배열을 반환. 메서드가 long을 단일 반환하는 타입이었으므로 배열 length는 1
        if (cache.containsKey(num)) {
            System.out.println("CacheAspect: 이미 구한 숫자입니다.");
            cache.get(num);
        }
        Object result = pjp.proceed();
        cache.put(num, result);
        System.out.printf("CacheAspect: Cache에 추가[%d]\n", num);
 
        return result;
    }
}
 
cs