Backend/Spring

[Spring] 스프링의 빈(Bean) 생명주기 콜백의 개념 및 예제

Chung-A 2020. 10. 24. 17:21

[Spring] 스프링의 빈(Bean) 생명주기 콜백의 개념 및 필요성

 

1. 빈 생명주기 콜백의 필요성

 

보통 프로젝트를 하다보면 데이터베이스 커넥션 풀과 같이

애플리케이션 시작 시점에 특정 작업을 수행하고 종료되는 시점에도 작업을 해야하는 경우가 있다.

 

이럴 때 빈 생명주기를 알고 있다면 유용하게 활용할 수 있다.

 

 

 

 

 

 


2. 빈 생명주기 필요한 경우의 예제

 

실제로 간단한 예제를 통해 필요한 경우를 예시로 생각해보자.

다음은 네트워크를 연결하는 경우의 예시이다.

(실제로 연결하지는 않고 간단하게 로그만 찍어보았다)

 

public class NetworkClient {

    private String url;

    public NetworkClient() {
        System.out.println("생성자 호출, url: "+url);
        connect();
        call("초기화 메시지");
    }

    public void setUrl(String url) {
        this.url = url;
    }

    // 애플리케이션 시작시 호출.
    public void connect() {
        System.out.println("연결할 url = " + url);
    }

    //서비스중에 호출.
    public void call(String message) {
        System.out.println("url: "+url+"/message = " + message);
    }

    //서비스 종료시 호출.
    public void disconnect() {
        System.out.println("서비스 종료!");
    }
}

 

 

 

이렇게 객체를 만들어보고 아래와 같이 테스트를 한번 해보기로 한다.

public class BeanTest {

    @Test
    public void beanTest() {
        ConfigurableApplicationContext ac = new AnnotationConfigApplicationContext(Config.class);
        NetworkClient client = ac.getBean(NetworkClient.class);
        ac.close();
    }

    @Configuration
    static class Config {
        @Bean
        public NetworkClient networkClient() {
            NetworkClient networkClient = new NetworkClient();
            networkClient.setUrl("http://test.com");
            return networkClient;
        }

    }
}

위의 코드를 돌리면 당연히 아래와 같이 로그가 찍힌다.

 

위의 결과에서 볼 때 어찌보면 당연한 이야기지만

객체를 생성할 때는 url이 없고 생성이 끝나고 외부에서 setter를 통해 데이터를 주입받아야 url이 생기게 된다.

 

스프링의 빈은 기본적으로 객체생성->의존관계 주입 과 같은 라이프사이클을 가진다.

 

객체를 생성하고 의존관계 주입이 끝난 다음에야 데이터를 사용할 수 있는 준비가 완료되고 따라서 초기화 작업은 url이 있는 상태, 즉 의존관계 주입이 끝난 다음에 호출해야 한다.

 

그러면 여기서 우리가 의존관계 주입이 끝나는 시점을 어떻게 알 수 있을까?

이 때 스프링 빈의 생명주기를 알고 콜백을 알면 유용하게 활용가능하다.

 

스프링 빈의 라이프 사이클은 다음과 같이 진행된다.

 

스프링 컨테이너 생성-> 스프링 빈 생성(Constructor Injection)-> 의존관계 주입(Setter Injection 및 Field Injection이 일어남)-> 초기화 콜백 사용-> 소멸전 콜백->스프링 종료

 

여기서 중요한 부분은 콜백부분이라고 할 수 있다.

 

  • 초기화 콜백: 빈이 생성되고, 빈의 의존관계 주입이 완료된 후 호출
  • 소멸전 콜백: 빈이 소멸되기 직전에 호출

그렇다면 이 콜백은 구체적으로 어떻게 사용하면 좋을까?

 

스프링은 크게 3가지 방법으로 빈 생명주기 콜백을 지원한다.

  • 인터페이스(InitializingBean, DisposableBean)
  • 설정 정보에 초기화 메서드, 종료 메서드 지정
  • @PostConstruct, @PreDestory 애노테이션 지원

각각에 대한 사용방법은 다음 포스팅에서 알아보도록 한다.

 

스프링 빈(Bean)을 초기화 및 종료하는 3가지 방법(Bean 생명주기 콜백)

 

[Spring]스프링 빈(Bean)을 초기화 및 종료하는 3가지 방법(Bean 생명주기 콜백)

[Spring]스프링 빈(Bean)을 초기화 및 종료하는 3가지 방법(Bean 생명주기 콜백) 1. 인터페이스 InitializingBean, DisposableBean 이용하기 이 방법은 인터페이스를 활용하여 빈의 생명주기를 관리하는 방법

chung-develop.tistory.com

 


Reference

이 포스팅은 아래의 강좌를 참고하여 만들어졌습니다.


  • 스프링 핵심 원리-기본편 

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

 

스프링 핵심 원리 - 기본편 - 인프런

스프링 입문자가 예제를 만들어가면서 스프링의 핵심 원리를 이해하고, 스프링 기본기를 확실히 다질 수 있습니다. 초급 프레임워크 및 라이브러리 Back-End Spring 객체지향 온라인 강의 직접 자바

www.inflearn.com