Spring/핵심원리

[스프링 핵심원리 - 기본편] 내용 정리6 - 빈 생명주기

슈코 2023. 8. 30. 22:58

 

빈 생명주기 콜백

스프링 빈 객체의 초기화와 종료 작업

스프링 빈은 객체 생성 → 의존관계 주입이라는 라이프 사이클을 가짐

초기화 작업은 의존관계 주입 이후에 호출해야한다

스프링은 의존관계 주입이 끝나면 스프링 빈에게 콜백 메소드를 통해 초기화 시점을 알려주는 기능을 제공한다

스프링은 스프링 컨테이너가 종료되기 직전에 소멸 콜백을 실행한다

 

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

 

 

객체의 생성초기화 작업을 분리하자

생성자는 필수정보를 받고, 메모리를 할당해서 객체를 생성하는 책임

초기화는 생성된 값을 활용해서 외부 커넥션 등의 무거운 동작 수행

생성자 안에서 무거운 초기화 작업을 하는것 보다, 명확하게 역할을 구분하는 것이 유지보수 관점에서 좋다

 

 

스프링의 빈 생명주기 콜백 지원

  • 인터페이스( InitalizingBean, DisposableBean )
  • 설정 정보에 초기화 메소드, 종료 메소드 지정
  • @PostConstruct, @PreDestory 애노테이션 지원

 

 

인터페이스( InitalizingBean, DisposableBean )

  • InitalizingBean은 afterPropertiesSet() 을 초기화 메소드로 지원
  • DisposableBean은 destroy() 를 소멸 메소드로 지원
  • 스프링 전용 인터페이스(스프링 인터페이스에 의존)
  • 이름 변경 불가(초기화 / 소멸 메소드)
  • 내가 수정할 수 없는 외부 라이브러리에 적용할 수 없다
  • 초창기에 나온 방법으로, 현재는 잘 사용하지 않는다

괜찮은 방법같은데 잘 사용하지 않는다니, 그래도 afterPropertiesSet()을 보면 초기화 메소드라는걸 기억하자!

 

 

빈 등록 초기화, 소멸 메소드 지정

  • @Bean(initMethod = "init", destroyMethod = "close") 으로 초기화 / 소멸 메소드를 지정
  • 매소드 이름을 지정할 수 있다(직접 메소드명으로 지정)
  • 스프링 코드에 의존하지 않는다
  • 설정 정보를 사용하기 때문에, 내가 수정할 수 없는 외부 라이브러리에도 적용 가능하다
  • @Bean의 destroyMethod는 추론기능(close, shutdown 이라는 메소드를 자동으로 호출)을 제공
    • 직접 스프링 빈을 등록하면, 해당 메소드가 있으면 자동으로 소멸 메소드로 지정하고 실행됨
    • 추론 기능을 쓰기 싫다면, destroyMethod="" 처럼 빈 공백 지정

 

 

애노테이션 @PostConstruct, @PreDestroy

  • 최신 스프링에서 가장 권장하는 방법
  • 초기화 / 소멸 메소드를 만들고, 애노테이션만 붙여주면 된다( 편리하다! )
  • 자바 표준으로 스프링에 종속하지 않는다
  • 외부 라이브러리에는 사용하지 못한다
    • 외부 라이브러리 사용 시 @Bean에 메소드로 지정

스프링 전용 인터페이스가 있는데도, 자바 표준을 사용하는걸 보면 조금 아이러니 하기도 하다!