개발새발/Spring

220130_스프링입문_디자인패턴_프록시패턴_패스트캠퍼스 챌린지 07일차

막동이아빠 2022. 1. 30. 22:34

<2022년 01월 30일 _ 패스트캠퍼스 챌린지 07일차>

[스프링입문_디자인패턴_프록시패턴]

 

1. Proxy pattern

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

 : Proxy Class를 통해 대신 전달하는 형태로 설계됨 --> 실제 Client는 Proxy로부터 결과를 받음

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

 : SOLID중에서 개방폐쇄원칙(OCP)과 의존역전원칙(DIP)를 따름

 --> Spring에서는 AOP에서 프록시패턴을 사용하여 구현

 

2. 실습

 (1) com.company.design 패키지에 proxy 패키지 추가

com.company.design 패키지에 proxy 패키지 추가

 (2) proxy 패키지에 Interface로 IBrowser 추가

package com.company.design.proxy;

public interface IBrowser {
    show();
}

 (3) Html 클래스를 추가해준다.

package com.company.design.proxy;

public class Html {
}

(4) Html 클래스가 추가되었다면, IBrowser 에서 show는 Html을 return 하도록 해준다.

package com.company.design.proxy;

public interface IBrowser {
    Html show();
}

 (5) Html에서 가지고 있을법한 url을 예시로 변수로 추가해주고, 생성자에서 초기화 해주도록 한다.

package com.company.design.proxy;

public class Html {

    private String url;

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

 (6) Browser 클래스를 추가해주고 url 변수를 초기화 하는부분을 추가함, IBrowser를 상속하도록 함

Browser 클래스를 추가해주고 url 변수를 초기화 하는부분을 추가함, IBrowser를 상속하도록 함

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);
    }
}

 (7) Main문 작성

package com.company.design;

import com.company.design.adapter.*;
import com.company.design.proxy.Browser;
import com.company.design.singleton.Aclazz;
import com.company.design.singleton.Bclazz;
import com.company.design.singleton.SocketClient;

public class Main {

    public static void main(String[] args) {

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

--> 결과: 위와 같은 경우엔 매번 브라우저로부터 결과를 받아옴

(8) 그렇다면 Cache 기능을 가지고 있는 Browser를 만들어보자~! BrowserProxy 클래스 추가

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){
            this.html = new Html(url);
            System.out.println("BrowserProxy loading html from : " + url);
            return html;
        }

        System.out.println("BrowserProxy use cache html : " + url);
        return html;
    }
}

(9) Main문 재작성

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

public class Main {

    public static void main(String[] args) {

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

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

결과 --> 최초만 loading html이 되고, 이후엔 cache를 이용하여 호출됨

 

3. Spring에 있는 Proxy 기능인 AOP에 대해 테스트 해보기

: AOP : 특정한 메소드가 있으면, 특정 패키지에 있는 모든 메소드에 기능을 넣는 등의 기능

 

 (1) com.company.design 패키지에 aop 패키지 추가 & AopBrowser 클래스 추가

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() {

        //html 로딩 시간 확인
        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;
    }
}

 (2) main문 작성

package com.company.design;

import com.company.design.adapter.*;
import com.company.design.aop.AopBrowser;
import com.company.design.proxy.IBrowser;

import java.util.concurrent.atomic.AtomicLong;

public class Main {

    public static void main(String[] args) {

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

        /*IBrowser browser = new BrowserProxy("www.naver.com");
        browser.show();
        browser.show();
        browser.show();
        browser.show();
        browser.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());

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

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

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

결과 --> 처음 호출때만 시간이 걸리고 다음부턴 cache를 사용하므로 시간이 0

 

정리

[1] AOP패턴은 Proxy 패턴을 활용하고 있음

[2] 특정한 메소드나 특정한 기능의 argument에 대한 조작도 할 수 있음

[3] 흩어진 공통 기능들을 하나로 묶어줄 수 있음

[4] http 클라이언트가 통신을 할 때, 메소드들의 시간 check나 db transaction 등의 시간 check등에도 활용 될 수 있음

 

7일차 강의 완료~

 

필기 & 내 화면 스크린샷 저장

 

 

https://bit.ly/37BpXiC

 

 

 

패스트캠퍼스 [직장인 실무교육]

프로그래밍, 영상편집, UX/UI, 마케팅, 데이터 분석, 엑셀강의, The RED, 국비지원, 기업교육, 서비스 제공.

fastcampus.co.kr

 

본 포스팅은 패스트캠퍼스 환급 챌린지 참여를 위해 작성되었습니다.