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

        직전 포스팅에서..

        ProxyFactory를 사용하여

        프록시 객체를 생성하고 적용하는 방법의 문제점을 다시 적어보겠다..

        1. 수동 빈 등록 시, @Configuration에서 ProxyFactory를 통해 일일이 프록시를 생성하고 리턴 해줘야함..
        2. 컴포넌트 스캔을 통해 자동 빈 등록을 사용하는 클래스는 프록시를 적용할 수 없음
        -> 스프링 컨테이너에 타겟 객체가 직접 등록이 되어버려서 개발자가 손쓸수가 없는 상황 

        이 문제점은.. 스프링에서 제공하는..

        빈 후 처리기(BeanPostProcessor) 로 해결할 수 있다.

         

        빈 후 처리기는..

        스프링이 빈 저장소에 등록할 목적으로 생성한 객체를 빈 저장소에 등록하기 직전에

        조작하고 싶을 때 사용한다.

        -> 다른 객체로 바꿔치기 가능..(프록시로..)

         

        대상이 되는 빈은..

        수동 빈 등록, 컴포넌트 스캔 모두 포함이다.

         

         

        public interface BeanPostProcessor {
        
        	@Nullable
        	default Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
        		return bean;
        	}
        
        	@Nullable
        	default Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
        		return bean;
        	}
        
        }

        BeanPostProcessor 인터페이스의 선언이다.

         

        개발자는 빈 후 처리기를 사용하려면 해당 인터페이스를 구현하고..

        스프링 빈으로 등록해주면 된다.

         

        <참고>

        BeanPostProcessor를 구현한 빈 후 처리기를 스프링 빈으로 등록할 시,

        일반적인 빈보다 우선적으로 등록 처리 되므로 순서 걱정은 필요없다.

         

         

        postProcessBeforeInitialization 메서드

        -> 객체 생성 이후에 @PostConstruct 같은 초기화가 발생 하기 전에 호출되는 포스트 프로세서

         

        postProcessAfterInitialization 메서드

        -> 객체 생성 이후에 @PostConstruct 같은 초기화가 발생한 다음에 호출되는 포스트 프로세서

         

        파라미터 Object bean은 실제로 등록한 원본 객체이다.

         

        <참고>

        @PostConstruct...

        -> 빈이 생성되고 의존성 주입이 완료되고 난 이후 호출될 수 있도록 해주는 어노테이션..

        -> 빈 생애주기에서 1회만 수행되는 것을 보장함.

        -> 보통 초기화 로직을 넣어둔다.

        -> 사실.. @PosConstruct도 빈 후 처리기를 이용하여 나온 어노테이션이다.

        -> CommonAnnotationBeanPostProcessor라는 스프링의 기본 빈 후처리기에서

        -> @PostConstruct가 적용된 메서드를 호출해준다.

         

        @Autowired

        -> @Autowired 어노테이션도 마찬가지로..

        -> AutowiredAnnotationBeanPostProcessor라는 빈 후 처리기에서 처리해주는 어노테이션이다. 

         

         

        사용 예시 코드를 알아보자.

        BeanPostProcessor 인터페이스를 구현한 빈 후 처리기이다.

        (해당 코드에선 컴포넌트 스캔으로 빈 등록하지 않고 수동으로 빈 등록)

        Advisor를 생성자에서 주입받는다.

         

        postProcessAfterInitialization() 메서드를 오버라이딩 한다.

        패키지 이름을 reflection 기술로 받아서 패키지 이름을 패턴 비교해서 대상이 아닐 경우는

        파라미터 bean 을 그대로 반환하여 조작되지 않도록 하였다.

         

        프록시 대상일 경우엔..

        advisor를 등록하고 생성한 ProxyFactory를 만들고

        프록시 객체를 만들어 원본 객체 대신 반환 해준다.

         

        <결과>

        스프링 컨테이너에는 프록시 객체가 원본 객체 대신에 등록된다.

        (프록시 대상 클래스 한정)

         

        <장점>

        1. @Configuration에서 일일이 ProxyFactory, Advisor, Proxy를 생성해서 등록해주는 코드를 작성하지 않고

        BeanPostProcessor 를 구현한 클래스를 빈으로 한번 등록해주기만 하면 된다.

        2. 컴포넌트 스캔으로 자동으로 빈이 등록되는 상황에서도 동작한다.

         

        <문제점>

        프록시 대상 클래스인지 판별하는 로직을 관리해야한다..

        (예시 코드에서 26 ~ 29 line)

        -> 조금만 생각해보면.. Advisor의 포인트컷으로 대체가능 하다는 것을 알 수 있다.

        -> 실제로 스프링 AOP는 포인트 컷을 사용해서 프록시 객체로 등록 할지 말지를 판별한다.

         

         

        <참고>

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

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

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

        반응형

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

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

        티스토리툴바