스프링 컨테이너의 라이프사이클
컨테이너 초기화 -> 객체 사용 -> 컨테이너 종료
https://velog.io/@binary_j/%EB%B9%88-%EB%9D%BC%EC%9D%B4%ED%94%84%EC%82%AC%EC%9D%B4%ED%81%B4
스프링 컨테이너는 빈 객체의 라이프 사이클을 관리한다.
빈 객체의 라이프 사이클은 다음과 같다.
객체 생성 -> 의존 설정 -> 초기화 -> 소멸
스프링 컨테이너는 빈 객체 생성을 마무리한 뒤 초기화 메서드를 실행한다. 스프링 컨테이너가 종료되면 소멸 메서드가 실행된다.
앞서 설명한 InitializingBean 인터페이스와 DisposableBean 인터페이스를 사용하지 않고 스프링 설정에서 직접 메서드를 지정할 수 있다. @Bean 애노테이션의 속성값으로 설정 가능하다.
@Bean(initMethod = "connect", destroyMethod = "close")
initMethod에 초기화 할 때 사용할 메서드 이름을, destroyMethod에 소멸할 때 사용할 메서드 이름을 설정해주면 된다.
초기화 메서드의 경우 그냥 빈 설정 코드에서 직접 실행시켜도 된다. 다만 초기화 메서드가 여러번 사용되지 않도록 주의하자.
별도로 설정을 하지 않는 경우 스프링 빈은 항상 싱글톤 범위를 갖는다. 동일한 이름을 가진 빈 객체는 동일한 빈 객체를 참고한다. 이 외에 프로토타입 범위의 빈을 설정하는 것도 가능하다.
@Bean
@Scop("prototype")
이렇게 @Scope 애노테이션의 설정값으로 "prototype" 값을 주면 프로토타입 범위로 빈 설정이 가능하다. 프로토타입으로 빈의 범위를 지정하면 빈 객체를 구할 때마다 매번 새로운 객체를 생성한다. 프로토타입 범위의 빈은 컨테이너를 종료한다고 소멸 메서드를 실행하지 않기 때문에 빈 객체의 소멸 처리를 코드에서 직접 해야 한다.
** 참고
프로토타입 빈의 경우 더 이상 사용되지 않을 경우 알아서 garbage-collected 된다고 한다. 그러나 메모리 누수 등의 문제가 발생할 수 있으므로 사용이 완료된 프로토타입 빈을 소멸시킬 필요가 있다.
(출처: https://stackoverflow.com/questions/50681027/do-spring-prototype-beans-need-to-be-destroyed-manually)
** 참고 2
스프링 공식 문서에 따르면 Scope 애노테이션으로 설정 가능한 빈 범위는 다음과 같다.