스프링 핵심 원리(8) - 빈 생명주기 콜백

박정민·2021년 2월 21일
0

spring

목록 보기
16/16

1. 빈 생명주기 콜백

객체의 초기화 작업

  • 스프링 빈은 객체 생성 -> 의존관계 주입 후 초기화 작업을 호출할 수 있다.

  • 개발자가 의존관계 주입이 완료된 시점을 어떻게 알 수 있을까?
    • 스프링은 의존관계 주입이 완료되면 스프링 빈에게 콜백 메서드를 통해 초기화 시점을 알려주는 다양한 기능을 제공
    • 스프링은 스프링 컨테이너가 종료되기 직전에 소멸 콜백을 통해 안전하게 종료하는 기능 제공

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

  • 스프링 컨테이너 생성 -> 스프링 빈 생성 -> 의존관계 주입 -> 초기화 콜백 -> 사용 ->
    소멸전 콜백 -> 스프링 종료


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

2. 스프링이 제공하는 빈 생명주기 콜백

(1) 인터페이스 InitializingBean, DisposableBean

public class NetworkClient implements InitializingBean, DisposableBean {
    @Override
    public void afterPropertiesSet() throws Exception {
        connect();
        call("초기화 연결 메시지");
    }

    @Override
    public void destroy() throws Exception {
        disconnect();
    }
}
  • InitializingBeanafterPropertiesSet() 메서드로 초기화를 지원한다.

  • DisposableBeandestroy()메서드로 소멸을 지원한다.


  • 동작과정
    • 초기화 콜백을 받으면 afterPropertiesSet()메서드가 호출됨
    • 소멸전 콜백을 받으면 destroy()메서드가 호출됨

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

  • 참고
    • 지금은 이 방법을 거의 사용하지 않는다.

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

  • 설정 정보를 사용하도록 변경
public class NetworkClient {
    public void init() {
        System.out.println("NetworkClient.init");connect();
        call("초기화 연결 메시지");
    }

    public void close() {
        System.out.println("NetworkClient.close");
        disConnect();
    }
}
  • 설정 정보에 초기화, 소멸 메서드 지정
@Configuration
static class LifeCycleConfig {
    
    @Bean(initMethod = "init", destroyMethod = "close")
    public NetworkClient networkClient() {
        NetworkClient networkClient = new NetworkClient();
        networkClient.setUrl("http://hello-spring.dev");
        return networkClient;
    }
}
  • 동작과정
    • 초기화 콜백을 받으면 설정정보에 initMethod에 해당하는 메서드(init) 호출
    • 소멸전 콜백을 받으면 설정정보에 initMethod에 해당하는 메서드(close) 호출

  • 특징
    • 메서드 이름을 자유롭게 변경할 수 있다.
    • 스프링 빈이 스프링 코드에 의존하지 않는다.
    • 코드가 아니라 설정 정보를 사용하기 때문에 코드를 고칠 수 없는 외부 라이브러리에도
      초기화, 종료 메서드를 적용할 수 있다.

(3) @PostConstruct, @PreDestroy

public class NetworkClient {
    @PostConstruct
    public void init() {
        System.out.println("NetworkClient.init");
        connect();
        call("초기화 연결 메시지");
    }
    
    @PreDestroy
    public void close() {
        System.out.println("NetworkClient.close");
        disConnect();
    }
}
  • 동작과정
    • 초기화 콜백을 받으면 @PostConstruct가 붙은 메서드 호출
    • 소멸전 콜백을 받으면 @PreDestroy가 붙은 메서드 호출

  • 특징
    • 최신 스프링에서 가장 권장하는 방법
    • 애노테이션만 붙이면 되므로 매우 편리하다
    • 유일한 단점은 외부 라이브러리에 적용할 수 없다.
profile
화이팅!

0개의 댓글

관련 채용 정보