클래스 프록시 생성하기 서브클래스를 만들수 있는 라이브러리를 사용하여 프록시를 만들 수 있다. CGlib Spring, Hibernate 에서 사용하는 라이브러리다. 하위버전 호환이 좋지 않은 라이브러리이기 때문에 각자 다른 라이브러리에 내장된 형태로 많이 배포된다. CGlib를 사용한 프록시 생성 방법 Enhancer 클래가 CGlib의 핵심 클래스이다. Enhancer의 create 메소드를 사용해 프록시를 생성할 수 있으며, 첫번째 인자로는 상위 클래스 (어떤 클래스의 프록시인가), 두번째인자는 해당 프록시의 handler를 넘겨주면 첫번째 인자의 타입의 프록시 객체가 생성된다. MethodInterceptor 를 통해 handler를 구현할 수 있으며 이는 InvocationHandler와 비슷한..
다이나믹 프록시 실습 다이나믹 프록시란 애플리케이션 실행도중, 특정 인터페이스 들을 구현하는 구현하는 클래스 또는 인스턴스를 만드는 기술이다. 다이나믹 프록시를 사용하여 프록시 객체를 생성 Proxy.newProxyInstance 메소드를 이용해 프록시 객체를 생성한다. 첫번째 인자는 프록시 객체를 생성할 인터페이스 타입의 클래스로더 두번째 인자는 해당 프록시가 어떤 인터페이스를 구현체인가 3번째 인자는 이를 구현하는 InvocationHandler 이다. InvocationHandler는 invoke 메소드를 구현한다. 첫번째 인자는 newProxyInstance를 사용해 생성된 프록시 객체의 참조 두번째 인자는 프록시를 통해 호출된 메소드의 참조 세번째 인자는 해당 메소드의 파라메터들의 참조 invo..
![](http://i1.daumcdn.net/thumb/C148x148/?fname=https://blog.kakaocdn.net/dn/dbHWwf/btqzCOkAawN/GhZKYeb8sK5Uh5EqLZp7rk/img.png)
프록시 패턴 직역하면 프록시는 대리자 라는 의미이다. 프록시와 리얼 서브젝트를 공유하는 인터페이스가 있다. 프록시가 리얼 서브젝트를 참조하고 있다. 정리하면, A라는 인터페이스가 존재하고, 프록시와, 실제구현체 모두 A인터페이스를 참조하고 있다. 그리고 프록시는 내부적으로 실제 구현체를 참조하고 있으며, 클라이언트는 인터페이스를 통해 프록시객체를 이용한다. 프록시 객체를 사용하는 이유 ? SRP (단일책임원칙) 본인이 가진 역할 이외에는 추가가 되면 안된다. 하나의 클래스는 하나의 역할만 해야한다. 다른 역할을 하는것을 추가할땐 해당 클래스가 수정이 되어선 안된다. 로깅 기능을 추가한다던가, 권한 체크 기능을 추가하는 등 의 경우에 리얼 서브젝트를 직접 수정해서 안된다. 다음과 같이 BookService..
Reflection 정리 사용 되는곳 1.스프링 의존성 MVC 뷰에서 넘어온 데이터를 객체에 바인딩할때 2.하이버네이트 @Entity 클래스에 Setter가 없다면 리플렉션을 사용한다. 3.Junit Junit자체에서 유틸리티를 만들어 사용한다. https://junit.org/junit5/docs/5.0.3/api/org/junit/platform/commons/util/ReflectionUtils.html 주의사항 지나친 사용은 성능 이슈를 야기할 수 있음. 반드시 필요한 경우에만 사용할것 컴파일시 발생하지 않고 런타임시에만 발생하는 문제를 만들 가능성이 존재한다. 접근 지시자를 무시할 수 있다. 참고 https://docs.oracle.com/javase/tutorial/reflect/index.h..