다이나믹 프록시 실습 다이나믹 프록시란 애플리케이션 실행도중, 특정 인터페이스 들을 구현하는 구현하는 클래스 또는 인스턴스를 만드는 기술이다. 다이나믹 프록시를 사용하여 프록시 객체를 생성 Proxy.newProxyInstance 메소드를 이용해 프록시 객체를 생성한다. 첫번째 인자는 프록시 객체를 생성할 인터페이스 타입의 클래스로더 두번째 인자는 해당 프록시가 어떤 인터페이스를 구현체인가 3번째 인자는 이를 구현하는 InvocationHandler 이다. InvocationHandler는 invoke 메소드를 구현한다. 첫번째 인자는 newProxyInstance를 사용해 생성된 프록시 객체의 참조 두번째 인자는 프록시를 통해 호출된 메소드의 참조 세번째 인자는 해당 메소드의 파라메터들의 참조 invo..
프록시 패턴 직역하면 프록시는 대리자 라는 의미이다. 프록시와 리얼 서브젝트를 공유하는 인터페이스가 있다. 프록시가 리얼 서브젝트를 참조하고 있다. 정리하면, 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..
DI Container 만들어보기 Sprign IoC Container에 비하면 부족하지만 Reflection을 활용해 DI Container를 만들어 보자 @Inject @Inject 애노테이션을 만들어 해당 애노테이션이 존재하는 필드까지 DI가 되도록 구현한다. Reflection 을 활용하려면 런타임시까지 애노테이션정보가 존재해야하기 떄문에 Rentention을 RUNTIME으로 지정해준다. ContainerService 우리가 구현할 DI Container 클래스이다. T getObject(Class) 메소드 파라메터로 클래스 인스턴스를 받아 Reflection을 활용해 DI 해준다. 이때 createInstance를 활용하며, 만약 @Inject 애노테이션이 붙은 필드가 있다면 해당 필드의 인스..