반응형
빈 후처리기(BeanPostProcessor) 스프링이 빈 저장소에 등록할 목적으로 생성한 객체를 빈 저장소에 등록하기 직전에 조작하고 싶을때 이용한다. BeanPostProcessor 를 번역하면 빈 후처리기로 이름 그대로 빈 생성 후에 어떤 처리를 하는 용도로 사용한다. 객체를 조작할 수도 있고, 완전히 다른 객체로 바꿔치기 하는 것도 가능하다. 여기서 조작이라는 것은 해당 객체의 특정 메소드를 호출하는 것을 뜻한다. 일반적으로 스프링 컨테이너가 등록하는, 특히 컴포넌트 스캔의 대상이 되는 빈들은 중간에 조작할 방법이 없는데, 빈 후처리기를 사용하면 개발자가 등록하는 모든 빈을 중간에 조작할 수 있다. 즉 빈(Bean) 객체를 프록시로 교체하는 것도 가능하다는 의미이다. 프록시 팩토리 (ProxyFa..
0. 들어가기전에, 프록시 팩토리 (Proxy Factory) 정리 JDK 동적 프록시 (링크) 인터페이스와 구현 클래스가 있는 경우 InvocationHandler 사용 CGLIB (링크) 구체 클래스만 존재하는 경우 MethodInterceptor 사용 스프링은 동적 프록시를 통합해서 편리하게 만들어주는 프록시 팩토리 (ProxyFactory) 기능을 제공한다. 프록시 팩토리 하나로 인터페이스가 있으면 JDK 동적 프록시를 사용하고, 인터페이스 없이 구체클래스만 존재하면 CGLIB 를 사용할수 있다. 이때, InvocationHandler 와 MethodInterceptor 를 따로 만들어야 했던 문제를 해결하기위해 스프링은 Advice 라는 개념을 도입했다. 각 핸들러와 인터셉터를 신경쓰지 않고, ..
1. 프록시 팩토리 (Proxy Factory) 프록시 생성에 있어 인터페이스 유무에 따라 적용되는 기술이 다르다. 그 때문에 각 기술에 맞춰 InvocationHandler 와 MethodInterceptor 를 중복으로 만들어야 하는가? 하는 문제가 있다. 같은 코드일텐데 공통으로 사용할 수는 없을까? JDK 동적 프록시 (링크) 인터페이스와 구현 클래스가 있는 경우 InvocationHandler 사용 CGLIB (링크) 구체 클래스만 존재하는 경우 MethodInterceptor 사용 스프링은 이렇게 유사한 기술이 있을 때 통합해서 일관성있게, 편리하게 사용할 수 있도록 추상화된 기술을 제공한다. 스프링은 동적 프록시를 통합해서 편리하게 만들어주는 프록시 팩토리 (ProxyFactory) 기능을 ..
1. CGLIB 란? Code Generator Library 의 약자로, 클래스의 바이트 코드를 조작하여 프록시 객체를 생성해 주는 라이브러리이다. CGLIB 를 사용하면 인터페이스가 없어도 구체 클래스만으로 동적 프록시를 만들수 있다. 외부 라이브러리이지만, 스프링 프레임워크의 내부에 포함되어 있다. 따라서 스프링을 사용하면 별도로 라이브러리를 추가하지 않아도 사용할 수 있다. 직접 CGLIB 를 다루는 일은 거의 없지만, 개념을 정리한다. 2. 예제코드 인터페이스 없이 구체 클래스에 정의된 업무 로직의 실행 시간을 출력하는 부가기능을 추가한다. 구체 클래스만 있는 경우 : ConcreteService /** 구체 클래스만 있는 경우 */ @Slf4j public class ConcreteServic..
프록시 프록시란 인터페이스 구현 클래스 및 그 인터페이스를 실행할 때 작성하는 기술 또는 그 작성된 인터페이스를 말한다. JDK 동적 프록시 프록시를 적용하기 위해 적용 대상의 숫자만큼 프록시 클래스를 만드는 것은 매우 힘든 일이다. 이 문제를 해결하는 것이 동적 프록시 기술이다. 동적 프록시로 개발자가 직접 프록시 클래스를 만들지 않아도 된다. 프록시 객체를 동적으로 런타임에 개발자를 대신하여 만들어준다. 또 동적 프록시에 원하는 실행 로직을 지정할 수 있다. 예제코드 1. 인터페이스와 그 인터페이스를 구현하는 구현체 작성 : CommandA, CommandAImpl, CommandB, CommandBImpl // CommandA 인터페이스와 그 구현체 public interface CommandA {..
리플렉션(Reflection) : 어노테이션 이용 어노테이션 취득 리플렉션으로 어노테이션의 값을 취득할 수 있다. 예제코드 테스트를 위해 어노테이션 작성 : @MyAnnotation package hello.proxy.reflection; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; // 어노테이션 보유 : RUNTIME 은 실행시에도 어노테이션 정보를 읽어올 수 있음 @Retention(RetentionPolicy.RUNTIME) // 디폴트 : CLASS // ..