아무거나 개발공부/스프링 완전 정복

스프링 핵심 원리이해 - 빈 Life Cycle 콜백

코드 살인마 2023. 5. 29. 16:22
728x90

스프링 빈은 아래와 같은 life cycle을 가진다.

 

객체생성 → 의존관계 주입?”

 

의존관계 주입까지 마쳐야 스프링 빈을 사용할 준비가 완료 된 것이다. 따라서 초기화 작업도 의존관계 주입이 끝난 이후에 진행해야 하는데, 이를 개발자가 어떻게 알 수 있을까?

 

스프링은 의존관계 주입이 완료되면 스프링 빈에게 콜백 메서드를 통해서 초기화 시점을 알려주는 다양한 기능을 제공한다. 또한, 스프링은 스프링 컨테이너가 종료되기 직전에 스프링 빈에게 소멸 콜백을 준다.

 

스프링 이벤트 Life Cycle

스프링 컨테이너 생성 → 스프링 빈 생성 → 의존관계 주입 → 초기화 콜백 → 사용 → 소멸 전 콜백 → 스프링 종료

 

스프링은 크게 3가지 방법으로 빈 Life Cycle 콜백을 지원한다.

  • 인터페이스(bean 클래스에 implement 하는 방법 - InitializingBean, DisposableBean)
    • 해당 인터페이스는 스프링 전용 인터페이스이다.
    • 초기화, 소멸 인터페이스의 이름을 변경할 수 없다.
    • 내가 코드를 고칠 수 없는 외부 라이브러리에 적용할 수 없다.
  • 설정 정보에 초기화 메소드, 콜백 메소드 지원 (@Bean(initMethod= ”init”, destoryMethod = “close”)
    • 메서드 이름을 자유롭게 설정할 수 있다.
    • 스프링 빈이 스프링 코드에 의존하지 않는다.
    • 코드가 아니라 설정 정보를 변경하는 것이므로, 외부 라이브러리에 적용할 수 있다.
  • @PostConstruct, @PreDestory 에너테이션 지원 (bean 클래스에 초기화, 소멸 메서드에 해당 애너테이션을 설정한다.)
    • 최신 스프링에서 권장하는 방법
    • 애너테이션 하나만 붙이면 적용되기 때문에 편리하다.
    • 패키지를 보면 javax인데, 스프링 종속적이지 않다. 따라서 스프링이 아닌 다른 컨테이너에서도 동작한다.
    • 유일한 단점은 외부 라이브러리에 적용할 수 없는 것이다. 외부 라이브러리에 적용할 때는 설정 정보를 활용하자.