Proxy pattern
- proxy 뜻 : 대리인, 무언가를 대신 처리하는 것.
- Proxy Class 를 통해서 대신 전달하는 형태로 설계되며, 실제 Client 는 Proxy로 부터 결과를 받는다.
- Cache 기능, 스프링의 AOP등이 PROXY 패턴의 예이다.
- SOLID 중에서 개방폐쇄 원칙(OCP)과 의존 역전 원칙(DIP)을 따른다.
예제1 (Cache )
- 브라우져 등에서 캐싱해두고 같은 요청이 있을 때, 값을 준다.
프록시 적용되지 않음
public interface IBrowser{
Html show();
}
public Html implements IBrowser{
private String url;
public Html(){
this.url = url;
}
}
public 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 Main {
public static void main(String[] args){
Browser browser = new Browser("www.naver.com");
browser.show();
browser.show();
browser.show();///3번 모두 로딩한다. 아래로 캐싱 지원되는 프록시를 생성하여 진행해 보자.
}
}
프록시 패턴 적용
public 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 new html from"+url);
}
System.out.println("BrowserProxy using cached html");
return html
}
}
실행코드
public class Main {
public static void main(String[] args){
.
.
.
IBrowser proxyBrowser = new BrowserProxy();
browser.show();// new
browser.show();// cached
browser.show();
browser.show();
browser.show();
}
}
예제2
(스프링 AOP 유사기능… 예제1 클래스 연결)
- HttpClient, restclient의 소요시간 확인
- 트랜잭션에 걸리는 소요타임 확인
- 특정 서비스, 메소드등의 소요시간을 확인하여 어떤 서비스때문에 서버가 느린지 확인할 때 유용.
AOP기능 구현
public 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(1000);
}catch(){
}
}
System.out.println("AopBrowser using cached html");
return html
}
after.run()
}
실행코드
public class Main {
public static void main(String[] args){
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);
System.out.println("after");
}
);
}
// 첫번째 호출
aopBrowser.show();
System.out.println("1st - loading time : "+ end.get());
// cache된 2번째 호출
aopBrowser.show();
System.out.println("2nd - loading time : "+ end.get());
}
Comments