Spring ‐ 동적 프록시 기술 - dnwls16071/Backend_Summary GitHub Wiki

📚 리플렉션(Reflection)

@Test
void reflection2() throws Exception {
  Class classHello =
  Class.forName("hello.proxy.jdkdynamic.ReflectionTest$Hello");
  Hello target = new Hello();
  Method methodCallA = classHello.getMethod("callA");
  dynamicCall(methodCallA, target);
  Method methodCallB = classHello.getMethod("callB");
  dynamicCall(methodCallB, target);
}

private void dynamicCall(Method method, Object target) throws Exception {
  log.info("start");
  Object result = method.invoke(target);
  log.info("result={}", result);
}
  • 리플렉션을 사용하면 클래스와 메서드 메타 정보를 사용해서 애플리케이션을 동적으로 유연하게 만들 수 있다.
  • 하지만 리플렉션 기술은 런타임에 동작하기 때문에 컴파일 시점에 오류를 잡을 수 없다.
Method methodCallB = classHello.getMethod("callBBBB");  // 컴파일 시점에 오류를 잡을 수 없다.

결론 : 리플렉션은 일반적으로 사용하면 안 된다.

📚 JDK 동적 프록시

  • JDK 동적 프록시는 인터페이스를 기반으로 동적으로 만들어준다.

스크린샷 2025-02-08 오후 10 37 49

  • 프록시 인스턴스에서 메서드가 호출될 때 실행되는 로직을 정의한다.

스크린샷 2025-02-08 오후 10 53 05

정리1 : 프록시를 사용하든 실제 구체 클래스를 사용하든 똑같이 자바 힙 메모리에 올라가는 것은 동일하다. 정리2 : 그러나 프록시를 사용하게 되면 스프링 컨테이너에 등록되는 빈은 프록시가 되고 실제 구체 클래스를 사용하게 되면 스프링 컨테이너에 등록되는 빈은 실제 구체 클래스가 된다. 정리3 : JDK 동적 프록시의 경우 인터페이스가 필수다.

📚 CGLIB

  • CGLIB(Code Generator Library)
    • CGLIB는 바이트코드를 조작해서 동적으로 클래스를 생성하는 기술을 제공하는 라이브러리이다.
    • CGLIB를 사용하면 인터페이스가 없어도 구체 클래스만 가지고 동적 프록시를 만들 수 있다.