티스토리 뷰

Spring

빈 생명주기와 콜백

shield 2023. 8. 17. 16:48

애플리케이션 시작 시점과 종료 시점에 초기화 작업과 절차적인 종료 작업을 위해 개발자가 그 시점들을 정확히 알아야 할 필요가 있을 수 있다. 스프링은 이러한 초기화 작업과 종료 작업을 위해 빈 생명주기의 콜백 시점을 알려주는 기능을 제공한다.

 

빈 생명주기: 빈이 생성되고 초기화되는 단계부터 더 이상 사용되지 않아서 소멸되는 단계까지를 의미

콜백: 빈(객체)의 생명 주기 동안 특정 시점에 호출되는 메서드

 

스프링 빈의 이벤트 라이프사이클:

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로 변경)

 

참고: 김영한 스프링 핵심 기본 원리(인프런)

https://www.inflearn.com/course/%EC%8A%A4%ED%94%84%EB%A7%81-%ED%95%B5%EC%8B%AC-%EC%9B%90%EB%A6%AC-%EA%B8%B0%EB%B3%B8%ED%8E%B8/dashboard

'Spring' 카테고리의 다른 글

스프링 빈 스코프란?  (0) 2023.08.18
롬북(Lombok)의 @RequiredArgsConstructor 기능  (0) 2023.08.16
컴포넌트 스캔  (0) 2023.08.15
@Configuration의 역할과 싱글톤  (0) 2023.08.14
싱글톤 패턴과 스프링 컨테이너  (0) 2023.08.14
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2026/03   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31
글 보관함