Spring

[Spring] 빈 생명주기(Lifecycle) 콜백 - 3가지 방법

cornarong 2021. 7. 6. 17:24

Bean Life Cycle Process Flow / https://www.geeksforgeeks.org/bean-life-cycle-in-java-spring/

Spring Container은 Bean객체들의 생성과 소멸을 관리한다.

-> 생명주기(Lifecycle)을 관리한다.

 

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

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

(생성자주입은 예외 : 객체를 만들 때 파라미터로 빈이 미리 들어와야 하기 때문에)

 

스프링 빈의 이벤트 라이프사이클 (싱글톤)

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

 

* 초기화 콜백 : 빈이 생성되고, 빈의 의존관계 주입이 완료된 후 호출

* 소멸전 콜백 : 빈이 소멸되기 직전에 호출

 

* 객채의 생성과 초기화를 명확하게 분리하는 것이 좋다.

객체 생성은 메모리에 할당하는 것 까지만, 최소 필요한 데이터를 셋팅 하는것 까지만 한다.

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

(초기화 작업이 내부 값들만 약간 변경하는 정도로 단순한 경우에는 생성자에서 한번에 다 처리하는 것도 좋다)

 

 

* 생명주기 콜백 3가지 방법

 

1. 인터페이스 사용 - InitializingBean, DesposableBean

InitializingBean 인터페이스를 상속받아 afterPropertiesSet() 메서드를 사용

-> 초기화 후 호출

DesposableBean 인터페이스를 상속받아 destroy() 메서드를 사용

-> 스프링 컨테이너가 내려가고 종료되기 전에 호출

afterPropertiesSet() , destroy() 사용

-> 인터페이스를 사용하는 초기화, 종료 방법은 스프링 초장기에 나온 방법들이다.

지금은 거의 사용하지 않는다.


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

@Bean에 initMethoddestoryMethod를 메서드명으로 등록한 후 사용initMethod = "init" 등록 -> 초기화 후 호출destoryMehhod = "close" 등록 -> 스프링 컨테이너가 내려가고 종료되기 전에 호출

설정 정보에 초기화 메서드, 종료 메서드 지정
메서드 이름을 자유롭게 설정 가능

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


3. @PostConstruct, @PreDestory 어노테이션 지원

- 직접 생성한 메서드(init, close) 상단에 @PostConstruct, @PreDestory 어노테이션 설정

 

JRE-250 자바 표준

스프링에 종속적인 기술이 아니라 JRE-250라는 자바 표준이다. 스프링이 아닌 다른 컨테이너에서도 동작

init() -> 초기화 후 호출

close() -> 스프링 컨테이너가 내려가고 종료되기 전에 호출

@PostConstruct, @PreDestory

-> 최신 스프링에서 가장 권장하는 방법이다.


정리 :

1. @PostConstruct, @PreDestory 어노테이션을 사용하자.

2. 코드를 고칠 수 없는 외부 라이브러리를 초기화, 종료해야 한다면 2번을 사용하자.

 

참고 및 출처 :

https://www.inflearn.com/ - 스프링 핵심 원리(김영한)