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 동적 프록시는 인터페이스를 기반으로 동적으로 만들어준다.
- 프록시 인스턴스에서 메서드가 호출될 때 실행되는 로직을 정의한다.
정리1 : 프록시를 사용하든 실제 구체 클래스를 사용하든 똑같이 자바 힙 메모리에 올라가는 것은 동일하다. 정리2 : 그러나 프록시를 사용하게 되면 스프링 컨테이너에 등록되는 빈은 프록시가 되고 실제 구체 클래스를 사용하게 되면 스프링 컨테이너에 등록되는 빈은 실제 구체 클래스가 된다. 정리3 : JDK 동적 프록시의 경우 인터페이스가 필수다.
📚 CGLIB
- CGLIB(Code Generator Library)
- CGLIB는 바이트코드를 조작해서 동적으로 클래스를 생성하는 기술을 제공하는 라이브러리이다.
- CGLIB를 사용하면 인터페이스가 없어도 구체 클래스만 가지고 동적 프록시를 만들 수 있다.