Spring Bean 생명주기

GreatCloud·2025년 12월 17일

백엔드

목록 보기
5/14

핵심 목표

"Spring이 bean을 어떻게 만들고, 언제 초기화(init)하고, 언제 파괴(destroy)" 하는지 완벽하게 파악하기

1. 개념 이해

Spring Container가 bean을 생성하는 과정
Spring을 사용하면 개발자가 new UserService()와 같이 직접 객체를 만들지 않으며 Spring이 대신 만들어 관리(제어의 역전(IOC), 의존성 주입(DI))를 하는데 정확히 어떤 순서로 만들어 질까?

@Service
public class UserService {
    private final EmailService emailService;
    
    @Autowired
    public UserService(EmailService emailService) {
        System.out.println("1. 생성자 호출");
        this.emailService = emailService;
    }
    
    @PostConstruct
    public void init() {
        System.out.println("2. @PostConstruct 호출");
    }
    
    @PreDestroy
    public void destroy() {
        System.out.println("3. @PreDestroy 호출");
    }
}

Bean의 생성 과정 8단계 (요약)

  1. Bean의 정의 읽기 (Component Scan, @Bean 메소드)
    Component Scan:

    • Spring이 시작하면서 @ComponentScan이 지정된 패키지를 탐색함
    • @Component, @Service, @Repository, @Controller 붙은 클래스 발견
    • Spring: "아, 이 클래스들을 빈으로 만들어야겠구나" → 빈 정의(BeanDefinition) 생성

    @Bean 메소드:

    • Spring이 @Configuration 클래스를 탐색
    • 내부의 @Bean메서드 발견
    • Spring: "이 메서드들이 반환하는 객체를 빈으로 만들어야겠구나" → 빈 정의 생성
  2. 빈(Empty) 인스턴스 생성 (생성자 호출)

    • 실제 객체를 메모리에 만듦(new 키워드와 동일)
    • 아직 필드는 Null 상태
    • 생성자만 호출된 상태.
  3. 의존성 주입 (필드 주입의 경우 여기서, 생성자 주입이면 인스턴스 생성할 때)

    • 필드나 생성자에 필요한 다른 bean을 넣어준다
    @Autowired
    private UserRepository repository;  // ← 3단계에서 여기에 주입
    @Autowired
    private EmailService emailService;  // ← 3단계에서 여기에 주입
    • 생성자 주입의 경우:
    @Service
    public class UserService {
    
    private final UserRepository repository;
    
    // 생성자 주입은 2단계에서 함께 처리됨
    public UserService(UserRepository repository) 	{
        this.repository = repository;
    	}
    }
  4. AWARE 인터페이스 처리

    • Bean이 Spring Container 자체나, 내부에 있는 정보들에 접근해야할 때 해당 인터페이스로 받아옴
  5. BeanPostProcessor.postProcessBeforeInitialization()

    • 초기화 직전에 Bean을 수정하거나 검증한다.
  6. @PostConstruct 또는 InitializingBean.afterPropertiesSet()

    • Bean의 초기화 로직을 실행 (개발자가 작성한 초기화 코드가 될 수도 있음)
    • InitializingBean.afterPropertiesSet()은 옛날 방식 @postCostruct와 같은 역할이나 Spring 코드에 종속되므로 잘 사용하지 않는 추세이다
  7. BeanPostProcessor.postProcessAfterInitialization() ⭐(AOP 프록시 생성)

    • 초기화 후 빈을 프록시로 감싼다 (AOP 적용)
    • 프록시 작업이 필요 없는 경우 원본 빈 사용
  8. 빈 사용 가능

    • Spring Containter에 등록 완료, 사용가능
  9. 컨테이너 종료 시 @PreDestroy 또는 DisposableBean.destroy

profile
모르는 것에 부끄러워 말고 아는 것에 자만하지 말 것

0개의 댓글