📌 커넥션풀, 소켓같은 애플리케이션 시작시점에 필요한 연결을 미리 해둔뒤, 애플리케이션 종료시점에 모든 연결을 종료하는 작업을 하기위해선 객체의 초기화 작업 및 종료 작업이 필요하다. 이를 Spring을 통해 할수 있는 방법을 알아본다.
✔ Spring Bean Life Cycle
스프링 빈은 다음과 같은 라이프 사이클을 가진다.
- 객체생성 ▶ 의존관계 주입
따라서 의존관계를 주입한뒤 개발자가 필요한 초기화 작업을 진행해야한다. 이때 Spring은 개발자에게 의존관계 주입이 완료되었다는것을 알려주기위한 초기화 콜백 을 제공하며, bean이 소멸되기 직전 즉 스프링 컨테이너가 종료되기 직전에 소멸전 콜백 을 알려주는 기능을 제공한다.
✔ Spring의 call back
- 인터페이스를 통한 콜백
- InitializingBean 인터페이스를 implements하면 아래 코드와같은 메서드를 오버라이드 할수있다.
이 메서드를 통해 의존관계가 끝난시점에 수행할 동작을 지정해 줄수 있다.@Override public void afterPropertiesSet() throws Exception { ... }- DisposableBean 인터페이스를 implements하면 아래 코드와같은 메서드를 오버라이드 할수있다.
이 메서드를 통해 스프링 컨테이너가 종료되기 직전 수행할 동작을 지정해 줄수 있다.@Override public void destroy() throws Exception { ... }
❗ 하지만 인터페이스를 통한 콜백은 메서드의 이름을 변경할수 없으며, 스프링 전용 인터페이스에 의존하며 내가 코드를 고칠 수 없는 외부 라이브러리에 적용할 수 없다 이러한 여러 단점들로 현재는 거의 사용하지 않는다.
- 빈 등록 초기화, 소멸 메서드 지정
- 설정정보에
@Bean(initMethod = "init", destroyMethod = "close")을 추가해주면 초기화메서드는 init(사용자가 만든 메서드 이름), 소멸 메서드는 close(사용자가 만든 메서드 이름)로 간편하게 지정할수있다. - 빈 등록을통해 메서드를 지정하면 인터페이스를 통한 콜백에서의 단점들을 극복할수 있으며 추가적으로 destroyMethod의 default 값은 inferred 인데 이렇게 default값으로 놓으면 알아서 close, shutdown이라는 이름의 메서드를 호출해준다.
- 이기능은 코드를 고칠 수 없는 외부 라이브러리에도 초기화, 종료 메서드를 적용할때 대부분의 외부 라이브러리들의 종료 메서드의 이름이 close 나 shutdown 이기때문에 유용하게 사용될수 있다.
- 설정정보에
- 애노테이션 @PostConstruct, @PreDestroy
- 의존관계 주입후에 실행시킬 메서드에
@PostConstruct소멸직전에 실행시킬 메서드에@PreDestroy를 적어주면 끝난다. - 매우 편리하게 사용할수 있지만 단점이있다면 외부 라이브러리에서 사용할수 없다는 점이다.
- 의존관계 주입후에 실행시킬 메서드에
📌결론적으로 평소에는 @PostConstruct, @PreDestroy 애노테이션 을 사용하고 외부라이브러리를 초기화 또는 종료해야 한다면 빈 등록 초기화, 소멸 메서드 지정을 사용하자.
🙏Reference
'Spring' 카테고리의 다른 글
| [SpringMVC] addViewController사용할때 주의할점 (0) | 2023.04.09 |
|---|---|
| [SPRING] Bean Scope (0) | 2023.03.05 |
| [SPRING] 의존관계 자동 주입 (1) | 2023.03.05 |
| [SPRING] Component scan (0) | 2023.03.03 |
| [SPRING] Singleton (0) | 2023.02.26 |