Proxy
란 사전적으로는 대리인이라는 뜻을 가지고 있다.
Java에서 프록시는
이로 인해 SOLID
원칙 중 SRP
를 지향하는 코드로 작성이 가능해진다.
SRP (Single Responsibility Principle, 단일 책임 원칙)
객체는 단 하나의 책임만 가져야 한다는 원칙을 말한다.
- 응집도는 높게
(한 프로그램의 요소가 얼마나 뭉쳐있는지, 즉 구성 요소들 사이의 응집력)- 결합도는 낮게
(프로그램 구성 요소들 사이가 얼마나 의존적인지)여러 객체들이 하나의 책임만을 갖도록 잘 분배한다면, 시스템에 변화가 생기더라도
그 영향을 최소화할 수 있기 때문에 SRP원칙을 따르는 것이 좋다.
Reperence
인터페이스를 사용하고 실행시킬 클래스에 대해 객체가 들어갈 자리에 대리 객체를 대신 투입하여,
클라이언트는 실제 실행시킬 클래스에 대한 메소드를 호출하여 반환값을 받는지
대리 객체의 메소드를 호출해서 반환값을 받는지 모르게 하는것을 말한다.
위 그림에서 보듯, 클라이언트가 Subject인터페이스의 request()를 호출하면 구현클래스인 RealSubject의 request()가 호출된다.
이때 프록시가 대신 RealSubject의 request()메서드를 호출하고 그 반환값을 클라이언트에게 전달하는것이다.
인터페이스 생성
package com.programmers.java.proxyPattern;
public interface Subject {
String request();
}
구현 클래스 생성
package com.programmers.java.proxyPattern;
public class RealSubject implements Subject {
@Override
public String request() {
return "HelloWorld";
}
}
구현 클래스를 호출하는 프록시(클래스) 생성
package com.programmers.java.proxyPattern;
public class Proxy implements Subject {
private final RealSubject realSubject = new RealSubject();
@Override
public String request() {
return realSubject.request(); //프록시가 실제의 메소드를 호출한다.
}
}
프록시를 통해 한번 우회하여 메서드에 접근
package com.programmers.java.proxyPattern;
public class Main {
public static void main(String[] args) {
// Subject클래스의 메소드를 호출하는것이아닌 프록시클래스의 메소드를 호출한다.
Subject subject = new Proxy();
System.out.println(subject.request()); // 내부적으로 Subject의 메소드를 호출한다.
}
}
특징
RealSubject
와 같은 이름의 메서드를 구현한다.RealSubject
에 대한 참조 변수를 가진다.RealSubject
의 method 를 호출하고 그 결과를 클라이언트에게 반환한다.RealSubject
메서드의 호출 전, 후에 별도의 로직을 수행할 수 있다.https://velog.io/@dev_leewoooo/Proxy-pattern%EC%9D%B4%EB%9E%80-with-Java