Spring boot

[기본] 빈 생명주기 콜백

메모


tcp(전송 제어 프로토콜)
, 핸드셰이킹 오래걸려서 미리 데이터베이스랑 커넥션함

 

 

ApplicationContext <- ConfigurableApplicationContext <- AnnotationConfigApplicationContext

상속관계

ConfigurableApplicationContext 밑부터 close() 메소드 있음

 

인터페이스를 상속하면 콜백함수를 사용할수있다 ?

인터페이스 자체 로직이 들어있지 않으면 불가능하지 않나?

인터페이스에 로직이 들어가는것은 자바 8부터 가능하다고 한다.

그렇지만 InitializingBean 내부에 구현부는 없었다. 어떻게 동작하는것인지 모를 ...

+) 클래스 다중상속을 막은것은 다이아몬드 패턴때문이다.

 


빈 생명주기 콜백 시작

 

DB 커넥션 풀, 네트워크 소켓처럼 애플리케이션 시작시점에 필요한 연결을 미리 해두고, 종료시점에 연결을 종료하는 작업을 진행해해야한다.

어떻게 할 수 있을까?

 

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

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

 

생성자를 통해 의존관계를 주입하면 생성자에서 초기화를 진행해도 되지만, setter주입같이 의존관계주입을 따로 진행하는 경우가 있다.

이런 경우 의존관계 주입이 완료되면 스프링 빈에게 콜백 메서들 통해 초기화 시점을 알려준다. 종료도 같다.

 

참고) 객체의 생성과 초기화를 분리하자.

생성자는 객체를 생성하는 책임을 가지며 초기화는 생성된 값을 활용해 커넥션을 연결하는 등의 동작을 수행한다.

따라서 두 부분을 명확하게 나누는 것이 유지보수측면에서 좋다. 초기화 작업이 단순하면 생성자에서 처리하는 것이 더 좋을수도 있다.

 

참고) 싱글톤 빈들과 달리 생명주기가 짧은 빈들은 컨테이너와 무관하게 빈이 종료되기 전에 소멸전 콜백이 일어난다.

 

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

 


1. 인터페이스 InitializingBean, DisposableBean

 

InitializingBean, DisposableBean인터페이스 를 상속받아 afterPropertiesSet(), destroy() 메서드를 오버라이드한다.

메서드 내부에서 초기화 작업, 종료 전 작업을 진행할 수 있다.

 

특징:

해당 코드가 스프링 전용 인터페이스에 의존하며,

초기화/소멸 메서드의 이름이 지정되어있다.

코드를 고칠 수 없는 외부 라이브러리에 적용할 수 없다.

 

결론: 비추천

 


2. 빈 등록 초기화, 소멸 메서드 지정

 

수동 빈 등록 시 @Bean(initMethod = "init", destroyMethod = "close") 로 초기화, 소멸 메서드를 지정할 수 있다.

 

특징:

메서드 작명이 자유롭다.

설정 정보에서 지정하기 때문에 스프링 빈이 (예제의 NetworkClient) 스프링 코드에 의존하지 않는다.

외부 라이브러리의 초기화, 종료 메서드 지정 가능

종료 메서드를 추론해준다. 디폴트 값이 "(inferred)"로 close, shutdown 등을 이름으로 가진 메서드를 자동 호출해준다.

 


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

 

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

 

특징:

패키지를 보면 javax.annotation.PostConstruct 이다. 즉 스프링의 종속적인 기술이 아닌 자바 표준이라는 뜻.

컴포넌트 스캔과 잘 어울린다.

외부 라이브러리에 적용할 수 없다. 외부 라이브러리엔 2번 기능을 사용하자.

 

결론: 가장 추천

 

'Spring boot' 카테고리의 다른 글

[HTTP] 인터넷 네트워크  (2) 2021.09.22
[기본] 빈 스코프  (0) 2021.08.24
[기본] 의존관계 자동 주입  (2) 2021.08.17
[기본] 컴포넌트 스캔  (0) 2021.08.16
[기본] 싱글톤 컨테이너  (0) 2021.08.12