- Spring에서 프록시 사용 52022년 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 다음글이전글이전 글이 없습니다.댓글