• 티스토리 홈
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에서 프록시 사용 6
        2022년 11월 29일
        • starryeye
        • 작성자
        • 2022.11.29.:35
        반응형

        지난 포스팅에서는 빈 후 처리기(BeanPostProcessor) 인터페이스를 구현하여..

        프록시를 스프링 빈 저장소에 원본 객체 대신 집어 넣을 수 있었다.

        (개발자의 개발 대상 : Advisor, BeanPostProcessor)

         

         

        스프링은..

        역시 개발자를 편하게 해준다..

         

        스프링은..

        이미.. 프록시를 생성하기 위한 빈 후처리기를 만들어서 제공한다.

        -> AnnotationAwareAspectJAutoProxyCreator 이다.

        -> 따라서, 개발자는 Advisor만 개발하면 된다.

         

        이를 위해서..

        아래 라이브러리를 추가 해주자.

        implementation 'org.springframework.boot:spring-boot-starter-aop'

        해당 라이브러리를 추가하면 스프링 부트가 AOP 관련 클래스를 자동으로 스프링 빈에 등록한다.

        (AnnotationAwareAspectJAutoProxyCreator 포함)

         

         

        AnnotationAwareAspectJAutoProxyCreator

        이름 그대로.. 자동으로 프록시를 생성해주는 빈 후 처리기이다.

        스프링 빈으로 등록된 Advisor들과 @Aspect 어노테이션을 자동으로 찾아서

        프록시가 필요한 곳에 자동으로 프록시를 적용해준다.

         

        클래스와 인터페이스간 상속과 구현을 보여주는 다이어그램이다.

        AnnotationAwarAspectJAutoProxyCreator(AutoProxyCreator)는

        BeanPostProcessor를 상속 받은.. 클래스이다.

         

        AutoProxyCreator의 작동 과정을 알아보자..

        1. 스프링이 스프링 빈 대상이 되는 객체 생성(@Bean, 컴포넌트 스캔 대상)

        2. 생성된 객체를 스프링 빈 저장소에 등록하기 전에 빈 후처리기에 전달한다.

        3. 모든 Advisor를 조회한다. (직접 등록한 Advisor 빈이 될 수도 있고 @Aspect 적용 대상 빈으로 만든 Advisor 일 수도 있다.)

        4. 조회한 Advisor의 Pointcut을 사용해서 생성된 해당 객체가 프록시 적용 대상 객체인지 판별한다.

        (메서드 하나라도 포인트컷 조건에 만족하면 프록시 적용 대상이다.)

        5. 프록시 적용 대상이라면, 프록시를 생성하고 반환하여 프록시를 스프링 빈으로 등록한다.

        (프록시 적용 대상이 아니라면, 원본 객체가 스프링 빈으로 등록됨)

         

         

        예시 코드로 알아보자.

         

        Advisor를 스프링 빈으로 직접 등록

        수동 빈 등록 방법으로 Advisor를 등록하였다.

        pointcut과 advice를 이용하여 Advisor 생성 및 반환

         

        AspectJExpressionPointcut : AspectJ 표현식을 사용할 수 있는 포인트컷

        AspectJ 표현식 : 포인트 컷 매칭 대상의 조건들을 표현식으로 표현할 수 있다.

        setExpression() 메서드 : AspectJ 표현식을 파라미터로 넣어준다.

         

         

        @Aspect 어노테이션을 사용하여 Advisor를 스프링 빈으로 등록

        지금까지는.. MethodInterceptor를 구현하여 Advice를 직접 만들었다..

        @Aspect를 사용한다면.. 이것도 더 편해진다...

         

        @Component 어노테이션을 통해 컴포넌트 스캔으로 자동으로 빈 등록 되게끔 한다.

        @Aspect

        -> AutoProxyCreator가 @Aspect 어노테이션을 보고 Advisor를 만들고..

        -> pointcut으로 프록시 적용 대상을 가려서 프록시를 생성해준다.

         

        참고

        AutoProxyCreator 는 두가지 업무를 한다.

        1. Application 로딩 시점에 @Aspect 적용 대상을

        BeanFactoryAspectJAdvisorBuilder 를 통해 Advisor 로 생성하고

        BeanFactoryAspectJAdvisorBuilder 에 Advisor 를 저장한다.

        2. Advisor(직접 등록한 Advisor 빈이 될 수도 있고 @Aspect 적용 대상 빈으로 만든 1번의 결과물 Advisor 일 수도 있다.)

        를 기반으로 프록시를 생성한다.

         

        @Around

        -> AspectJ 표현식을 적용할 수 있으며 포인트 컷에 해당한다.

        -> @Around가 적용된 메서드는 Advice 이다.

         

         

         

        <참고>

        포인트 컷은 두가지 목적으로 사용된다.

        1. 빈 후 처리기에서 스프링 빈 저장소에 프록시 객체로 등록할지 말지를 결정한다.

        2. 프록시 대상 객체의 어떤 메서드가 호출 되었을 때.. advice를 적용할지 말지를 판단한다.

         

         

        참고

        @Transactional 사용 주의사항

        [Spring에서 프록시 사용 5] 포스팅에서

        스프링이 기본으로 제공하는 BeanPostProcessor 의 구현체 중

        CommonAnnotationBeanPostProcessor 에서 @Postconstruct 를

        호출 해준다고 했는데 @Transactional 도 사실 Spring AOP 프록시 방식으로 동작하므로

        BeanPostProcessor 로 동작한다.

        그래서 @Postconstruct 와 @Transactional 을 같이 사용하면

        @Transactional 에 의한 프록시가 만들어지기 전에 @Postconstruct 가 실행될 수 있으므로

        @Transactional 이 동작하지 않을 수 있다.

        반응형

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

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

        티스토리툴바