디자인 패턴 중 하나인 프록시 패턴에 대해 포스팅합니다.
프록시(Proxy) 패턴이란?
Proxy는 대리인이라는 뜻으로써 무엇을 대신해 처리하는 것을 의미합니다. Proxy Class를 통해 대신 전달하는 형태로 설계되며, 실제 Client는 Proxy로부터 결과를 전달받습니다. Windows에서 프록시 서버를 사용하는 것으로 이해할 수 있습니다.
Proxy 패턴은 Cache의 기능으로도 활용이 가능합니다. Spring에서는 AOP를 Proxy 패턴으로 사용하고 있습니다. 객체지향 원칙인 SOLID 중에서 개방폐쇄 원칙(OCP)과 의존 역전 원칙(DIP)를 따릅니다.
Cache 기능구현
Cache 기능을 구현하기 위해 먼저 Browser 인터페이스와 화면에 출력을 위한 Html 클래스를 만들도록 하겠습니다.
Browser 인터페이스와 Html 클래스
public interface IBrowser {
public Html show();
}
public class Html {
private String url;
public Html(String url) {
this.url = url;
}
}
Browser 인터페이스는 Html을 보여주는 show 메서드를 가지고 있습니다. 인터페이스임을 나타나기 위해 I를 접두사로 붙였습니다. Html 클래스는 변수로 url을 갖고 Html 생성시 url을 파라미터로 받아 url을 세팅합니다.
Browser 클래스
public class Browser implements IBrowser {
private String url;
public Browser(String url) {
this.url = url;
}
@Override
public Html show() {
System.out.println("new url : " + url);
return new Html(url);
}
}
Browser 클래스는 IBrowser를 구현한 클래스입니다. 브라우저에는 크롬, IE, 사파리 등이 있을 수 있겠죠? 브라우저는 주소창에 입력할 수 있는 url을 변수로 가질 수 있습니다. Browser 생성시 url을 받아 url을 세팅합니다. 그리고 IBrowser에서 선언한 show 메서드를 Override 합니다. show 메서드 출력시 생성시 전달받은 url을 사용하여 Html을 생성해줍니다.
ProxyMain 클래스
public class ProxyMain {
public static void main(String[] args) {
Browser browser = new Browser("http://www.tistory.com");
browser.show();
browser.show();
browser.show();
browser.show();
browser.show();
}
}
=> 실행결과
new url : http://www.tistory.com
new url : http://www.tistory.com
new url : http://www.tistory.com
new url : http://www.tistory.com
new url : http://www.tistory.com
이제 Client에서 url을 사용해 Browser를 생성합니다. 실제로는 크롬 같은 브라우저를 실행한 후 주소를 입력했다고 생각하면 되겠죠? 그 이후 browser 객체의 show 메서드를 실행합니다. 그러면 실행결과는 new url : [입력 url]을 출력합니다. 실제로는 티스토리 홈페이지가 출력될 것입니다.
Proxy 클래스 사용
이 때 현재 코드로는 browser 객체의 show 메서드를 실행할 때마다 Html이 새로 만들어지게 됩니다. 기존 Browser 클래스를 수정하지 않고 입력된 url이 있을 경우 캐싱된 Html을 출력하도록 변경해보겠습니다.
public class BrowserProxy implements IBrowser {
private String url;
private Html html;
public BrowserProxy(String url) {
this.url = url;
}
@Override
public Html show() {
if(this.html==null) {
html = new Html(url);
System.out.println("new url : " + url);
return html;
}
System.out.println("cache url : " + url);
return this.html;
}
}
public class ProxyMain {
public static void main(String[] args) {
BrowserProxy proxy = new BrowserProxy("http://www.tistory.com");
proxy.show();
proxy.show();
proxy.show();
proxy.show();
proxy.show();
}
}
=> 실행결과
new url : http://www.tistory.com
cache url : http://www.tistory.com
cache url : http://www.tistory.com
cache url : http://www.tistory.com
cache url : http://www.tistory.com
BrowserProxy 클래스는 Browser 클래스와 동일하게 IBrowser를 구현하는 클래스입니다. 다만, 출력되는 Html을 캐싱하기 위해 Html 클래스를 변수로 선언합니다. show 메서드에서는 html 객체의 null 여부를 체크한 후 null 일 경우 Html을 생성하고 아닐 경우 캐싱된 Html을 전달합니다.
ProxyMain에서는 기존 Client와 동일하게 BrowserProxy에 url을 전달하여 생성후 show 메서드를 호출합니다. 기존과 다르게 처음에만 url을 생성하고 그 이후 호출건에 대해서는 cache하는 것을 확인할 수 있습니다.
'SPRING' 카테고리의 다른 글
옵저버 패턴이란? (1) | 2022.04.01 |
---|---|
데코레이터 패턴이란? (1) | 2022.03.31 |
[파트 1. 스프링 입문] 챕터 2-3. 어댑터 패턴 (2) | 2022.03.14 |
[파트 1. 스프링 입문] 챕터 2-2. 싱글톤 패턴 (2) | 2022.03.14 |
[파트 1. 스프링 입문] 챕터 2-1. 디자인 패턴이란? (1) | 2022.03.03 |
댓글