본문 바로가기
Spring

스프링 핵심 원리 기본편 - 챕터 8. 빈 생명주기 콜백

by mingutistory 2023. 3. 26.
728x90

빈 생명주기 콜백

객체 생성 -> 의존관계 주입

스프링은 의존관계 주입 완료 후, 스프링 컨테이너 종료 전 스프링 빈에게 콜백 메서드를 통해 초기화 시점을 알려줌

 

이벤트 라이프사이클

스프링 컨테이너 생성

스프링 빈 생성

의존 관계 주입

초기화 콜백 사용: 빈 생성, 의존 관계 주입 완료 후 호출

소멸전 콜백: 빈 소멸 직전 호출

스프링 종료

 

객체 생성과 초기화를 분리하자.

생성자 - 필수 파라미터 정보 받아 메모리 할당. 객체 생성.

초기화 - 생성된 값을 활용 후 외부 커넥션을 연결함.

 

무거운 초기화 작업은 분리 시켜서 빼는 것 유지보수 관점에서 좋음. 너무 간단한 경우 생성자에서 사용 할 수 있겠지만 객체 생성시에 초기화 하는 것이 아니라 사용 시에 초기화 하는 느낌으로 사용.

 

인터페이스 InitializingBean, DisposableBean

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

afterPropertiesSet(): 초기화 - 주입 완료 후 호출

destory():소멸 - 스프링 컨테이너 종료 후 호출

 

인터페이스에 구현되어 있어 이름 변경 불가능.

스프링 초창기에 나온 방법들. 많이 사용하지 않음.

 

빈 등록 초기화, 소멸 메서드

@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를 지정 해 준다.

메서드 이름을 자유롭게 줄 수 있고 스프링에 의존하지 않음.

설정 정보를 사용하기 때문에 코드를 고칠 수 없는 외부 라이브러리에서도 초기화, 종료 메서드를 적용 할 수 있음.

 

destoryMethod 속성에는 아주 특별한 기능이 있어서 기본 값이 (inferred)로 추론으로 등록 되어 있음. -- destoryMethod="" 공백으로 지정해서 호출되지 않도록 지정해서 사용 할 수도 있음.

close, shutdwon이라는 메서드를 자동 호출 해줌. 

 

애노테이션 @PostConstruct, @PreDestroy

결론: 이 방법을 쓰자!

public class NetworkClient {
 private String url;
 
 public NetworkClient() {
 	System.out.println("생성자 호출, url = " + url);
 }
...

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

컴포넌트 스캔과 잘 어울리는 최신 스프링에서 가장 권장하고 javax 패키지에 들어가 있는 자바 표준 기능임. 

유일한 단점은 외부 라이브러리에는 적용하지 못하는 것이라 그럴 경우에는 위에서 배운 방법들을 사용하자.

300x250

댓글