<2022년 01월 30일 _ 패스트캠퍼스 챌린지 07일차>
[스프링입문_디자인패턴_프록시패턴]
1. Proxy pattern
: 대리인이라는 뜻으로써, 뭔가를 대신해서 처리하는 것
: Proxy Class를 통해 대신 전달하는 형태로 설계됨 --> 실제 Client는 Proxy로부터 결과를 받음
: Cache의 기능으로도 활용 가능
: SOLID중에서 개방폐쇄원칙(OCP)과 의존역전원칙(DIP)를 따름
--> Spring에서는 AOP에서 프록시패턴을 사용하여 구현
2. 실습
(1) 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를 상속하도록 함
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일차 강의 완료~
패스트캠퍼스 [직장인 실무교육]
프로그래밍, 영상편집, UX/UI, 마케팅, 데이터 분석, 엑셀강의, The RED, 국비지원, 기업교육, 서비스 제공.
fastcampus.co.kr
본 포스팅은 패스트캠퍼스 환급 챌린지 참여를 위해 작성되었습니다.
'개발새발 > Spring' 카테고리의 다른 글
220201_스프링입문_디자인패턴_옵저버 패턴_패스트캠퍼스 챌린지 09일차 (0) | 2022.02.01 |
---|---|
220131_스프링입문_디자인패턴_데코레이터패턴_패스트캠퍼스 챌린지 08일차 (0) | 2022.01.31 |
220129_스프링입문_디자인패턴_어댑터패턴_패스트캠퍼스 챌린지 06일차 (0) | 2022.01.29 |
220129_스프링입문_디자인패턴_싱글톤패턴_패스트캠퍼스 챌린지 06일차 (0) | 2022.01.29 |
220129_스프링입문_디자인패턴_디자인패턴이란_패스트캠퍼스 챌린지 06일차 (0) | 2022.01.29 |