개발 etc

JAVA 자바 프록시 패턴(Proxy Pattern)

알통몬_ 2017. 3. 12. 20:50
반응형


안녕하세요 알통몬입니다.

공감 및 댓글은 포스팅 하는데 아주아주 큰 힘이 됩니다!!

포스팅 내용이 찾아주신 분들께 도움이 되길 바라며

더 깔끔하고 좋은 포스팅을 만들어 나가겠습니다^^

 

프록시는 대리자라는 뜻입니다. 

먼저 프록시 패턴을 적용하지 않은 패턴을 예제로 보겠습니다.


예제)

Service.java

package proxyPattern;


public class Service {

public String runSomething() {

return "서비스 짱!!!";

}

}


ClientWithNoProxy.java

package proxyPattern;


public class ClientWithNoProxy {

public static void main(String[] args) {

// 프록시를 이용하지 않은 호출

Service service = new Service();

System.out.println(service.runSomething());

}

}

위 예제는 

ClientWithNoProxy가 Service 객체의 runSomething()메서드를 직접 호출하는 예제입니다.


다음은 프록시 패턴이 적용된 예제입니다.

프록시 패턴의 경우에는 실제 서비스 객체가 가진 메서드와 같은 이름의 메서드를 사용합니다.

이를 위해 인터페이스를 사용해요. 

인터페이스를 사용하면 서비스 객체가 들어갈 자리에 

대리자 객체를 대신 투입해 클라인언트 쪽에서는 

실제 서비스 객체를 통해 메서드를 호출하고 반환값을 받는지,

대리자 객체를 통해 메서드를 호출하고 반환값은 받는지 모르게 처리할 수 있습니다.


IService.java

package proxyPattern;


public interface IService {

String runSomething();

}


Service.java

package proxyPattern;


public class Service implements IService {

public String runSomething() {

return "서비스 짱!!!";

}

}


Proxy.java

package proxyPattern;


public class Proxy implements IService {

IService service1;


public String runSomething() {

System.out.println("호출에 대한 흐름 제어가 주목적, 반환 결과를 그대로 전달");


service1 = new Service();

return service1.runSomething();

}

}


ClientWithProxy.java

package proxyPattern;


public class ClientWithProxy {

public static void main(String[] args) {

// 프록시를 이용한 호출

IService proxy = new Proxy();

System.out.println(proxy.runSomething());

}

}


다음은 프록시 패턴의 중요 포인트입니다.

- 대리자는 실제 서비스와 같은 이름의 메서드를 구현한다. 이때 인터페이스를 사용한다.

- 대리자는 실제 서베스에 대한 침조 변수를 갖는다(합성).

- 대리자는 실제 서비스의 같은 이름을 가진 메서드를 호출하고 그 값을 클라이언트에게 돌려준다.

- 대리자는 실제 서비스의 메서드 호출 전후에 별도의 로직을 수행할 수도 있다.


프록시 패턴은 실제 서비스 메서드의 반환 값에 가감하는 것을 목적으로 하지 않고 

제어의 흐름을 변경하거나 다른 로직을 수행하기 위해 사용합니다.

 프록시 패턴을 한문장으로 표현하면

- 제어 흐름을 조정하기 위한 목적으로 중간에 대리자를 두는 패턴-

프록시 패턴은 OCP 개방 폐쇄 원칙과 DIP 의존 역전 원칙이 적용된 설계 패턴입니다.

반응형