스프링 AOP에는 프록시라는 존재가 나온다.
뭔가 추상적인 개념이라 처음에는 이해하기 힘들었다.
자바 프록시 패턴을 통해 조금더 이해해보자
출처 : https://www.baeldung.com/java-proxy-pattern
프록시 패턴은 데코레이터 패턴처럼 타깃의 기능을 확장하지는 않는다.
클라이언트(사용하는 쪽)이 타겟에 접근하는 방식을 변경한다.
프록시는 쉽게 말해 중개자다.
클라이언트의 요청을 대신 받아 같은 인터페이스의 다른 구현체에게 위임한다.
그림으로 보자면 이렇다.
JDBC Connection 이나 SessionFactory 같은 무거운 오브젝트가 있다고 해보자. 이 오브젝트는 초기에 어떤 설정을 필요로 한다. 우리는 필요할때 이 오브젝트를 호출하고 그다음 계속 재사용하고싶다.
쉽게 말하면 한번 설정하고나면 설정없이 계속 재사용할 수 있게 할 것이다.
public interface ExpensiveObject {
void process();
}
public class ExpensiveObjectImpl implements ExpensiveObject {
//인스턴스가 생성될때 설정 메서드를 실행한다.
public ExpensiveObjectImpl() {
heavyInitialConfiguration();
}
@Override
public void process() {
LOG.info("프로세스가 끝났습니다.");
}
private void heavyInitialConfiguration() {
LOG.info("초기 설정중...");
}
}
//클라이언트가 사용하는 중개인(proxy) 클래스
public class ExpensiveObjectProxy implements ExpensiveObject {
private static ExpensiveObject object;
//클라이언트는 이 process() 를 호출할 것이다.
@Override
public void process() {
//static 필드에 인스턴스를 저장하기 때문에 설정 메서드는
//ExpensiveObjectImpl 메서드가 실행될때 총 한번만 실행된다.
if (object == null) {
object = new ExpensiveObjectImpl();
}
//ExpensiveObject에 위임
object.process();
}
}
public static void main(String[] args) {
ExpensiveObject object = new ExpensiveObjectProxy();
object.process();
object.process();
}
초기 설정중...
프로세스가 끝났습니다.
프로세스가 끝났습니다.
프록시 패턴은 이럴때 사용하면 좋다.