Proxy(프록시)는 대리인이라는 뜻처럼, 어떠한 껏을 대신하여 처리하는 것을 해준다.
Proxy Class를 통해서 대신 전달 하는 형태로 설계되며, 실제 Client는 Proxy로 부터 결과를 받는다.
Cache의 기능으로도 활용 가능
SOLID중에서 개방폐쇄 원칙과 의존 역전 원칙을 따른다.

-브라우저 예제
package com.company.gof.proxy;
public class Html {
private String url;
public Html(String url){
this.url = url;
}
}
package com.company.gof.proxy;
public interface IBrowser {
Html show();
}
package com.company.gof.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);
}
}
package com.company.gof;
import com.company.gof.proxy.Browser;
public class Main {
public static void main(String[] args) {
Browser browser = new Browser("www.naver.com");
for(int i=0;i<9;i++)
browser.show();
}
}
- 결과 화면

❖매번 show() 함수를 실행할 때 마다 로딩을 해줘야 한다.
- Proxy 패턴을 이용한 캐시 기능
package com.company.gof.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);
}
System.out.println("BrowserProxy use cache html:"+url);
return html;
}
}
캐싱을 하기 위해 속성으로 html을 추가하고, html을 가지고 있지 않으면 로딩을 하고 가지고 있으면 그것을 리턴한다.
package com.company.gof;
import com.company.gof.proxy.Browser;
import com.company.gof.proxy.BrowserProxy;
import com.company.gof.proxy.IBrowser;
public class Main {
public static void main(String[] args) {
// Browser browser = new Browser("www.naver.com");
// for(int i=0;i<9;i++)
// browser.show();
IBrowser browser = new BrowserProxy("www.naver.com");
for(int i=0;i<5;i++)
browser.show();
}
}
-결과 화면

-AOP( Aspect Oriented Programming )기능
관심사의 분리라는 의미로 각각의 비즈니스 로직에서 부가 기능으로 생각되어지는 공통의 모듈들을 분리하여 관리하여 유지보수에 대한 용이성과 비즈니스 로직을 좀 더 이해하기 쉽게 해준다.
package com.company.gof.aop;
import com.company.gof.proxy.Html;
import com.company.gof.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) {
e.printStackTrace();
}
}
after.run();
System.out.println("AopBrowser html cache: "+url);
return null;
}
}
show 함수가 너무 빠를 수 있기 때문에 시간을 측정하기 위해 1.5초의 지연시간과 Runable before, after를 추가했다.
package com.company.gof;
import com.company.gof.aop.AopBrowser;
import com.company.gof.proxy.IBrowser;
import java.util.concurrent.atomic.AtomicLong;
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.get());
}
);
aopBrowser.show();
System.out.println("loading time : "+ end.get());
aopBrowser.show();
System.out.println("loading time : "+ end.get());
}
}
-결과 화면

'Spring' 카테고리의 다른 글
| REST API 시작하기 (0) | 2025.03.18 |
|---|---|
| Decorator pattern(데코레이터 패턴) (0) | 2021.04.18 |
| Adapter pattern(어댑터 패턴) (0) | 2021.04.16 |
| Singleton pattern(싱글톤 패턴) (0) | 2021.04.15 |
| 디자인 패턴 (0) | 2021.04.15 |