1. Spring bean life cycle

- 객체 생성 → 의존관계 주입

 

1.1 Spring bean event life cycle

- 스프링 빈은 객체를 생성하고, 의존관계 주입이 모두 끝난 다음에야 데이터를 사용할 수 있는 준비가 완료된다. 따라서 초기화 작업은 의존관계 주입이 완료되고 난 다음에 호출돼야 한다.

- 스프링은 의존관계 주입이 완료되면 스프링 빈에게 콜백 메서드를 통해 초기화 시점을 알려주는 다양한 기능을 제공한다. 또한 스프링은 스프링 컨테이너가 종료되기 직전에도 소멸 전 콜백을 준다.

- 스프링 컨테이너 생성 → 스프링 빈 생성 → 의존관계 주입 → 초기화 콜백 → 사용 → 소멸 전 콜백 → 스프링 종료

 

2. 인터페이스(InitializingBean, DisposableBean)를 이용한 방법

- InitializingBean, DisposableBean 인터페이스를 상속 받아 콜백 메서드를 오버라이딩한다.

- InitializingBean은 afterPropertiesSet() 메서드로 초기화를 지원한다.

- DisposableBean은 destroy() 메서드로 소멸을 지원한다.

- 초기화, 소멸 메서드의 이름을 변경할 수 없다.

- 코드를 고칠 수 없는 외부 라이브러리에 적용할 수 없다.

- 스프링 전용 인터페이스이다.

public class Test implements InitializingBean, DisposableBean {
	@Override
	public void afterPropertiesSet() throws Exception {}

	@Override
	public void destroy() throws Exception {};
}

 

3. 설정 정보에 초기화, 소멸 메서드를 지정하는 방법

- @Bean(initMethod = "init", destroyMethod = "close")와 같은 방법으로 설정 정보에 초기화, 소멸 메서드를 지정할 수 있다.

- 메서드 이름을 자유롭게 줄 수 있다.

- 코드가 아니라 설정 정보를 사용하기 때문에 코드를 고칠 수 없는 외부 라이브러리에도 초기화, 종료 메서드를 적용할 수 있다.

- 스프링 빈이 스프링 코드에 의존하지 않는다.

- 종료 메서드 추론: destroyMethod는 기본값이 (inferred)로 등록되어 있기 때문에, close, shutdown이라는 이름의 메서드를 자동으로 호출해준다. 따라서 직접 스프링 빈으로 등록하면 종료 메서드를 따로 적어주지 않아도 잘 동작한다. 추론 기능을 사용하고 싶지 않다면 destroyMethod = ""로 설정하면 된다.

//설정 정보
@Configuration
static class TestConfig {
	@Bean(initMethod = "init", destroyMethod = "close")
	public Test test() {
		Test test = new Test();
		return test;
	}
}

//서비스 코드
public class Test {
	public void init() {}
	public void close() {};
}

 

4. @PostConstruct, @PreDestroy 애노테이션을 이용한 방법

- 애노테이션 하나만 붙이면 되므로 편리하다.

- 스프링 종속 기술이 아닌 자바 표준이다.

- 외부 라이브러리에는 적용하지 못하기 때문에, 이 때에는 설정 정보에 초기화, 소멸 메서드를 지정하는 방법을 사용해야 한다.

- 최신 스프링에서 가장 권장하는 방법이다.

public class Test {
	@PostConstruct
	public void init() {}

	@PreDestroy
	public void close() {};
}

 

참고

- 『스프링 핵심 원리 - 기본편』

'Spring' 카테고리의 다른 글

DispatcherServlet  (0) 2021.11.08
Bean Scope  (0) 2021.10.16
의존관계 주입 시 bean이 2개 이상일 때 해결 방법  (0) 2021.10.11
Lombok library가 제공하는 애노테이션  (0) 2021.10.11
다양한 의존관계 주입 방법  (0) 2021.10.11