JAVA/디자인 패턴

4. 프록시(Proxy) 패턴

개발자잡 2022. 6. 25. 08:42

Proxy는 대리인이라는 뜻, 뭔가를 대신해서 처리하는 것이다.

Proxy Class를 통해서 대신 전달 하는 형태로 설게되며, 실제 Client는 Proxy로 부터 결과를 받는다.

Cache의 기능으로도 활용 가능.

SOLID중에서 개방폐쇄 원칙(OCP)와 의존 역전 원칙(DIP)를 따른다.

 

Cache 

브라우저에서 가장 많이 사용하는 기능.

인터넷 통신에서 이미 받은 결과를 그 결과를 그대로 내려주거나 자주 변경되지 않은 데이터를 메모리에 캐싱해서 내려주는 식으로 사용.

 

구현체 자체는 건들지 않고 원하는 메소드나 기능들을 동일하게 프록시 패턴으로 제공할 수 있다.

 

AOP는 Aspect Oriented Programming의 약자로 관점 지향 프로그래밍이라고 불린다.

관점지향은 쉽게 말해 어떤 로직을 기준으로 핵심적인 관점, 부가적인 관점으로 나누어서 보고 그 관점을 각각 모듈화하겠다는 것.

기능 전후로 원하는 기능들과 흩어진 기능들을 프록시 패턴으로 제공하고 있다.

AOP의 활용 방법은 특정한 메서드가 있으면 실행시간이나 특정한 메서드들의 실행 시간, 전후로 작업하고 싶은 부분들, 일괄적으로 특정한 요청에 대한 Respond나 Request 정보를 남길 때 코드에 남기는 것이 아니라 특정 패키지에 대한 모든 메서드들. 전후에 대한 모든 기능을 남길 수 있다.

 


public class AopBrowser implements IBrowser {

    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() {
        before.run();

        if(html == null){
            this.html = new Html(url);
            System.out.println("AopBrowser html loading from :"+url);


            try{
                Thread.sleep(1500);
            }catch (InterruptedException e){
                e.printStackTrace();
            }
        }
        after.run();
        System.out.println("AopBrowser html cache : "+ url);
        return html;
    }
}
public class Browser implements IBrowser{

    private String url;

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


    @Override
    public Html show() {
        System.out.println("browser loading html from" + url);
        return new Html(url);
    }
}
public class BrowserProxy implements  IBrowser{


    private String url;
    private Html html;

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

    @Override
    public Html show() {
        if(html == null){
            this.html = new Html(url);
            System.out.println("BrowserProxy loading html from : " + url);
        }
        System.out.println("BrowserProxy use cache html : " + url);
        return html;
    }
}
public class Html {

    private String url;

    public Html(String url){
        this.url = url;
    }
}
public interface IBrowser{
    Html show();
}
        AtomicLong start = new AtomicLong();
        AtomicLong end = new AtomicLong();

        IBrowser aopBrowser = new AopBrowser("www.naver.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());


    }
}

 

처음 호출 할 때는 1.5초

두번 째 호출할 경우는 0초가 된 것을 확인할 수 있다.

 

특정 메서드를 통해 캐시가 동작함을 확인할 수 있었고

AOP 패턴은 프록시 패턴을 사용함을 확인 할 수 있었고 특정한 기능에 앞뒤로 원하는 기능, 매개 변수 조작을 조작할 수 있었고 여러가지 흩어져 있는 기능들을 하나로 묶어줄 수 있었다. 

주료 활용하는 것은 http클라이언트에 대한 코드나 Rest client service 같은 코드의 메서드들에 대한 시관 관련 aop를 넣어서 현재 시스템에 대한 경과 시간을 체크하여 오류를 발견하는데에 사용 할 수 있겠다.