티스토리 뷰


  1   Bean의 라이프 사이클



 스프링은 빈 을 관리하는 컨테이너이다. 따라서 빈 객체를 생성하고, 초기화및 소멸 등 일련의 과정들을 담당하게 된다. 즉 스프링 컨테이너에 저장되는 빈 객체는 생성, 초기화, 소멸의 라이프 사이클을 가지게 된다. 


스프링컨테이너에 생성되는 빈 객체의 라이프 사이클은 빈 클래스가 구현한 인터페이스에 따라 달라진다. 우선 BeanFactory 컨테이너를 사용할 경우 빈 객체의 라이프 사이클은 이러한 과정을 거치게 된다.




  2   BeanFactory 사용



  1. 빈 객체 생성
  2. BeanNameAware.setBeanName()
  3. BeanFactoryAware.setBeanFactory()
  4. BeanPostProcessor의 초기화 전처리
  5. 커스텀 init - method
  6. InitializingBean.afterPropertiesSet()
  7. BeanPostProcessor의 초기화 후처리
  8. 빈 객체 사용
  9. DisposableBean.destroy()
  10. 커스텀 destroy - method

 

 4번 과정과 7번과정은 빈 클래스가 아닌 특수 빈을 통해 처리되는 과정이며 그 외 나머지 과정이 실제 빈 클래스를 통해 실행되는 과정이다. 각각 [인터페이스.메소드이름]으로 표시된 단계는 빈 클래스가 해당 인터페이스를 구현하였을 경우 스프링 컨테이너가 지정한 메서드를 호출한다는 것을 의미한다. 

 

 즉, 빈 객체로 등록되어질 클래스가 만약 BeanNameAware 인터페이스를 구현하였다면 setBeanName()메서드가 호출이 되는 것이다. 5번단계인 커스텀 init - method는 <bean>태그의 init - method 속성에 지정한 메소드를 의미하며 destroy - method 역시 속성으로 지정된 메소드를 의미한다. 

 

 BeanFactory의 경우 단순히 빈 관리만을 목적으로 만들어진 컨테이너 이기 때문에 호출되어 지는 메소드나 과정들이 모두 빈 객체의 관리에 집중되어있다.



 하지만 ApplicationContext를 이용할 경우 빈 객체의 관리를 포함하여 여러 부가적인 기능들이 포함되어있기 때문에 BeanFactory의 라이플 사이클과 비교하여 몇가지 단계가 추가된다.




  3   ApplicationContext 사용



  1. 빈 객체 생성
  2. BeanFactoryAware.setBeanFactory()
  3. ResourceLoaderAware.setResourceLoader()
  4. ApplicationEventPublisherAware.setApplicationEventPublisher()
  5. MessageSourceAware.setMessageSource()
  6. ApplicationContextAware.setApplicationContext()
  7. @PostConstruct 메서드 실행
  8. BeanPostProcessor의 초기화 전처리
  9. 커스텀 init - method
  10. InitializingBean.afterPropertiesSet()
  11. BeanPostProcessor의 초기화 후처리
  12. 빈 객체 사용
  13. @PreDestroy 메소드
  14. DisposableBean.destroy()
  15. 커스텀 destroy - method

 

 ApplicationContext는 자원 및 메시지 처리, 이벤트 처리등의 추가적인 기능을 제공한다. 스프링이 제공하는 ApplicationContext의 구현 클래스들은 AbstractApplicationContext클래스를 상속 받고있는데, 이 클래스는 destroy()메소드를 구현하고 있다. destroy() 메소드를 호츨하면 스프링 컨테이너에 등록된 빈 객체를 제거하는 과정을 거치게 된다.


 BeanFactory 와 ApplicationContext의 과정들을 보면 라이프 사이클과 관련된 인터페이스가 다수 존재하는데 이들 인터페이스가 모두 사용되는 것은 아니며 실제로 이들을 직접적으로 구현하는 경우는 드물다. 하지만, 경우에따라 객체를 초기화하고 검증하는 등의 과정에서 스프링이 제공하는 라이프사이클을 이용하는 것이 편리할 상황이 있다.





  4   BeanNameAware 인터페이스



 id속성이나 name 속성을 통해 지정한 이름을 빈 객체에 전달할 필요가 있을때 사용한다. 빈 클래스가 BeanNameAware 인터페이스를 구현하고 있을 경우 스프링 컨체이너는 setBeanName() 메소드를 호출하여 빈 객체의 이름을 전달하게 된다. 


 따라서, 자기 자신의 이름을 필요로 하는 빈 클래스는 BeanNAmeAware인터페이스를 구현하고 setBeanName() 메서드를 통해 전달받은 이름을 필드에 저장한뒤 필요한 곳에서 사용하면 된다.





  5   BeanFactoryAware 인터페이스 & ApplicationContextAware 인터페이스



 빈 객체가 필요한 객체를 스프링 컨테이너로부터 직접 검색해야하는 경우, 또는 빈객체에서 ApplicationContext가 제공하는 자원 및 메시지 관련 기능을 사용하고 싶을경우 등등 이러한 빈 객체가 스프링 컨테이너를 직접 사용해야 할 필요가 있다면 위의 두 인터페이스를 구현하고 setBeanFactory() 메소드 또는 setApplicationContext()를 사용하여 빈 객체를 관리하고있는 컨테이너들을 전달 받을 수 있다.





  6   InitializingBean 인터페이스



 빈 객체의 라이프 사이클관련 인터페이스중 가장 많이 사용되는 것중 하나이다. InitializingBean 인터페이스는 객체를 생성하고 프로퍼티를 초기화 하고, 컨테이너 관련 설정을 완료한 뒤에 호출되는 afterPropertiesSet() 메서드를 정의한다.  afterPropertiesSet() 메서드는 주로 빈 객체의 프로퍼티가 모두 올바르게 설정되었는지의 여부를 검사하는 용도로 사용된다.





  7   DisposableBean 인터페이스



 컨테이너에서 빈 객체를 제거할 때, 빈 객체는 사용하던 자원을 반납해야 한다. 빈 클래스가 DisposableBean 인터페이스를 구현한 경우 스프링은 빈 객체를 컨테이너에서 제거하기 전에 DisposableBean 에 정의된 destroy() 메서드를 호출하여 빈 객체가 자원을 반납 할 수 있도록 하고 있다.



댓글