프록시란?
사전적 의미로는 대리인이다. 즉, 대신해서 처리한다. 프록시 클래스를 통해서 대신 전달 하는 형태로 설계된다.
실제 Client는 프록시로부터 결과를 얻는다. cache의 기능으로도 활용이 가능하다 SOLID 중에서 OCP, DIP를 따른다.
Spring의 AOP는 프록시패턴으로 구현되어있다.
Client : subject에 요청한다. 내부 처리로직은 알 필요가 없다.
Proxy : Client 요청 중에 간단한 로직, 프록시에 저장된 요청들을 처리한다.
realSubject : 무거운 로직, Proxy가 처리하지 못하는 내용들을 처리한다.
//Html.java
class Html {
private String url;
public Html(String url) {
this.url = url;
}
}
interface IBrowser {
Html show();
}
class Browser implements IBrowser {
private String url;
public Browser(String url) {
this.url = url;
}
@Override
public Html show() {
Sysetm.out.println("browser loading html from :" + url);
return new Html(this.url);
}
}
public static void main(String[] args) {
Browser browser = new Browser("www.naver.com");
browser.show();
browser.show();
browser.show();
browser.show();
browser.show();
}
===================
//출력
browser loading html from : www.naver.com
browser loading html from : www.naver.com
browser loading html from : www.naver.com
browser loading html from : www.naver.com
browser loading html from : www.naver.com
요청에 따라서 계속 www.naver.com 을 로딩해서 보여주는 방식에 프록시를 적용한다. 처음 로딩 시, 필요한 정보들을 저장해두고(캐싱) 다음 호출부터는 캐싱 데이터를 리턴한다. 프록시 클래스를 생성해보자.
class ProxyBrowser implements IBrowser {
private String url;
private Html html;
private Browser browser;
public Browser(String url, Browser browser) {
this.url = url;
this.browser = browser;
}
@Override
public Html show() {
if(html == null) {
Sysetm.out.println("browser loading html from :" + url);
html = browser.show(this.url);
}
Sysetm.out.println("browser use cahce from :" + url);
return this.html;
}
}
public static void main(String[] args) {
IBrowser browser = new BrowserProxy("www.naver.com");
browser.show();
browser.show();
browser.show();
browser.show();
browser.show();
}
===================
//출력
browser loading html from : www.naver.com
browser use cache from : www.naver.com
browser use cache from : www.naver.com
browser use cache from : www.naver.com
browser use cache from : www.naver.com
출력 결과, 맨 처음에는 loading을 하지만 이후에는 계속 캐싱된 정보를 넘긴다.
class AopProxy implements IBrowser {
private String url;
private Html html;
private Runnable before;
private Runnable after;
public AopProxy(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("www.naver.com");
Sysetm.out.println("browser loading html from :" + url);
try{
Thread.sleep(1500);
} catch(Exception e) {
e.printStackTrace();
}
}
after.run();
Sysetm.out.println("browser use cahce from :" + url);
return this.html;
}
public static void main(String[] args) {
AtomicLong start = new AtomicLong();
AtomicLong end = new AtomicLong();
IBrowser aopBrowser = new AopProxy("www.naver.com",
() -> {
System.out.println("before");
start.set(System.currentTimeMillis());
},
() -> {
long now = System.currentTimeMills();
end.set(now - start.get());
}
);
aopBrowser.show();
System.out.println("loading time :" + end.get());
aopBrowser.show();
System.out.println("loading time :" + end.get());
}
===================
//출력
before
browser html loading from : www.naver.com
browser html cache : www.naver.com
loading time : 1041
before
browser html cache : www.naver.com
loading time : 0
반응형
'학습 > Java' 카테고리의 다른 글
ObjectMapper (0) | 2021.08.06 |
---|---|
HTTP vs. WWW (0) | 2021.08.05 |
GET과 Query Parameter, POST와 Databody (0) | 2021.08.03 |
REST, RESTful API (0) | 2021.08.01 |
SOLID 원칙 (0) | 2021.08.01 |