지정된 메소드가 호출(Invocation)될 때 이 메소드를 가로채어 부가기능들을 추가할 수 있도록 지원하는 것
사전적으로는 대리인
Real Subject는 자신의 기능에만 집중을 하고 그 이외 부가 기능을 제공하거나 접근을 제어하는 역할을 Proxy 객체에게 위임한다.
→ SOLID
원칙 중 SRP
를 지향하는 코드로 작성이 가능해진다.
RealSubject
와 같은 이름의 메서드를 구현한다. (interface를 구현)RealSubject
에 대한 참조 변수를 가진다.RealSubject
의 method를 호출하고 그 결과를 클라이언트에게 반환한다.RealSubject
메서드의 호출 전, 후에 별도의 로직을 수행할 수 있다.Spring boot
는 프록시 객체를 생성할 때 기본적으로 CGLib
를 사용한다. 그 이유는 JDK Proxy
는 내부적으로 Reflection
을 사용하기 때문이다. Reflection
은 비용이 비싼 효율성이 떨어지는 API이고, JDK Proxy
는 타겟으로 인터페이스만을 허용하기 때문이다.
의무적으로 서비스 계층에서 인터페이스를 xxxxImpl
클래스로 작성하던 관례도 다 JDK Proxy
의 특성 때문이기도 하다.
JDK Proxy
의 InvocationHandler
의 invoke
메서드를 오버라이딩 해서 Proxy
위임 기능을 수행하는데, 이 때 메서드에 대한 명세를 가져올 때 Refelction
이 사용된다.