Search
Duplicate
❄️

@PostConstruct, @PreDestroy

일반적으로 빈은 다음과 같은 생명주기를 가진다.
스프링 컨테이너 생성 → 빈 객체 생성 → 의존관계 주입 → 초기화 시점 콜백(커스텀) → 사용 → 소멸 시점 콜백(커스텀) → 스프링 종료
위 생명주기에 따르면 생성자가 호출되었을 때 스프링 빈은 초기화 전이고 의존관계 주입이 이뤄지고 난 후에야 스프링 빈이 초기화된다.
초기화 작업은 의존관계 주입이 완료되고 난 다음에 호출하게 되는데, 개발자는 의존관계 주입이 완료되는 시점이 언제인지 확인할 방법이 없으므로 Spring은 다음과 같은 생명주기 콜백을 지원한다.
1.
인터페이스(InitializingBean, DisposableBean)
2.
Bean 설정 정보에 초기화 메소드, 종료 메소드 지정
3.
@PostConstruct, @PreDestroy 어노테이션 지원
1번의 경우, 코드가 스프링에 과의존하게 된다고 생각하여 거의 사용하지 않으려 한다.
프로토타입 빈의 경우, 컨테이너가 전체 라이프 사이클을 관리하지 않는다. 컨테이너는 프로토타입 객체를 인스턴스화, 구성 후 추가 작업없이 클라이언트에 전달한다.
따라서 초기화 시점 콜백 메소드는 범위에 관계없이 모든 객체에서 호출되지만 프로토타입의 경우, 소멸 시점 콜백이 호출되지 않는다.

@PostConstruct, @PreDestroy

@PostConstruct
의존관계 주입이 이뤄진 후, 초기화를 수행하여 객체의 값을 설정한 후 호출할 수 있다.
@PreDestroy
ApplicationContext에서 빈을 제거하기 위해 사용된다.
두 어노테이션의 경우, 외부 라이브러리에 적용할 수 없다. 이때는 @Bean 어노테이션에 옵션을 추가하는 기능을 사용해야 한다.

Bean 설정 정보에 초기화 메소드, 종료 메소드 지정

@Configuration 어노테이션이 붙은 클래스에 @Bean(initMethod = “init”, destroyMethod = “close”)과 같이 메소드에 붙여 사용할 수 있다.