ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [JAVA] 다이나믹 프록시 - 1
    Java 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 참고

     

    댓글

Designed by Tistory.