-
[JAVA] 다이나믹 프록시 - 1Java 2020. 9. 23. 20:22
- 참고 : 인프런 >> 더 자바, 코드를 조작하는 다양한 방법, (백기선 강의)
스프링 데이터 JPA는 어떻게 작동될까 ? 'Spring AOP 'Proxy'' 에서 Bean 객체로 생성해준다.
public interface BookRepository extends JpaRepository<Book, Long>{ } //test code @Autowired private BookRepository bookRepository; @Test public void test(){ assertThat(bookRepository).isNotNull(); bookRepository.findAll(); }
프록시 패턴
프록시 패턴 우리말로 "대리인" 으로 리얼 서브젝트 접근 할 때 프록시 객체로부터 접근하여 실행 전 / 후에 다양한 비즈니스 로직을 삽입할 수 있다.
1. 프록시 객체는 실제 서비스와 동일한 이름의 메서드를 갖는다.
2. 프록시 객체는 리얼 서브젝트를 참조한다.
3. 프록시 객체는 리얼 서브젝트를 호출하여 클라이언트에게 결과 값을 돌려 준다.
- 리얼 서브젝트 호출 전 비즈니스로직을 삽입 할 수 있다.
- 리얼 서브젝트 호출 후 비즈니스 로직을 삽입 할 수 있다.
[다양한 비즈니스 로직] ?
- 트랜잭션
- 로깅
- 인증
[예제코드]
public interface BookService{ public void rent(); } //리얼 서브젝트 public class RealBookService implements BookService{ @Override public void rent(){ System.out.println("real service"); } } //프록시 객체 class ProxyBookService implements BookService private final BookService bookService; ProxyBookService(BookService bookService){ this.bookService = bookService; } @Override public void rent(){ System.out.println("[pre]"); bookService.rent(); System.out.println("[after]"); } } //클라이언트 @Component public void ClientClass{ //컴파일 시점 private BookService bookService = new ProxyBookService(new RealBookService()); public callBookService(){ bookService.rent(); } }
다이나믹 프록시 ? 런타임 시, 특정 인터페이스를 구현하는 클래스 // 인스턴스를 만드는 기술
- Object Proxy.newProxyInstance(ClassLoader, Interfaces, InvocationHandler)
private BookService bookService = (BookService) Proxy.newProxyInstance(BookService.class.getClassLoader() , new Class[] { BookService.class },new InvocationHandler() { BookService bookService = new RealBookService(); @Override public Object invoke(Object proxy, Method method, Object[] args) throws Thorwable { if(method.getName().equals("rent"){ System.out.println("[pre]"); Object invoke = method.invoke(bookService,args); System.out.println("[after]"); return invoke; } return method.invoke(bookService, args); } });
단점 ?
- 유연한 구조가 아니다.
- 반드시, "인터페이스"가 필요하다
- new Class[]{ } >> 참조 할 수 있는 인터페이스를 삽입해야 한다.
- 유연한 구조 ? 스프링 AOP 참고
'Java' 카테고리의 다른 글
[JAVA] 다이나믹 프록시 - 2 (0) 2020.10.04 [Java] 리플렉션 - 5 (정리) (0) 2020.07.26 [Java] 리플렉션 - 4 (DI 프레임워크) (0) 2020.07.26 [Java] 리플렉션 - 3 (클래스 정보 수정 또는 실행) (0) 2020.07.26 [Java] 리플렉션 - 2 (어노테이션) (0) 2020.07.25 댓글