-
[Spring] 빈 후처리기 - BeanPostProcessorSpring 2022. 6. 19. 20:49
@Bean 애너테이션 또는 컴포넌트 스캔을 활용하여 스프링 빈을 등록하면
대상 객체를 생성 후 스프링 커테이너 내부 빈 저장소에 등록되고
등록한 스프링 빈을 조회해서 사용하게 된다.
빈 후처리기(BeanPostProcessor)
위 설명대로 스프링 컨테이너에 객체를 저장할 때 이를 조작하고 싶다면
빈 후처리기를 통해 빈 생성후 처리를 하면 된다.
빈 후처리기를 통해 객체를 조작하거나 다른 객체로 변경할 수 있다.
* 빈 등록 과정
1. 스프링 빈 대상이 되는 객체를 생성한다. (@Bean, 컴포넌트 스캔)
2. 생성된 객체를 빈 후처리기에 전달한다. (빈 저장소 등록 이전)
3. 빈 후처리기에서 대상 객체를 조작 또는 변경한다.
4. 빈 후처리기가 작업한 빈을 스프링 빈 저장소에 등록한다.
* 빈 후처리기 사용 과정
빈 후처리기를 사용하려면 BeanPostProcessor 인터페이스를 구현 후 스프링 빈으로 등록한다.
해당 인터페이스에는 2개의 메서드가 선언 되어 있는데 내용은 아래와 같다.
- postProcessBeforeInitialization(Object bean, String beanName)
: 객체 생성 이후 @PostConstruct 같은 초기화 발생되기 전 호출되는 포스트 프로세스
- postProcessAfterInitialization(Object bean, String beanName)
: 객체 생성 이후 @PostConstrruct 같은 초기화 이후 호출되는 포스트 프로세스
* @PostConstruct 란?
스프링 빈 생성 이후 빈을 초기화하는 역할로 해당 애너테이션이 붙은 초기화 메서드를
한번 호출하는 것이다.
스프링은 CommonAnnotationBeanPostProcessor 라는 빈 후처리기를 자동 등록하는데
이때 위 애너테이션이 붙은 메서드를 호출한다.
즉 스프링도 내부 기능 확장을 위해 빈 후처리기를 활용한다.
* 빈 후처리기는 빈을 조작, 변경할 수 있는 후킹 포인트
빈 후처리기는 빈 객체를 조작하거나 다른 객체로 바꾸어 버릴 수 있는데
이때 조작은 해당 객체의 특정 메서드를 호출하는 것이다.
컴포넌트 스캔의 대상이 되는 빈들을 중간 조작하는 방법으로 사용하며
즉, 빈 객체를 프록시로 교체하는 것도 가능하다.
* 빈 후처리기를 적용하여 스프링 빈 대신 프록시 등록하기
1. 특정 프록시를 적용하기 위한 클래스에 BeanPostProcessor 인터페이스를 구현하도록 한다.
2. 해당 클래스는 Advisor(Advice + Pointcut)와 패키지 이름을 주입받는다.
(패키지 이름을 주입받는 이유는 해당 패키지 외에는 동작하지 않도록 하기 위함이다.)
(비교는 매개변수로 받는 bean을 통해 해당 클래스의 패키지 이름을 반환 받을 수 있다.)
(해당 과정이 없다면 스프링 부트가 기본으로 등록하는 많은 빈들이 후처리기를 통과한다.)
(만약 동작시키려는 패키지가 아니라면 스프링 빈을 그대로 반환한다. - 주의!)
3. 프록시 팩토리를 생성하여 Advisor를 추가한다.
4. 프록시 팩토리를 통해 얻은 프록시를 리턴한다.
- 위 과정을 통해 프록시를 생성하고 프록시를 스프링 빈으로 등록하면 빈 후처리기가 처리한다.
빈 후처리기를 통해 해결할 수 있는 문제
1. 설정 파일을 적용하는 클래스 수만큼 등록했던 문제 해결
프록시 팩토리를 활용하여 인터페이스, 구체클래스 관계없이 편하게 프록시를 만들 수 있었지만
이를 등록하기 위해서는 프록시 설정 코드를 수없이 많이 작성해야했다.
하지만 빈 후처리기는 알아서 동작한다. (중복코드 제거)
2. 컴포넌트 스캔으로 등록되는 빈에도 동작
컴포넌트 스캔으로 스프링 빈을 등록하는 경우에는 등록되는 중간에 대상 객체를
조작, 변경할 수 없었으나 빈 후처리기는 컨테이너에 등록되기 전에 호출 되어
동작하기 때문에 이를 할 수 있게 되었다.
[참고 : 인프런 - 스프링 핵심 원리 - 고급편]
'Spring' 카테고리의 다른 글
[Spring] @Aspect - AOP (0) 2022.06.19 [Spring] 빈 후처리기 - 스프링이 제공하는 빈 후처리기 (0) 2022.06.19 [Spring] 포인트컷, 어드바이스, 어드바이저 (Pointcut, Advice, Advisor) (0) 2022.06.17 [Spring] 프록시 팩토리 (ProxyFactory) (0) 2022.06.17 [Spring] 동적 프록시 기술 - CGLIB (0) 2022.06.16