객체 초기화 작업의 필요성
네트워크 커넥션 풀, 네트워크 소켓 처럼 시작시점에 미리 필요한 연결을 하고, 애플리케이션 종료 시점에 연결을 모두 종료하는 작업을 하려면 객체 초기화 작업이 필요하다.
스프링 빈 콜백 기능
- 빈 객체를 생성하고 의존관계가 완료될 때 초기화 시점을 알려주는 초기화 콜백 기능 제공
- 스프링 컨테이너가 종료되기 직전에 소멸 콜백을 준다.
스프링 빈 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. 빈 등록 초기화 설정 방법을 이용하자.
자료출처
스프링 핵심 원리 - 기본편
'스프링' 카테고리의 다른 글
12. 빈 스코프 (0) | 2024.10.19 |
---|---|
10-2. 다양한 의존관계 주입방법 (애노테이션을 만들기, List Map으로 받기 (0) | 2024.10.19 |
10. 다양한 의존관계 주입방법 (0) | 2024.10.07 |
9. 컴포넌트 스캔과 의존관계 자동 주입 (0) | 2024.10.05 |
8. BeanFactory, ApplicationContext 의 이해 (BeanDefinition포함) (0) | 2024.09.24 |