상세 컨텐츠

본문 제목

프록시 패턴

Back-end/JavaSpringBoot

by 본투비곰손 2022. 8. 2. 23:34

본문

728x90

proxy는 대리인이라는 뜻으로 뭔가를 대신해서 처리하는것

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

Cache의 기능으로도 활용이 가능하다.

SOLID중 개방폐쇄의 원칙과 역전 원칙을 따른다.

url을 주소를 받아서 html을 로딩하는 클래스html 을 만들어 준다.

package com.company.design.proxy;

public class Html {
    private String url;

    public Html(String url) {
        this.url = url; //기본생성자에서 url을 받아서 Html을 로딩하는 형태
    }
}

url 주소를 받아서 Html을 보여주는 IBrowser 인터페이스를 을 만들어 준다.

package com.company.design.proxy;

public interface IBrowser {
    Html show();
}

IBrowser 인터페이스를 상속 받는 Browser을 만들고 url주소를 로딩하여 html을 내려 받는 브라우저를 생성한다.

package com.company.design.proxy;

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); //매번 새로운 주소를 로딩하면서 html파일을 내려주는 형태
    }
}

브라우저에 주소를 넣고 실행하게 되면 정상 실행 되는데 매번 같은 주소를 새롭게 내려받아 표시해준다.

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

     Browser browser = new Browser("www.naver.com");
     browser.show();
     browser.show();
     browser.show();
     browser.show();

    }
}

동일한 html을 반복 내려받는것은 비효율 적이기 때문에 Proxy를 만들어 준다.

package com.company.design.proxy;

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){ //caching 비어있다면 새로운 url을 입력하여 html을 불러오고 아니라며 원래 것으로 리턴
            this.html = new Html(url);
            System.out.println("BrowserProxy loading html from:" +url);
        }
        System.out.println("BrowserProxy ues Cache html:" +url);
        return html;
    }
}

비어있을 경우에만 새로운 주소를 입력 받고 아닌경우 기존의 주소를 반환하여 내려받지 않고 리턴한 값으로 보여준다.

package com.company.design;

import com.company.design.proxy.Browser;
import com.company.design.proxy.BrowserProxy;
import com.company.design.proxy.IBrowser;

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

        IBrowser browser = new BrowserProxy("www.naver.com");
        browser.show();
        browser.show();
        browser.show();
        browser.show();
    }

AOP

특정 Method 실행시간이나 정보를 일괄기록을 남기는 기능

package com.company.design.aop;
import com.company.design.proxy.Html;
import com.company.design.proxy.IBrowser;

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) {
                throw new RuntimeException(e);
            } // 로딩하는 시간이 순식간이기 때문에 쓰레드로 딜레이를 주었다.
        }
        after.run();
        System.out.println("AopBrowser html cache : " +url);
        return html;
    }
}
public class main {
    public static void main(String[] args) {
    
        AtomicLong start = new AtomicLong(); //AtomicLong 클래스를 활용하여 시작 시간 기록
        AtomicLong end = new AtomicLong(); // 끝나는 시간 기록

        IBrowser aopBrowser = new AopBrowser("www.naver.com",
        ()->{ //Runnable before를 람다식으로 표현
            System.out.println("before");
            start.set(System.currentTimeMillis()); //시작시 시스템의 시간을 가져와서 시작시간으로 세팅
        }, ()->{ //Runnable afterfmf 람다식으로 표현
                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()); // 두번째 실행시 프록시 방식과 동일하게 캐시를 사용하여 
        //딜레이 시간 없이 바로 출력


    }
728x90

'Back-end > JavaSpringBoot' 카테고리의 다른 글

옵저버 패턴  (0) 2022.08.03
데코레이터 패턴  (0) 2022.08.03
Adapter pattern  (0) 2022.08.01
Singleton pattern  (0) 2022.08.01
디자인 패턴  (0) 2022.07.28

관련글 더보기