이번 글에서는 빈의 생명주기 콜백에 대해서 알아보려고 한다.
애플리케이션 구동 환경에서 원하는 객체를 제대로 사용하려면 생명주기에 대해서는 꼭 알아둬야 한다.
시작 지점에 DB 연결작업이나, 종료 지점에 연결 종료 작업 등은 코딩에서 필수이다.
이전에 안드로이드 앱 코딩 할 때도 생명주기는 매우 중요했었던 기억이 있다.
이번에는 스프링 빈에 대한 생명주기에 대해 자세히 알아 볼 것이다.
스프링 빈의 이벤트 생명주기
스프링 컨테이너 생성 => 스프링 빈 생성 => 의존관계 주입 => 초기화 콜백 => 사용 => 소멸 전 콜백 => 스프링 종료
우리가 스프링 빈을 제대로 사용하려면 의존관계 주입까지 끝난 상태여야만 사용할 수 있게 된다.
이런 상황을 우리는 콜백 메서드를 통해서 알 수 있고, 이 콜백들에 대해 알아 볼 예정이다.
일단 3가지 방법으로 나뉘어 진다.
1. 인터페이스를 사용 (initailizingBean, DisposableBean)
public class NetworkClient implements InitializingBean, DisposableBean {
@Override
public void afterPropertiesSet() throws Exception {
System.out.println("afterPropertiesSet 호출!");
} // 초기화 메서드
@Override
public void destroy() throws Exception {
System.out.println("destroy 호출!");
} // 종료 메서드
}
첫 번째로는 인터페이스를 이용한 방법이다.
방법이 방법인 만큼 implements를 이용해 상속을 받아와 Override한 메소드를 구현해주면 된다.
이 방법은 외부 라이브러리에서 사용할 수 없고, 메서드 이름을 직접 지정하지 못한다는 단점이 존재한다.
2. 빈 설정 정보에 초기화 메서드, 종료 메서드 작성
@Bean(initMethod = "init", destroyMethod = "close")
두 번째로는 빈 설정 정보에 초기화 메서드와 종료 메서드를 작성하는 방법인데
위 코드에서 변경하는 것이 아닌 말그래도 빈으로 넣을 객체 설정정보에 넣어야만 한다.
이는 아래에 실행코드에서 한 눈에 볼 수 있다.
이 방법은 외부 라이브러리에서도 사용가능 하고 이름도 자유롭게 사용가능하지만 살짝 귀찮은 방법이기는 하다.
3. 어노테이션을 사용 (@PostConstruct, @PreDestroy)
public class NetworkClient {
@PostConstruct
public void init() {
System.out.println("init 호출!");
} // 초기화 메서드
@PreDestroy
public void close() {
System.out.println("close 호출!");
} // 종료 메서드
}
세 번째로는 어노테이션을 이용한 방법이다.
스프링에서 가장 권장하는 방법이며, 심지어 자바표준 기능이기에 다른 컨테이너에서도 이용가능하다...!
어노테이션을 이용하는 만큼 컴포넌트 스캔 같은 기능과도 잘 어울리지만 외부 라이브러리에서는 사용하지 못하는 단점이 있다.
실행을 위한 테스트 코드
public class BeanLifeCycleTest {
public void lifeCycleTest() {
ConfigurableApplicationContext ac = new AnnotationConfigApplicationContext(LifeCycleConfig.class);
NetworkClient client = ac.getBean(NetworkClient.class);
ac.close();
}
@Configuration
static class LifeCycleConfig {
// 1번과 3번
@Bean
public NetworkClient networkClient() {
NetworkClient networkClient = new NetworkClient();
return networkClient;
}
// 2번
@Bean(initMethod = "init", destroyMethod = "close") // 설정정보에 초기화 메서드와 종료 메서드 이름 작성
public NetworkClient networkClient() {
NetworkClient networkClient = new NetworkClient();
return networkClient;
}
}
public static void main(String[] args) {
BeanLifeCycleTest bl = new BeanLifeCycleTest();
bl.lifeCycleTest();
}
}
이렇게 빈 생명주기 콜백에 대해서 알아보았다.
우리는 주로 3번인 어노테이션 방법을 애용하면 되고,
외부 라이브러리에서 사용해야하는 경우에는 2번인 빈 설정정보를 통해 설정해서 쓰면 될 것 같다.
다음에는 빈 스코프에 대해서 정리할 것 같다.
참고 -
'Spring' 카테고리의 다른 글
[Spring MVC] 웹 애플리케이션 (0) | 2022.04.25 |
---|---|
[Spring 핵심 원리] 빈 스코프와 DL(Dependency Lookup) (0) | 2022.03.20 |
[Spring 핵심 원리] 의존관계 주입에 대하여 (생성자 주입과 Lombok) (0) | 2022.03.20 |
[Spring 핵심 원리] 싱글톤 패턴 (0) | 2022.03.20 |
[Spring 핵심 원리] 수동 빈 등록을 통한 의존관계 주입 (0) | 2022.03.20 |