본문 바로가기
서버/스프링

[Spring] 빈 생명주기 콜백

by 베어 그릴스 2022. 8. 28.
320x100

*본 게시글은 김영한님 스프링 핵심 원리 기본편을 보고 이해한 내용을 바탕으로 정리한 글입니다.

 

 

스프링 빈 생명주기


스프링 빈은 간단하게 다음과 같은 라이프사이클을 가진다.

 

1. 객체 생성

2. 의존관계 주입

 

스프링 빈은 객체를 생성하고 의존관계를 모두 주입하고 나서야 필요한 데이터의 준비가 완료된다.

 

개발자가 의존관계 주입이 모두 완료된 시점을 어떻게 알 수 있을까?

 

스프링은 의존관계 주입이 완료되면 스프링 빈에게 콜백 메서드를 통해서 초기화 시점을 알려주는 다양한 기능을 제공한다.

 

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

 

1. 스프링 컨테이너 생성

2. 스프링 빈 생성

3. 의존관계 주입

4. 생성 후 콜백 

5. 사용

6. 소멸 전 콜백 

7. 종료

 

*참고

생성자는 파라미터를 받고, 메모리를 할당해서 객체를 생성하는 책임을 가진다.

반면 초기화는 이렇게 생성된 값들을 활용해서 무거운 동작을 수행한다. ex)외부 커넥션 연결 등

즉, 생성자 안에서 생성과 동시에 초기화 하는 것보다는 생성과 초기화를 명확하게 나누는 것이 유지보수 관점에서 좋다.

즉, 스프링 빈 생성 후 콜백 메서드가 실행되면 그때 초기화를 처리하면 된다.

 

 

빈 생명주기 콜백의 3가지 방법

 

1. 인터페이스(InitializingBean, DisposableBean)

2. 설정 정보에 초기화 메서드, 종료 메서드 지정

3. @PostConstruct, @PreDestroy 애노테이션

 

1. 인터페이스

스프링 빈으로 등록할 클래스를 스프링에서 제공하는 InitializingBean인터페이스와 DisposableBean 인터페이스를 상속하게 하여 afterPropertiesSet() 메서드와 destroy() 메서드를 통해 콜백을 받는 방법이다.

 

InitializingBean이 afterPropertiesSet()로 성 후 콜백을 지원하고, DisposableBean이 destroy()로 소멸 전 콜백을 지원한다.

 

즉, InitializingBean을 상속 받은 빈에서 afterPropertiesSet() 메서드 내부에 코드를 작성하면 해당 코드들이 의존관계 주입 후 즉시 실행되고, 

 

DisposableBean을 상속 받은 빈에서 destroy() 메서드 내부에 코드를 작성하면 해당 코드들이 소멸 되기 직전에 실행된다.

 

 

단점 :

  • 해당 코드가 스프링 전용 인터페이스에 의존한다.
  • 초기화, 소멸 메서드의 이름을 변경할 수 없다.
  • 외부 라이브러리 사용 시 적용할 수 없다

이러한 단점 때문에 지금은 거의 사용되지 않는다.

 

 

2. 설정 정보에 초기화 메서드, 종료 메서드 지정

@Configuration
public class AppConfig {

    @Bean(initMethod = "init", destroyMethod = "close")
    public SpringBean springBean(){
        return new SpringBean();
    }
}

위와 같이 수동으로 스프링 빈을 등록했을 때, @Bean(initMethod = "init", destroyMethod = "close") 처럼 사용하여, 생성 후 즉시 실행될 메서드와 소멸 메서드를 직접 지정할 수 있다.

 

이렇게 등록하여 메서드 이름을 자유롭게 변경할 수 있고, 스프링 코드에 의존하지 않을 수 있으며 코드를 고칠 수 없는 외부 라이브러리에도 초기화 종료 메서드를 적용할 수 있다.

 

*참고 :

destroyMethod를 지정하지 않으면 기본값이 (inferred)로 되어있어 close, shutdown 등의 이름의 종료 메서드가 빈에 있다면 자동으로 추론하여 호출해준다. 만약, 이 기능을 사용하고 싶지 않다면 destroyMethod = ""라고 지정해야한다.

 

 

3. @PostConstruct, @PreDestroy 애노테이션

등록할 스프링 빈 내부의 생성 후 즉시 초기화 메서드에 @PostConstruct, 종료 직전 실행 시킬 메서드에 @PreDestroy를 붙이면 끝이다.

 

최신 스프링에서 가장 권장하는 방법이고, 매우 편리하다.

스프링에 종속적이지 않고 자바 표준 기술이다.

 

*외부 라이브러리에는 적용시키지 못한다. 2번 방법을 사용하도록 하자.

728x90