카테고리 없음

[Spring] 빈의 생명주기와 콜백

개바리여리 2025. 6. 28. 13:02

스프링 컨테이너는 빈 객체들을 관리하는 역할을 한다.

이러한 관리에는 객체의 생성~ 소멸 까지의 LifeCycle 관리를 하고 필요에 따라 호출해주는 역할이다.

 

빈의 생명주기 전체 흐름

  1. 빈 생성
    • 스프링 컨테이너가 빈을 생성 (new 키워드)
  2. 의존성 주입 (DI)
    • 생성자, 세터, 필드 등을 통해 필요한 의존 객체를 주입
  3. 빈 이름 설정 (Optional)
    • BeanNameAware 인터페이스를 구현하면, setBeanName() 호출됨
  4. 빈 팩토리 설정 (Optional)
    • BeanFactoryAware, ApplicationContextAware 등을 구현 시 관련 설정 주입
  5. 초기화 콜백
    • InitializingBean의 afterPropertiesSet() 호출
    • 또는 @PostConstruct 메서드 실행
    • 또는 init-method에 지정된 메서드 호출
  6. 빈 사용 가능 상태
  7. 소멸 콜백
    • @PreDestroy 메서드 실행
    • 또는 DisposableBean의 destroy() 호출
    • 또는 destroy-method에 지정된 메서드 호출
  8. GC 대상이 됨

여기서 말하는 "콜백(callback)" 은 "스프링이 특정 시점에 사용자가 지정한 메서드를 대신 호출해주는 것" 을 말한다.

 

 

빈 생명주기 콜백 - 인터페이스 기반 콜백 

 

목적 인터페이스 메서드
초기화 InitializingBean afterPropertiesSet()
소멸 DisposableBean destroy()

 

public class MyBean implements InitializingBean, DisposableBean {
    @Override
    public void afterPropertiesSet() {
        System.out.println("빈 초기화 완료");
    }

    @Override
    public void destroy() {
        System.out.println("빈 소멸 전 처리");
    }
}

 

InitializingBean은 afterPropertiesSet 메서드를 통해 의존성 주입이 끝난 후에 초기화를 진행할 수 있다.

DisposableBean은 destory() 메서드로 Bean 종료 전에  소멸을 지원한다. (자원 해제)

 

 

이러한 방식은 POJO 방식은 아니며 스프링 인터페이스에 의존하게 되는 단점이 존재한다. (특정 인터페이스에 종속적)

이 방식은 초창기 스프링 방식이며 현재는 잘 사용하지 않는다.

 

 

빈 생명주기 콜백 - 어노테이션 기반 콜백

애노테이션 시점

어노테이션 시점
@PostConstruct 초기화 직후
@PreDestroy 소멸 직전

 

@Component
public class MyBean {

    @PostConstruct
    public void init() {
        System.out.println("초기화 메서드 호출");
    }

    @PreDestroy
    public void cleanup() {
        System.out.println("소멸 전 메서드 호출");
    }
}

 

스프링에 종속되지 않는 자바 표준 어노테이션을 활용한 방법이다.

매우 편리한 방식이며 스프링에서 지향하는 방식이다.