애플리케이션 시작 시점에 필요한 연결을 미리 해두고 종료 시점에 연결을 종료하는 작업에 객체의 초기화와 종료 작업이 필요
스프링 빈의 라이프 사이클 = 객체 생성 -> 의존관계 주입
개발자는 의존 관계 주입까지 모두 끝난 후에야 데이터 사용 가능한데 끝난 시점을 어떻게 알 수 있을까?
스프링 컨테이너 생성
→ 스프링 빈 생성
→ 의존 관계 주입
→ 초기화 콜백
→ 사용
→ 소멸전 콜백
→ 스프링 종료
스프링은 의존 관계 주입 시 스프링 빈에게 콜백 메서드를 통해 초기화 시점을 알려주고, 종료 직전에 소멸 콜백을 줌.
❓생성자 주입을 사용하면 편리하지 않을까??
객체 생성하는 역할과, 초기화하는 역할을 분리하는 것이 단일 책임 원칙(OCP)에 적합하며 유지 보수 관점에서 용이하다.
InitializingBean : afterPropertiesSet() 초기화 메서드
DisposableBean : destory() 소멸 메서드
❌ 단점
→ 자바 같은 경우 클래스에 인터페이스를 구현하면 되지만, build.gradle같은 외부 라이브러리들은 이미 컴파일된 상태이므로 코드 변경 불가능
거의 사용하지 않음!!
빈 수동 등록 시 @Bean(initMethod = "init", destroyMethod = "close")
초기화, 소멸 메서드 지정
👍장점
초기화 메서드에 @PostConstruct, 종료 메서드에 @PreDestroy 메서드를 붙힌다.
💡정리
- 초기화 시 @PostConstruct, 종료 시 @PreDestory 애노테이션을 사용한다.
- 코드를 고칠 수 없는 외부 라이브러리를 초기화, 종료할 경우 initMethod, destroyMethod를 설정해준다.