스프링 빈 생명주기

빈 생명주기 콜백

  1. 스프링 컨테이너 생성: AnnotationConfigApplicationContext 등을 통해 컨테이너 생성

  2. 스프링 빈 등록: 설정 클래스나 컴포넌트 스캔을 통해 빈을 생성하고 등록

  3. 의존관계 주입: 생성자 주입은 빈을 만드는 시점에 의존관계가 주입되지만, 수정자(Setter) 주입이나 필드(@Autowired) 주입은 빈 생성 이후 별도의 단계에서 의존관계 주입 발생

  4. 초기화 콜백: 빈에 의존관계 주입이 완료된 후, 사용자가 정의한 콜백 메서드를 통해 빈의 초기화 작업을 실행

  5. 사용: 애플리케이션에서 빈 참조

  6. 소멸 전 콜백: 스프링 컨테이너가 종료되기 직전, 사용자가 정의한 빈이 소멸에 필요한 작업을 콜백으로 수행

  7. 스프링 종료: 컨테이너가 완전히 소멸

초기화, 소멸 메서드 선언 시 인터페이스를 사용하는 경우

📌

인터페이스를 사용했을 때 단점

  1. 스프링 전용 인터페이스로 스프링 프레임워크에 의존적이다.
  2. 초기화, 소멸을 위한 구현 메서드의 명칭을 변경할 수 없어 행위에 대한 의미를 부여하기 어렵다.

💡 스프링 초창기에 등장한 초기화와 소멸 방법으로 현재로서는 잘 사용되지 않는다.

초기화, 소멸 메서드를 빈으로 이름을 지정하는 방법

@Bean(initMethod = "init", destroyMethod = "close")

장점

  • 메서드 이름을 자유롭게 변경할 수 있다.
  • 스프링 빈이 스프링 코드에 의존적이지 않고, 설정 정보에게 위임한다.

단, destroyMethod = “(inferred)” 으로 지정된 기능이 존재하는데 close, shutdown 같은 이름의 메서드를 자동으로 호출해주는 추론 방식이다. 추론 기능을 사용하고 싶지 않다면 destroyMethod="" 로 지정하면 자동으로 소멸 콜백 메서드를 실행 시키는 것을 예방할 수 있다.

초기화, 소멸 메서드 선언 시 어노테이션을 활용 하는 방법 (권장)

@PostConstruct  
public void init() {  
    System.out.println("NetworkClient.init");  
    connect();  
    call("초기화 연결 메시지");  
}  
  
@PreDestroy  
public void close() {  
    System.out.println("NetworkClient.close");  
    disconnect();  
}

특징 단, 외부 라이브러리 같이 수정할 수 없는 환경에서 어노테이션을 추가할 수 없기 때문에 활용할 수 없다. 이럴 땐 Bean 어노테이션에 initMethod, destroyMethod 를 지정하는 방식을 이용하여 해결할 수 있다.