개발 무지렁이

[Java] 다른 객체의 인터페이스를 제공하는 프록시(Proxy) 객체 본문

Backend/자바

[Java] 다른 객체의 인터페이스를 제공하는 프록시(Proxy) 객체

Gaejirang-e 2023. 9. 16. 13:59

𐁍 프록시(Proxy)
다른 객체에 대한 인터페이스를 제공하는 객체
해당 객체의 대리자 역할을 수행

🍩 보안제어
: 프록시는 실제 객체에 대한 접근을 제어할 수 있다. 클라이언트프록시를 통해 접근하며, 프록시요청을 허용/거부한다.

🍩 로깅 및 감시
: 프록시를 사용하여 메서드 호출을 로깅하거나 감시

🍩 지연로딩(Lazy Loading)
: 필요할 때만 데이터를 로드하는 작업 수행, 성능최적화

🍩 캐싱
: 프록시를 사용하여 이전에 수행한 작업의 결과를 캐시하고, 동일한 요청에 대해 캐시된 결과를 반환

🍩 원격프록시(Remote Proxy)
: 원격 서버나 다른 머신에 있는 객체에 대한 접근을 지원하는 프록시 생성

🍩 Dynamic Proxy / Static Proxy
: 런타임에 프록시 객체를 동적으로 생성 / 컴파일에 프록시 객체를 생성

🧩 복잡성 감소, 🧩 결합도 감소
: 클라이언트와 서비스 사이의 인터페이스를 간단하게 만들어
클라이언트는 실제 구현 세부사항을 알 필요없이 프록시를 통해 서비스에 접근할 수 있어
클라이언트와 서비스 사이의 결합도를 낮춘다.

𖠃 CGLIB (Code Generation Library)
Dynamic Proxy를 생성하기 위한 라이브러리 중 하나다.
자바클래스의 서브클래스를 생성하고, 서브클래스를 통해 기존 클래스의 메서드를 확장한다.

🎯 클래스 확장
🎯 Dynamic Proxy 생성
: 객체의 메서드 호출을 가로채서, 보조 동작을 수행할 수 있다.
🎯 AOP(코드를 모듈화하는 기술) 구현
: AOP 프록시를 생성하여 관심사를 독립적으로 처리할 수 있다.

📜 Foo.java

  public class Foo {
      public void say() {
          System.out.println("Foo.say");
      }
  }

📜 FooMethodInterceptor.java

  class FooMethodInterceptor implements MethodInterceptor {
      public Object intercept(Object obj, Method method, Object[] args, MethodProxy proxy) throws Throwable {
          System.out.println("Bar.say");
          return proxy.invokeSuper(obj, args); //원래 say() 메서드 호출
      }
  }
🦉 intercept 메서드는 실제 메서드 호출 전과 후에 수행할 작업을 정의

📜 Bar.java

  public class Bar {
      public static void main(String[] args) throws Exception {
          Enhancer enhancer = new Enhancer();
          enhancer.setSuperclass(Foo.class); //Foo클래스의 프록시 객체 생성
          enhancer.setCallback(new FooMethodInterceptor()); //해당 클래스를 프록시 콜백으로 설정, 콜백을 통해, 메서드 호출을 가로챈다
          Foo foo = (Foo)enhancer.create();
          foo.say(); //FooMethodIntercepter클래스가 메서드 호출을 가로채서 intercept 메서드로 전달
      }
  }
🦉 Enhancer 클래스를 통한 프록시 객체 생성
: cglib 라이브러리의 일부로, Java 클래스의 프록시 객체동적으로 생성할 수 있다.

🎯 프록시 객체 생성
: 기존클래스의 서브클래스를 생성하여 프록시 객체를 만든다. 프록시 객체는 원본객체를 대신하여 메서드 호출을 가로채고
추가 동작을 수행
할 수 있다.

🎯 콜백 설정
: 생성된 프록시 객체는 메서드 호출에 대한 콜백을 설정할 수 있다.
콜백은 메서드 호출을 가로채고, 추가 동작을 수행하는 역할을 한다.
Comments