본문 바로가기
Spring

[Spring] 빈 후처리기

by 개미가되고싶은사람 2024. 9. 24.

목차

    스프링에서 빈 등록 방법에는 대표적으로 @Bean, @Component/Scan를 이용한 방법이 있습니다.
    해당 방법들은 빈 등록 절차는 다르지만, 스프링 컨테이너에서 빈을 관리하고 사용하는 방식은 동일합니다.

     

    빈 후처리기 - BeanPostProcessor

    스프링 빈을 등록 목적으로 생성했지만, 스프링 컨테이너에 저장하기 전에 해당 객체에 대해 어떤 작업을 하고 싶을 때 사용하는 기능입니다. 이런 빈 후처리기는 객체를 조작할 수 있지만, 완전히 다른 객체로 변경하는 작업도 가능합니다.

    package org.springframework.beans.factory.config;
    
    import org.springframework.beans.BeansException;
    import org.springframework.lang.Nullable;
    
    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 인터페이스에는 postProcessBeforeInitializationpostProcessAfterInitialization메소드가 존재합니다.

    이 두 메소드로 아까 언급했던 빈 객체를 조작하거나 변경하는 작업을 실행합니다.

    postProcessBeforeInitialization 메소드는 빈의 초기화가 이루어지기 전에 호출되며, 이 시점에서 빈의 속성을 수정하거나 추가적인 설정을 적용할 수 있습니다.
    반면, postProcessAfterInitialization 메소드는 스프링 컨테이너에 등록된 후 빈 객체를 다른 객체로 변경할 때 사용됩니다. 
    여기서 Object bean은 스프링 컨테이너에 등록된 빈 객체를 나타내며, beanName은 해당 빈의 이름을 의미합니다.

     

    추가 내용

    더보기

    스프링 프레임워크는 CommonAnnotationBeanPostProcessor라는 빈 후처리기를 자동으로 등록합니다. 이 놈은 @PostConstruct 애노테이션이 붙은 메소드를 찾아 해당 메소드가 수행하는 초기화 작업을 실행합니다. 즉, @PostConstruct 애노테이션이 붙은 메소드는 빈이 생성된 후, 의존성이 주입된 직후에 호출되어 필요한 초기화 로직을 수행할 수 있게 됩니다.

    스프링 빈 등록 절차 - 빈 후처리기 포함

    스프링에서 빈을 등록할 때, 많은 사람들이 이 과정에서 빈 후처리기에 존재 여부에 대해서 잘 모릅니다. 사실 스프링 빈 등록 절차는 다음과 같은 방식으로 진행됩니다.

    1. 생성: 스프링에서 사용할 객체를 만듭니다. 이 객체는 @Bean, @Component, @Service 같은 어노테이션을 통해 생성
    2. 전달: 생성된 객체는 빈 저장소에 등록되기 전에 빈 후처리기에 전달됩니다.
    3. 후처리 작업: 빈 후처리기는 전달받은 객체를 수정하거나 다른 객체로 바꿀 수 있습니다. 
    4. 등록: 마지막으로, 후처리기를 통해 반환된 객체가 빈 저장소에 등록됩니다. 물론 객체가 변하지 않고 그대로 저장될 수도 있습니다.

    이처럼 빈 후처리기는 스프링 빈 등록 과정에서 필수적인 과정입니다.

     

     

    결론

    스프링이 제공하는 빈 후처리기를 통해 스프링 컨테이너에 등록된 빈을 조작하거나 변경할 수 있습니다. 빈을 조작 수 있다는 특성을 활용하면 의존성이 주입된 직후에 추가적인 초기화 작업을 수행할 수 있습니다. 예를 들어, @PostConstruct 애노테이션을 사용하여 초기화 메소드를 지정할 수 있습니다.
    또한, 빈을 교체할 수 있는 특성을 이용해 프록시를 생성할 수 있습니다. 이 프록시는 스프링의 중요한 개념인 AOP에 적용되어, 메소드 호출 전후에 특정 로직을 수행할 수 있게 해줍니다.