JAVA

[Java] Proxy Pattern - AOP

lakelight 2022. 7. 31. 19:04
728x90
반응형

AOP (Aspect Oriented Programming)

관점 지향 프로그래밍 즉, 어떤 로직을 기준으로 핵심적인 관점, 부가적인 관점으로 나누어서 보고 그 관점을 기준으로 각각 모듈화 하겠다는 의미 입니다.

이미지 출처: https://dzone.com/articles/overview-of-spring-aspect-oriented-programming-aop

 

Proxy Pattern을 활용한 AOP 구현

[Browser interface]

package Java.proxy;

public interface Browser {
    HTML show() throws InterruptedException;
}

[HTML class]

package Java.proxy;

public class HTML {
    private String url;

    public HTML(String url) {
        this.url = url;
    }
}

 

[AopBrowser class]

package Java.aop;

import Java.proxy.Browser;
import Java.proxy.HTML;

public class AopBrowser implements Browser {

    private String url;
    private HTML html;
    private Runnable before;
    private Runnable after;

    public AopBrowser(String url, Runnable before, Runnable after) {
        this.url = url;
        this.before = before;
        this.after = after;
    }

    @Override
    public HTML show() throws InterruptedException {
        before.run();

        if(html==null){
            this.html = new HTML(url);
            System.out.println("AopBrowser html loading from: " + url);
            Thread.sleep(1500);
        }

        after.run();

        System.out.println("AopBrowser html cache: " + url);
        return html;
    }
}
Runnable before와 after를 통해 메서드가 수행시간이 얼마나 걸리는지 측정할 수 있습니다.
AopBrowser의 생성자를 만들어서 before와 after를 Main에서 정의할 것입니다.
Proxy Pattern에서 했었던 것처럼 HTML를 받아오는데 캐시된 데이터가 있다면 그것을 받아오게 하였습니다.

 

[AopMain class]

package Java.aop;

import java.util.concurrent.atomic.AtomicLong;

public class AopMain {
    public static void main(String[] args) throws InterruptedException {

        AtomicLong start = new AtomicLong();
        AtomicLong end = new AtomicLong();

        AopBrowser aopBrowser = new AopBrowser("https://lakelight.tistory.com",
                () -> {
                    System.out.println("before");
                    start.set(System.currentTimeMillis());
                },
                () -> {
                    long now = System.currentTimeMillis();
                    end.set(now - start.get());
                });

        aopBrowser.show();
        System.out.println("loading time: " + end.get());

        aopBrowser.show();
        System.out.println("loading time: " + end.get());
    }
}
AtomicLong을 이용해 현재 시간을 받고 메서드가 끝나는 시간도 받아서 수행시간이 얼마나 걸리는지 측정합니다.
처음 aopBrowser.show()를 호출할 때는 loading을 해야하므로 시간이 1.5초 정도 걸리고
다음에 aopBrowser.show()를 호출할 때는 캐시된 데이터를 가져오기 때문에 0초가 걸립니다.

 

결과
before
AopBrowser html loading from: https://lakelight.tistory.com
AopBrowser html cache: https://lakelight.tistory.com
loading time: 1507
before
AopBrowser html cache: https://lakelight.tistory.com
loading time: 0

 

결론

프록시 패턴을 활용해서 AOP를 구현 해보았습니다.
캐시된 데이터를 가져올 때는 확실히 빠르게 데이터를 가져올 수 있다는 것을 알았고,
AOP를 활용하면 각각의 메서드들의 수행 시간을 알 수 있다는 것을 알게되었습니다.

728x90
반응형

'JAVA' 카테고리의 다른 글

[Java] Observer Pattern  (0) 2022.08.01
[Java] Decorator Pattern - Example Car  (0) 2022.08.01
[Java] Proxy Pattern  (0) 2022.07.31
[Java] Adapter Pattern  (0) 2022.07.31
[Java] Thread Method : wait(), notify()  (0) 2022.07.31