bean 생명주기
-
데이터베이스 커넥션 풀이나, 네트워크 소켓처럼 애플리케이션 시작 시점에 필요한 연결을 미리 해두고, 애플리케이션 종료 시점에 연결을 모두 종료하는 작업을 진행하려면, 객체의 초기화와 종료 작업이 필요하다.
-
스프링 빈의 이벤트 라이프사이클 : 스프링 컨테이너 생성 -> 스프링 빈 생성(객체 생성) -> 의존관계 주입 -> 초기화 콜백 사용 -> 소멸전 콜백 -> 스프링 종료
-
초기화 콜백 : 빈이 생성되고, 빈의 의존관계 주입이 완료된 후에 호출
-
소멸전 콜백 : 빈이 소멸되기 직전에 호출
-
cf) 객체의 생성과 초기화를 분리하자
- 생성자는 파라미터를 받고 메모리를 할당해서 객체를 생성하고, 초기화는 이러한 객체의 생성된 값을 활용해서 외부 커넥션을 연결하는 등 기능을 수행한다. 객체지향의 단일책임 원칙에 의해 각각의 역할을 나누는 것이 유지보수의 관점에서도 좋다.
bean 생명주기 콜백
1) 인터페이스 InitializingBean, DisposableBean
- bean에 등록할 객체에 InitializingBean, DisposableBean를 상속받게 한다.
- InitializingBean은 afterPropertiesSet() 메서드로 초기화 지원
- DisposableBean은 destroy() 메서드로 소멸 지원
- 내가 코드를 고칠 수 없는 외부 라이브러리에 적용할 수 없다.
- 이 인터페이스는 스프링 전용 인터페이스이다. 스프링에 의존적
2) 빈 등록 초기화, 소멸 메서드 지정
- 설정 정보에 @Bean(initMethod = "init", destroyMethod = "close") 처럼 초기화, 소멸 메서드를 지정
- destroyMethod는 기본값이 (inferred) 추론으로 등록되어 있어서, 따로 지정하지 않아도 close 또는 shutdown으로 명시된 메서드를 자동으로 호출해준다
- 추론기능을 사용하고 싶지 않으면 destroyMethod=""처럼 공백을 지정해준다.
3) @PostConstruct, @PreDestroy
- 초기화 메서드에 @PostConstruct, 소멸전 메서드에 @PreDestroy 어노테이션을 붙여준다.
- 최신 스프링에서 가장 권장하는 기술이며, 자바 표준 기술이기에 스프링 이외의 컨테이너에서도 동작한다.
- 외부라이브러리에는 적용할 수 없다.