• 티스토리 홈
starryeye
  • 프로필사진
    starryeye
    • 분류 전체보기 (189)
      • C++ (17)
      • Java (24)
      • OOP (5)
      • Spring Reactive Stack (12)
        • Reactive Streams (3)
        • Netty (4)
        • Reactor (1)
        • Webflux (3)
        • DB, Cache 연동 (1)
      • Spring (90)
        • Core (17)
        • MVC (33)
        • Client (2)
        • Security (4)
        • DB, Cache 연동 (33)
      • DataBase (12)
        • RDBMS (2)
        • NoSQL (10)
      • Message Broker (6)
      • Web (4)
      • Network (4)
      • 대규모 시스템 설계 (15)
  • 방문자 수
    • 전체:
    • 오늘:
    • 어제:
  • 최근 댓글
      등록된 댓글이 없습니다.
    • 최근 공지
        등록된 공지가 없습니다.
      # Home
      # 공지사항
      #
      # 태그
      # 검색결과
      # 방명록
      • Spring에서 프록시 사용 4
        2022년 11월 19일
        • starryeye
        • 작성자
        • 2022.11.19.:07
        반응형

        앞선 포스팅에서 JDK 동적 프록시 기술과 CGLIB 동적 프록시 기술에 대하여 알아 봤다.

         

        두 기술은 동일하게 프록시라는 기술을 도입하게 해주지만..

        JDK 동적 프록시 기술은 인터페이스가 있어야 하고..

        CGLIB는 구체 클래스로 프록시를 만들어 낸다..

        그래서 사용법이 달랐다..

         

        개발자는 편해지고 싶다..

        인터페이스가 있다면 JDK 동적 프록시가 적용되고

        구체클래스만 있다면 CGLIB가 적용되게 알아서 해주는건 없나?

        -> 스프링은 역시 이미 제공하고 있다.

         

        바로 프록시 팩토리 !

         

        프록시 팩토리에 대해 알아보자..

         

        선 요약
        Advice : 프록시 로직이 들어가고 실제 target 객체 메서드를 호출
        Pointcut : 특정 조건이 맞을 때만 프록시가 적용되도록 해줌

         

        프록시에 추가할 로직은 기존에...

        JDK 동적 프록시의 경우 : InvocationHandler

        CGLIB의 경우 : MethodInterceptor

        인터페이스를 개발자가 구현했다.

         

        프록시 팩토리의 경우엔..

        둘 대신에 Advice를 구현해주면 된다.

        (실제 이름은 MethodInterceptor이며.. CGLIB와 동일하기 때문에 패키지 경로에 주의!)

        Advice에 해당하는 MethodInterceptor 이다.

        패키지 명에 주의하자..

         

        파라미터는 한개가 제공되며..

        MethodInvocation에..

        다음 메서드를 호출하는 방법..

        현재 프록시 객체 인스턴스..

        args, 메서드 정보등이 모두 포함되어있다.

         

        참고>

        MethodInterceptor 인터페이스는 Advice를 상속하고 있다.

         

         

        예제를 통해 알아보자.

        Advice를 구현하였다.

        특징으로는..

        target에 해당하는 필드 변수가 보이지 않고..

        단순히 invocation.proceed(); 를 호출 해주면..

        실제 target 객체의 메서드가 호출된다.

         

        프록시를 사용하는 부분의 코드이다.

        proxyFactory를 생성할 때, target을 넣어준다.

        (구현 객체를 넣으면 CGLIB, 인터페이스를 넣으면 JDK 동적 프록시가 적용된다.)

         

        setProxyTargetClass(True); 옵션을 통해 항상 CGLIB로 생성되도록 설정 해줄 수 있다.

         

        프록시 팩토리에 구현 해놓은 Advice를 넣어준다.

        프록시를 반환 받고..

         

        프록시객체에서 프록시를 적용하고 싶은 target 객체의 메서드를 호출해주면..

        Advice로 구현해 놓은 invoke() 메서드가 호출되고...

        invoke() 메서드에서 invocation.proceed() 호출을 통해 실제 target 메서드가 호출된다.

         

         

        다시 정리..

        Proxy : ProxyFactory가 JDK동적프록시 or CGLIB 기술을 통해 만들어준다.

        Pointcut : 프록시를 적용할지 말지 정해주는 조건에 해당한다.

        Advice : 프록시의 로직에 해당한다. (타겟 호출 포함, invocation.proceed();)

        Advisor : 하나의 Pointcut과 하나의 Advice를 셋트로 보는 개념..

         

        참고>

        위 실제 예제에서 Pointcut은 적용하지 않아서..

        target의 모든 메서드에 프록시가 적용될 것이다.

         

        그리고..

        원래는 어드바이스를 proxyFactory에 넣어주는 것이 아닌..

        advice와 pointcut로 advisor 를 생성해 proxyFactory에 넣어주고 프록시를 생성해준다.

         

        참고>

        ProxyFactory의 addAdvisor() 메서드로 여러개의 어드바이저를 계속 넣어 줄 수 있다.

        -> 이렇게 되면 하나의 프록시에 여러 어드바이저가 적용된게 된다.

        -> 이는.. 하나의 프록시에 하나의 어드바이저로 프록시 자체를 여러개 적용시키는 방법보다 효율적이다.

        -> 추후 포스팅할 Spring AOP에서도 최적화를 진행해서 프록시는 하나만 만들고...

        -> 하나의 프록시에 여러 어드바이저를 적용한다.

         

         

        남은 문제 점>

        아직도..

        1. 수동빈 등록 시, @Configuration에서 ProxyFactory를 통해 일일이 프록시를 생성하고 리턴 해줘야함..

        2. 컴포넌트 스캔을 통해 자동 빈 등록을 사용하는 클래스는 프록시를 적용할 수 없음

        -> 스프링 컨테이너에 타겟 객체가 직접 등록이 되어버려서 개발자가 손쓸수가 없는 상황 

        반응형

        'Spring > Core' 카테고리의 다른 글

        Spring에서 프록시 사용 6  (0) 2022.11.29
        Spring에서 프록시 사용 5  (0) 2022.11.20
        Spring에서 프록시 사용 3  (0) 2022.11.14
        Spring에서 프록시 사용 2  (0) 2022.11.14
        Spring에서 프록시 사용 1  (0) 2022.11.05
        다음글
        다음 글이 없습니다.
        이전글
        이전 글이 없습니다.
        댓글
      조회된 결과가 없습니다.
      스킨 업데이트 안내
      현재 이용하고 계신 스킨의 버전보다 더 높은 최신 버전이 감지 되었습니다. 최신버전 스킨 파일을 다운로드 받을 수 있는 페이지로 이동하시겠습니까?
      ("아니오" 를 선택할 시 30일 동안 최신 버전이 감지되어도 모달 창이 표시되지 않습니다.)
      목차
      표시할 목차가 없습니다.
        • 안녕하세요
        • 감사해요
        • 잘있어요

        티스토리툴바