스프링

11. 스프링 빈 생명주기 콜백

juhoyang 2024. 10. 13. 16:44

객체 초기화 작업의 필요성

네트워크 커넥션 풀, 네트워크 소켓 처럼 시작시점에 미리 필요한 연결을 하고, 애플리케이션 종료 시점에 연결을 모두 종료하는 작업을 하려면 객체 초기화 작업이 필요하다.

 

스프링 빈 콜백 기능

- 빈 객체를 생성하고 의존관계가 완료될 때 초기화 시점을 알려주는 초기화 콜백 기능 제공

- 스프링 컨테이너가 종료되기 직전에 소멸 콜백을 준다.

 

스프링 빈 life cycle 참고

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

 

 

초기화  콜백  메서드 사용말고 생성자에 다 설정하면 되지 않을까?

- 각각의 역할에 초점을 맞추어 생성과 초기화는 분리하는게 좋다.

- 생성자는 필수정보를 받아 메모리 할당해 객체 생성하는 역할 

- 초기화는 생성된 객체를 활용해 동작(커넥션과 같은)과 관련된 역할 (무거움)

 

스프링 콜백 지원 방법

1. 인터페이스

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

3. @PostConstruct, @PreDestroy 애노테이션 사용

 

테스트를 위한 NetworkClient.java

 

Test 파일

- 결과를 보면 생성자가 호출되고 url이  null이라서 결과같이 null로 나오는것을 볼수 있다.

 

1. 인터페이스

 1) InitializingBean 상속받기

 - afterPropertiesSet : 스프링 의존관계가 다 끝나고 호출해줌

 

2) DisposableBean 상속받기

- destroy : 빈이 종료될때 호출됨

 

결과

 

인터페이스 방식 단점

- 스프링 전용 인터페이스로 코드가 해당 인터페이스에 의존한다.

- 초기화, 소멸 메서스 이름 변경 불가

- 외부 라이브러리를 받은경우 코드수정이 안될경우 해당 방식 적용못함

=> 예전방식으로 거의 사용하지 않음

 

 

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

- 설정정보에 @Bean(initMethod = "init", disproyMethod = "colse") 처럼 지정

 

NetworkClient수정

 

테스트 결과

 

 

특징

- 매서드 이름을 자유롭게 지정 가능

- 스프링 빈이 스프링 코드에 의존 하지 않음

- 코드가 아닌 설정하는 방식이라 외부 라이브러리에 초기화, 종료 메서드 가능

 

distroyMethod 특징

- @Bean의 destroyMethod만 가지는 특성

- destroyMethod의 경우 소스를 열어보면 아래와 같이 default 값이 (inferred) 임

- 해당 옵션을 쓰지 않아도 보통 라이브러리에서 사용하는 close, shutdown 메서드를 자동 호출해준다. 

- 사용하지 않으려면 destroyMethod = "" 으로 설정하면 된다.

 

3. 애노테이션

- @PostConstruct : 생성 초기화 메서드에 사용

- @PreDistroy : 종료 메서드에 사용

 

NetworkClient.java

 

 

특징

- 최신 스프링에서 권장하는 방법

- 애노테이션만 붙이면 되서 편리하다.

- 외부 라이브러리는 적용하지 못해 외부 라이브러리 사용시 @Bean기능 사용해야 한다. 

- 자바 표준 라이브러리 사용으로 스프링이 아닌 다른 컨테이너에도 정상 작동한다. (jakarta.annotation.PostConstruct)

 

 

 

정리

애노테이션 방식으로 초기화를 사용하자

소스 수정이 안되는 외부라이브러리를 초기화, 종료해야할 경우 2. 빈 등록 초기화 설정 방법을 이용하자.


 

 

 

자료출처

스프링 핵심 원리 - 기본편

https://www.inflearn.com/course/%EC%8A%A4%ED%94%84%EB%A7%81-%ED%95%B5%EC%8B%AC-%EC%9B%90%EB%A6%AC-%EA%B8%B0%EB%B3%B8%ED%8E%B8/dashboard