
이번 글에서는 예제 코드를 활용해서 빈의 생명주기를 관찰 할 것이다.
예제 코드는 다음과 같다.
✍️ 작성
public class MyBean implements InitializingBean, DisposableBean {
public MyBean() {
System.out.println("MyBean 생성자 호출");
}
@PostConstruct
public void postConstruct() {
System.out.println("@PostConstruct 메소드 호출");
}
@Override
public void afterPropertiesSet() throws Exception {
System.out.println("InitializingBean의 afterPropertiesSet 메소드 호출");
}
public void init() {
System.out.println("사용자 정의 init 메소드 호출");
}
@PreDestroy
public void preDestroy() {
System.out.println("@PreDestroy 메소드 호출");
}
@Override
public void destroy() throws Exception {
System.out.println("DisposableBean의 destroy 메소드 호출");
}
public void cleanup() {
System.out.println("사용자 정의 cleanup 메소드 호출");
}
}
예제에 나타난 MyBean클래스는 스프링 컨테이너에 의해 빈으로 등록되고 사용되고 소멸하는 과정에서 해당 메서드들을 순서대로 실행한다. 각 메서드들을 하나하나 살펴보자.
✍️ 작성
public MyBean() {
System.out.println("MyBean 생성자 호출");
}
빈 객체를 생성할 때 제일 먼저 생성자가 호출된다. 이 시점에서는 아직 의존성 주입이 이루어지기 전이다.
✍️ 작성
@PostConstruct
public void postConstruct() {
System.out.println("@PostConstruct 메소드 호출");
}
의존성 주입이 완료된 후에, 초기화 전에 호출되며 자바 표준 어노테이션으로, 스프링 컨테이너가 모든 의존성 주입을 완료하면 자동으로 호출해준다.
보통 초기화 작업 중 꼭 필요한 준비 작업을 여기서 수행할 수 있다.
✍️ 작성
@Override
public void afterPropertiesSet() throws Exception {
System.out.println("InitializingBean의 afterPropertiesSet 메소드 호출");
}
InitializingBean 인터페이스를 구현하면, 빈의 프로퍼티가 모두 설정된 후에 호출되는 콜백 메소드이다.
스프링이 빈의 프로퍼티를 주입한 후에 호출해서, 추가적인 초기화 작업을 할 수 있게 해준다.
✍️ 작성
public void init() {
System.out.println("사용자 정의 init 메소드 호출");
}
개발자가 직접 정의한 초기화 메소드로, 이 메소드는 보통 XML 설정이나 @Bean 어노테이션에서 initMethod = "init"처럼 명시적으로 지정했을 때 호출된다.
스프링은 위에서 언급한 콜백 메소드들 이후에 이 사용자 정의 메소드를 호출해서 추가 초기화 작업을 할 수 있게 해준다.
종합적으로 순서는 생성자 → @PostConstruct → afterPropertiesSet() → 사용자 정의 init 메소드 순으로 호출된다.
✍️ 작성
@PreDestroy
public void preDestroy() {
System.out.println("@PreDestroy 메소드 호출");
}
빈이 소멸되기 전에 호출되어, 정리 (cleanup) 작업을 할 수 있게 해주는 메소드이다. 스프링 컨테이너가 종료되거나 빈을 제거하기 전에 호출되며 리소스 해제 같은 작업을 여기서 수행할 수 있다.
✍️ 작성
@Override
public void destroy() throws Exception {
System.out.println("DisposableBean의 destroy 메소드 호출");
}
DisposableBean 인터페이스를 구현하면, 빈 소멸 전에 스프링이 호출해주는 메소드이다. 스프링이 빈을 파괴할 때 호출해서, 추가 정리 작업을 할 수 있게 해준다.
✍️ 작성
public void cleanup() {
System.out.println("사용자 정의 cleanup 메소드 호출");
}
개발자가 직접 정의한 소멸 (cleanup) 메소드이다. 이 메소드는 @Bean 어노테이션에서 destroyMethod = "cleanup"으로 지정하면 호출된다.
스프링이 소멸 단계에서 위의 표준 메소드 호출 이후에 추가적으로 호출할 수 있도록 해준다.
종합적으로 순서는 @PreDestroy → DisposableBean의 destroy() → 사용자 정의 destroy 메소드 (예: cleanup) 순으로 호출된다.
해당 코드들을 모두 살펴보았다. 예제 코드의 실행 결과는 다음과 같다.
✍️ 작성
MyBean 생성자 호출
@PostConstruct 메소드 호출
InitializingBean의 afterPropertiesSet 메소드 호출
사용자 정의 init 메소드 호출
2024-05-08T15:01:52.496+09:00 INFO 50535 ---[demo] [ main] com.example.my.MainApplication: Started MainApplication in 0.376 seconds (process running for 0.584)
@PreDestroy 메소드 호출
DisposableBean의 destroy 메소드 호출
사용자 정의 cleanup 메소드 호출
스프링 설정 파일 (@Configuration 클래스)에서 @Bean 어노테이션을 사용해서 빈을 등록할 때, 초기화와 소멸 시 호출할 메소드를 명시할 수 있다. 예를 들면 다음과 같다.
✍️ 작성
@Bean(initMethod = "init", destroyMethod = "cleanup")
public MyBean myBean() {
return new MyBean();
}
1) initMethod = "init"
빈이 생성되고 필요한 의존성이 주입된 후, 스프링은 자동으로 myBean() 메소드로 등록된 MyBean 객체에서 init()라는 메소드를 찾아서 호출한다.
이는 위의 사용자 정의 초기화 메소드인 public void init()를 의미한다.
2) destroyMethod = "cleanup"
스프링 컨테이너가 종료되거나 빈을 소멸시킬 때, 자동으로 MyBean 객체에서 cleanup() 메소드를 호출한다.
이는 위의 사용자 정의 소멸 메소드인 public void cleanup()을 의미한다.
멋쟁이 사자처럼 강의자료