proxy의 사전적인 의미는 '대리', '대리인, '대용'과 같은 의미로 쓰인다.
그렇다면 Java에서의 proxy는 클라이언트가 사용하는 실제 서비스 객체를 대체하는 객체를 제공하는 디자인 패턴, 즉 실제 객체는 자신의 기능에만 집중을 하고 그 외 부가 기능은 proxy 객체에서 위임하여 제어하도록 한다.

클라이언트가 호출 할 인터페이스(InterfacePhone)를 정의한다
public interface InterfacePhone {
void appliedSystem();
}
인터페이스를 구현하고 있는 실제 객체(IPhone, Samsung)를 정의한다.
public class IPhone implements InterfacePhone {
@Override
public void appliedSystem() {
System.out.println("I am using IOS");
}
}
public class Samsung implements InterfacePhone {
@Override
public void appliedSystem() {
System.out.println("I am using android");
}
}
인터페이스를 구현하고 있고, 실제 객체를 참조하고 있는 proxy 객체(StaticProxy)를 정의한다. 여기서의 예시는 정적 proxy !
public class StaticProxy implements InterfacePhone{
InterfacePhone interfacePhone;
public StaticProxy(InterfacePhone interfacePhone) {
super();
this.interfacePhone = interfacePhone;
}
@Override
public void appliedSystem() {
System.out.println("[LOG] "+ new Date() + " :The application invoked the below:" )
interfacePhone.appliedSystem();
}
}
proxy를 사용하기 위해서는 대상 클래스의 수만큼 proxy 클래스를 하나하나 만들어 줘야하고, 그 안에 생성되는 코드들은 반복되기 때문에 코드 중복이라는 단점이 있다.
🔜 dynamic proxy를 사용하면 해결할 수 있다!
proxy를 사용함으로써 실제 객체에 부가 기능을 추가하지 않을 수 있으며 이에 SOLID 원칙을 지향하는 코드를 개발할 수 있다.