더북(TheBook)

4.3.5 초기화 메서드 해석 순서 이해하기

빈 인스턴스 하나에서 모든 초기화 메커니즘을 사용할 수도 있습니다. 이때 스프링은 @PostConstruct 애너테이션이 적용된 메서드, afterPropertiesSet(), 구성 파일에 기재한 초기화 메서드 순으로 초기화 메서드를 실행합니다. 실행이 이와 같은 순서로 이뤄지는 데는 기술적인 이유가 있습니다. 그림 4-1의 초기화 경로를 따라가 보면 빈 생성 시 다음과 같은 단계를 거치는 것을 알 수 있습니다.

1. 빈 생성을 위해 생성자를 호출합니다.

2. 의존성을 주입합니다(수정자를 호출).

3. 이제 빈이 생성됐고 의존성도 주입됐으므로 사전 초기화를 담당하는 BeanPostProcessor 기반 빈들에게 호출해야 하는 메서드가 있는지 확인을 요청합니다. 이 BeanPostProcessor 빈들은 빈이 생성된 이후에 빈 조작을 수행하는 스프링에 특화된 기반 빈들입니다. @PostConstruct 애너테이션은 CommonAnnotationBeanPostProcessor 빈에 등록되므로, CommonAnnotationBeanPostProcessor 빈이 @PostConstruct 애너테이션이 적용된 메서드를 호출합니다. 해당 메서드는 빈이 생성된 직후 그리고 빈이 서비스되기 전에 실행되며1 실제 빈 초기화 전인 afterPropertiesSetinit-method 이전에 수행됩니다.

4. 의존성 주입이 끝난 직후 InitializingBeanafterPropertiesSet 메서드를 실행합니다. 빈에 모든 프로퍼티가 주입되고 BeanFactoryAwareApplicationContextAware의 처리가 완료되면 BeanFactoryafterPropertiesSet 메서드를 호출합니다.

5. init-method 애트리뷰트로 지정한 빈의 실제 초기화 메서드를 맨 마지막에 실행합니다.

여러 유형의 빈 초기화 순서를 이해한다면 특정 메서드를 사용해 초기화 작업을 하던 기존 스프링 빈에 몇 가지 초기화 코드를 추가해야 할 때 추가할 적절한 위치를 판단할 수 있어 유용합니다.

신간 소식 구독하기
뉴스레터에 가입하시고 이메일로 신간 소식을 받아 보세요.