반응형
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 // ..
리플렉션 (Reflection) 리플렉션은 class, constructor, field, method 등을 다루기 위한 java표준 API이다. 클래스나 메소드의 메타정보를 동적으로 획득하고, 코드도 동적으로 호출할 수 있다. 다음과 같은 클래스가 있다. 패키지 클래스 java.lang Class java.lang.reflect Constructor java.lang.reflect Field java.lang.reflect Method Spring 등의 프레임워크는 많은 내부처리에서 리플렉션을 이용하고 있다. 따라서 리플렉션을 이해하면 다음과 같은 장점이 있다. ・프레임워크의 소스 코드를 이해할 수 있다. ・소스 코드를 읽지않고도 프레임워크 내부의 처리를 이미지화 할 수 있다. ・스스로 프레임워크를 만..
0. 프록시란? 클라이언트 (client) 와 서버 (server) 개념에서 클라이언트는 서버에 필요한 것을 요청하고, 서버는 그 요청을 처리하는 것이다. 네트워크 개념으로 생각하면, 클라이언트는 웹브라우저가 되고 서버는 웹 서버이다. 객체로 생각하면 요청하는 객체가 클라이언트이고 요청을 처리하는 객체가 서버이다. 이 때, 클라이언트가 서버를 직접 호출하고 처리 결과를 직접 받는다면 직접 호출이라하고, 어떤 대리자를 통해서 대신 간접적으로 요청하고 결과를 받는다면 간접 호출이라 한다. 여기서 대리자를 프록시 (Proxy) 라고 한다. 그런데, 대리자를 이용하면 그 대리자가 중간에 여러가지 일을 할 수 있다는 점이 특징이다. 대리자에게 "커피 좀 사와"라고 부탁했는데, 그 대리자가 이미 커피가 준비되어 있..