본문 바로가기
공부 기록

[디자인패턴] 프록시 패턴(Proxy Pattern) _ AOP

by 타태 2021. 6. 3.

2021.05.28 - [Back-End/Java_Spring] - [디자인패턴]싱글톤 패턴(Singleton Pattern), 어댑터 패턴(Adapter Pattern)

 

[디자인패턴]싱글톤 패턴(Singleton Pattern), 어댑터 패턴(Adapter Pattern)

2021.05.28 - [Back-End/Java_Spring] - [디자인패턴]Gof의 디자인패턴 (Gang of Four) 디자인 패턴_Detail_1 Singleton Pattern 어떠한 클래스(객체)가 유일하게 1개만 존재 할 때 사용한다. 실제 사물로는 여러..

ktae23.tistory.com

 

디자인 패턴_Detail_2

Proxy Pattern

  • 대리인이란 뜻으로 무언갈 대신 처리하는 것
  • Proxy Class를 통해 대신 전달하는 형태로 설계되며 실제 Client는 Proxy로부터 결과를 받는다.
  • Cache의 기능으로도 활용이 가능하다
  • SOLID 중에서 개방폐쇄 원칙(OCP)과 의존 역전 원칙 (DIP)를 따른다.

 

브라우저 인터페이스
package design.proxy;

public interface IBroweser {

        Html show();
}

 

브라우저 클래스
package design.proxy;

public class Browser implements IBroweser{

    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 클래스
package design.proxy;

public class Html {
    private String url;

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

 

Main
package design;

import design.proxy.Browser;


public class Main {

    public static void main(String[] args) {

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

    }
}

 

  • 출력 :
BrowserProxy loading html from : www.naver.com
BrowserProxy loading html from : www.naver.com
BrowserProxy loading html from : www.naver.com
BrowserProxy loading html from : www.naver.com

 

 

프록시 패턴 사용
package design.proxy;

public class BrowserProxy implements IBroweser{

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

}

 

Main
package design;

import design.proxy.Browser;
import design.proxy.BrowserProxy;
import design.proxy.IBroweser;


public class Main {

    public static void main(String[] args) {

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

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

    }
}

 

  • 출력 결과
BrowserProxy loading html from : www.naver.com
BrowserProxy use cache html : www.naver.com
BrowserProxy use cache html : www.naver.com
BrowserProxy use cache html : www.naver.com
BrowserProxy use cache html : www.naver.com

 


 

AOP(Aspect-Oriented-Programming)

  • OOP를 보완하는 수단으로 흩어진 Aspect를 모듈화 하는 기법
  • 특정 메서드의 실행 시간, 특정 패키지에 있는 메서드 들의 실행 시간
  • 전후로 작업하고 싶은 부분들, 일괄적으로 특정한 요청에 대해 리퀘스트, 리스폰스 정보를 남긴다던지 코드에 개별 작업하는 것이 아니라 특정 패키지의 모든 기능 등 전후에 이러한 작업을 넣을 수 있는 패턴
  • 특정 메서드의 수행 속도 측정 등에 사용

 

Aop브라우저
package design.aop;

import design.proxy.Html;
import design.proxy.IBroweser;

public class AopBrowser implements IBroweser{
	
	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 use cache : "  + url);
		
		
		return html;
	}

}

 

Main
package design;

import java.util.concurrent.atomic.AtomicLong;

import design.aop.AopBrowser;
import design.proxy.IBroweser;


public class Main {

	public static void main(String[] args) {
		
	// 스레드에서의 동시성 문제를 해결하기 위해 AtomicLong 클래스 생성
	AtomicLong start = new AtomicLong();
	AtomicLong end = new AtomicLong(); 
		
	IBroweser 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());
	
	}
}
  • AtomicLong은 Wrapping 클래스로 Long 자료형
  • 쓰레드 안정적으로 구현되었기 때문에 멀티쓰레드 상황에서 동기화 없이 동시성 문제 해결

참고하면 좋은 블로그

 

출력결과
before
AopBrowser html loading from : www.naver.com
AopBrowser html use cache : www.naver.com
loading time : 1502
before
AopBrowser html use cache : www.naver.com
loading time : 0

 

반응형

댓글