인생을 코딩하다.

[Java]프록시 패턴(Proxy Pattern) 본문

Java

[Java]프록시 패턴(Proxy Pattern)

Hyung1 2021. 2. 9. 16:54
728x90
반응형

프록시는 대리자, 대변인이라는 뜻을 가진 언어다.

프록시 패턴프록시 패턴(Proxy Pattern)

  • 대리자는 실제 서비스와 같은 이름의 메서드를 구현한다. 이때 인터페이스를 사용한다.
  • 대리자는 실제 서비스에 대한 참조 변수를 갖는다.(합성)
  • 대리자는 실제 서비스와 같은 이름을 가진 메서드를 호출하고 그 값을 클라이언트에게 돌려준다.
  • 대리자는 실제 서비스의 메서드 호출 전후에 별도의 로직을 수행할 수도 있다.

대리자/대변인이라는 이름에 주목해 보자. 청화대 대변인, 백악관 대변인은 해당 기관의 입장을 대변할 뿐 그 입장에 자신의 입장을 가감하지 않는다. 프록시 패턴이 실제 서비스 매서드의 반환값에 가감하지 않는다는 것이 딱 느껴지지 않는가? 프록시 패턴은 실제 서비스 메서드의 반환값에 가감하는 것을 목적으로 하지 않고 제어의 흐름을 변경하거나 다른 로직을 수행하기 위해 사용한다. 

 

즉, 제어의 흐름을 조정하기 위한 목적으로 중간에 대리자를 두는 패턴이다.

 

예제를 보자. 먼저 대리자를 사용하지 않고 직접 호출하는 구조를 살펴보자.

프록시 패턴을 적용하기 전 클래스 다이어그램
프록시 패턴을 적용하기 전 시퀀스 다이어그램

위의 그림을 보면 ClientWithNoProxy가 Service 객체를 runSomething() 메서드를 직접 호출하는 것을 볼 수 있다.

package DesignPattern.proxyPattern;

public class ClientWithNoProxy {
    public static void main(String[] args) {
        // 프록시를 이용하지 않은 호출
        Service service = new Service();
        System.out.println(service.runSomething());
    }
}
package DesignPattern.proxyPattern;

public class Service implements IService {
    public String runSomething() {
        return "서비스 짱!!!";
    }
}

 

이번에는 프록시 패턴이 적용된 경우를 살펴보자. 프록시 패턴의 경우 실제 서비스 객체가 가진 메서드와 같은 이름의 메서드를 사용하는데, 이를 위해 인터페이스를 사용한다.인터페이스를 사용하면 서비스 객체가 들어갈 자리에 대리자 객체를 대신 투입해 클라이언트 쪽에서는 실제 서비스 객체를 통해 메서드를 호출하고 반환값을 받는지, 대리자 객체를 통해 메서드를 호출하고 반환ㄱ밧을 받는지 전혀 모르게 처리할 수도 있다.

 

아래 그림은 프록시 패턴을 이용한 경우의 클래스 다이어그램과 시퀀스 다이어그램이다.

프록시 패턴을 적용한 후 클래스 다이어그램
프록시 패턴을 적용한 후 시퀀스 다이어그램

코드를 통해 프록시 패턴의 구성을 살펴보자.

package DesignPattern.proxyPattern;

public class Service implements IService {
    public String runSomething() {
        return "서비스 짱!!!";
    }
}
package DesignPattern.proxyPattern;

public class Proxy implements IService{
    IService service1;

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

        service1 = new Service();
        return service1.runSomething();
    }
}
package DesignPattern.proxyPattern;

public interface IService {
    String runSomething();
}
package DesignPattern.proxyPattern;

public class ClientWithProxy {
    public static void main(String[] args) {
        // 프록시를 이용한 호출
        IService proxy = new Proxy();
        System.out.println(proxy.runSomething());

    }
}

출력

 

위의 예제에서 Service와 Proxy 그리고 IService 사이의 구조를 살펴보자. 예제에서 살펴본 프록시 패턴이 개방 퍠쇄 원칙과 의존 역전의 원칙이 적용된 설계 패턴이다.

 

출처 : 

스프링을 위한 객체지향

728x90
반응형

'Java' 카테고리의 다른 글

[Java]팩터리 메서드 패턴  (0) 2021.02.14
[Java]일급 컬렉션  (0) 2021.02.11
[Java] 어댑터 패턴(Adapter Pattern)  (0) 2021.02.08
[Java] Strategy Pattern(전략 패턴)  (0) 2021.02.08
[Java] ConcurrentHashMap  (0) 2021.01.30
Comments