Proxy 패턴

프록시 패턴(Proxy Pattern)은 코드의 기능을 대리자가 실행하게 해, 코드의 흐름을 제어하면서 객체지향 5원칙중 OCP와 DIP를 적용해 의존성을 낮춘 디자인 패턴이다

프록시 패턴의 흐름은 위 그림을 통해 쉽게 알 수 있다.
Client는 Proxy(대리자)에게 어떤 기능을 수행할것을 명령하면 Proxy는 상황에 따라 Service의 기능을 호출할지 결정하게 된다.

프록시 패턴은 아래와 같은 구조로 이루어져있다.

잡설을 하자면, 개인적으로 패턴을 기억할 때 이름의 의미와 구조도 모양으로 기억하면 잘 외워진다. 예를들어서 proxy 패턴은 대리자의 의미와 구조도 모양인 ㅈ을 기억하는 식, 이렇게 기억하면 사용방법과 설계 방법을 간략하게 기억할 수 있다!

본론으로 다시 넘어와서, 수행할 기능들이 선언된 Subject 인터페이스를 두고 상속 받는 형식으로 되어있어서, 변경에 폐쇄적이며, 확장에는 개방적인것을 알 수 있다. 또한 실제 기능을 수행하는 RealSubject의 의존성 방향이 클라이언트로 향하므로 의존성 역전이 일어나 OCP와 DIP를 원칙을 지키고 있는것을 확인할 수 있다.

구현

public class Client{
	public static void main(String[] args){
    	// Subject realSubject = new RealSubject(); 
        // realSubject.doAction();
        
    	Subject proxy = new Proxy();
        proxy.doAction(); // realSubject와 호출하는 메소드가 똑같다
    }
}
public interface Subject{
	public void doAction();
}
public class Proxy implements Subject{
    private static Subject subject;
    
    @Override
    public void doAction(){
    	if(subject == null){
        	subject = new RealSubject();
        }
    	System.out.println("Proxy doAction");
    	subject.doAction();
    }
}
public class RealSubject implements Subject{
    @Override
    public void doAction(){
    	System.out.println("RealSubject doAction");
    }
}

클라이언트의 실행결과는 아래와 같다

Proxy doAction
RealSubject doAction

결론

코드의 흐름을 제어할 수 있는 프록시 패턴에 대해 알아보았다. 좀 더 자세히 알아보려면 https://www.baeldung.com/java-proxy-pattern를 참고하면 좋을거 같다