티스토리 뷰
애플리케이션 시작 시점과 종료 시점에 초기화 작업과 절차적인 종료 작업을 위해 개발자가 그 시점들을 정확히 알아야 할 필요가 있을 수 있다. 스프링은 이러한 초기화 작업과 종료 작업을 위해 빈 생명주기의 콜백 시점을 알려주는 기능을 제공한다.
빈 생명주기: 빈이 생성되고 초기화되는 단계부터 더 이상 사용되지 않아서 소멸되는 단계까지를 의미
콜백: 빈(객체)의 생명 주기 동안 특정 시점에 호출되는 메서드
스프링 빈의 이벤트 라이프사이클:
1. 스프링 컨테이너 생성
2. 스프링 빈 생성
3. 의존관계 주입
4. 초기화 콜백
5. 사용(빈이 다른 곳에서 사용된다는 뜻)
6. 소멸전 콜백
7. 스프링 종료
package hello.core.lifecycle;
import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;
public class NetworkClient {
private String url;
public NetworkClient() {
System.out.println("생성자 호출, url = " + url);
}
public void setUrl(String url) {
this.url = url;
}
//서비스 시작시 호출
public void connect() {
System.out.println("connect: " + url);
}
public void call(String message) {
System.out.println("call: " + url + " message = " + message);
}
//서비스 종료시 호출
public void disconnect() {
System.out.println("close: " + url);
}
@PostConstruct
public void init() {
System.out.println("NetworkClient.init");
connect();
call("초기화 연결 메시지");
}
@PreDestroy
public void close() {
System.out.println("NetworkClient.close");
disconnect();
}
}
위 NetworkClient가 스프링 빈으로 등록됐다고 하자. 그러면 @PostConstruct 어노테이션이 붙은 메소드는 빈이 생성되고 의존관계 주입이 완료된 후 호출된다. @PreDestroy 어노테이션이 붙은 메소드는 빈이 소멸되기 직전에 호출된다.
따라서 위 어노테이션 두 개를 이용하면 개발자가 원하는 작업을 각각의 시점에 실행할 수 있다.
싱글톤 빈들은 스프링 컨테이너가 종료될 때 싱글톤 빈들도 함께 종료되기 때문에 스프링 컨테이너가 종료 되기 직전에 소멸전 콜백이 일어난다. 따라서 스프링 컨테이너를 만든 클래스에서 컨테이너를 종료시키는 코드를 작성하지 않으면 위 코드에서 @PreDestroy가 붙은 메소드는 호출되지 않고 실행되지 않는다.
위 방식은 외부 라이브러리에 적용하지 못한다는 단점이 있는데, 그럴 때는 @Bean과 initMethod, destroyMethod 등을 이용하여 초기화, 소멸 메소드 각각 작성하면 된다.
javax(jakarta) 패키지: 스프링에 종속적인 기술이 아니라 JSR-250 라는 자바 표준. 스프링이 아닌 다른 컨테이너에서도 동작
(스프링부트 3.0 버전 이상에선 jakarta로 변경)
참고: 김영한 스프링 핵심 기본 원리(인프런)
'Spring' 카테고리의 다른 글
| 스프링 빈 스코프란? (0) | 2023.08.18 |
|---|---|
| 롬북(Lombok)의 @RequiredArgsConstructor 기능 (0) | 2023.08.16 |
| 컴포넌트 스캔 (0) | 2023.08.15 |
| @Configuration의 역할과 싱글톤 (0) | 2023.08.14 |
| 싱글톤 패턴과 스프링 컨테이너 (0) | 2023.08.14 |