둘셋 개발!

[spring] 빈 생명주기 콜백 본문

SPRING/spring 기본

[spring] 빈 생명주기 콜백

23 2022. 3. 14. 18:09

빈 생명주기 콜백을 해야하는 이유

데이터 커넥션 풀이나 네트워크 소캣처럼 애플리케이션 시작 시점에 필요한 연결을 미리 해두고,

애플리케이션 종료 시점에 연결을 모두 종료하는 작업을 진행하려면

객체의 초기화와 종료 작업이 필요하다.

 

스프링 빈은 객체를 생성하고 의존관계 주입이 다 끝난 다음에야, 초기화 작업 준비가 완료된다!

그리고 스프링은 스프링 컨테이너가 종료되기 전에 소멸 콜백을 준다!

 

✔️스프링 빈의 라이프 사이클

스프링 컨테이너 생성 -> 스프링 생성 -> 의존관계 주입 -> 초기화 콜백 -> 애플리케이션 동작
-> 소멸 전 콜백 -> 스프링 종료

 

🧐스프링 빈의 객체 생성 시점에 의존관계주입과 초기화 작업을 한꺼번에 하면 안되나???

-> 객체의 생성과 초기화는 분리하는 것이 좋다. 초기화는 외부 커넥션을 연결하는 등의 무거운 동작을 수행하기 때문에, 생성자 안에서 무거운 초기화 작업을 같이 하는 것 보다 명확하게 분리하는 것이 유지보수 관점에서 좋다


빈 생명주기 콜백 방법

초기화 메서드, 종료 메서드에 @PostConstruct, @PreDestory 애노테이션을 붙이면 된다

예시)

//초기화
@PostConstruct
public void init() {
	System.out.println("NetworkClient.init"); connect();
	call("초기화 연결 메시지");
}

//종료
@PreDestroy  
public void close() {
    System.out.println("NetworkClient.close");
    disConnect();
}

 

만약 코드를 고칠 수 없는 외부 라이브러리를 초기화 종료 해야 한다면,  @Bean의 initMethod, destroyMethod 사용

예시)

@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 속성에 초기화 메서드명을 쓰면 된다.

➡️ destroyMethod 속성에 종료 메서드명을 쓰면된다.

 

그리고 종료 메서드에는 추론기능이 있다.

destroyMethod의 기본값이 (inferred)이 등록되어 있는데, 이 추론기능은 close, shutdown이라는 메서드명을 자동으로 호출해준다.

 

 

(참고 : 인프런 김영한 강사님 - 스프링 핵심원리 - 기본편 )

'SPRING > spring 기본' 카테고리의 다른 글

[spring] 의존관계 주입  (0) 2022.03.13
[spring] 컴포넌트 스캔  (0) 2022.03.13
[spring] 싱글톤 컨테이너  (0) 2022.03.10
[spring] 스프링 컨테이너와 스프링 빈  (0) 2022.03.09