[Spring] Bean Lifecycle Callback

DEINGVELOP·2023년 4월 18일
0

Bean Lifecycle

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

  • 스프링 빈 : 객체를 생성하고, 의존 관계 주입 후에야 필요한 데이터를 사용할 준비가 제대로 완료됨
    • 준비 완료 시점을 알려주기 위한 콜백 메서드 필요함!

Bean Lifecycle Callback

스프링은 다양한 콜백 기능을 제공함

  • 초기화 콜백: 빈이 생성되고, 빈의 의존관계 주입이 완료된 후 호출(초기화 시점을 알려줌)

  • 소멸전 콜백: 빈이 소멸되기 직전에 호출 (스프링 컨테이너가 종료되기 직전)

💡 객체의 생성과 초기화를 분리해야만 하는가?

  • 객체의 생성 : 생성자가 필수 정보(파라미터)를 받아서 메모리를 할당해서 객체를 생성
  • 초기화 : 이 값들을 활요해서 외부 커넥션과 연결하는 등 무거운 동작 수행
    (단, 초기화 작업이 내부 값들만 약간 변경하는 정도로 단순한 경우, 생성자에서 한 번에 다 처리하는 게 더 나을 수 있음)

방법

  1. 인터페이스(InitializingBean, DisposableBean)
  2. 설정 정보에 초기화 메서드, 종료 메서드 지정
  3. @PostConstruct, @PreDestroy 애너테이션

방법 1. InitalizingBean, DisposableBean

  • InitializingBean - afterPropertiesSet() 메서드

  • DisposableBean - destroy() 메서드

단점

  • 스프링 전용 인터페이스. 즉, 해당 코드가 스프링 전용 인터페이스에 의존함
  • 초기화, 소멸 메서드의 이름을 변경할 수 없음
  • 코드를 고칠 수 없는 외부 라이브러리에 적용할 수 없음
  • 초창기 방법!
  • 다른 방법들이 더 낫기 때문에, 거의 사용하지 않음!

방법 2. 빈 등록 초기화, 소멸 메서드 지정

  • 빈 등록할 때, 초기화/소멸 메서드 지정
@Bean(initMethod = "init", destroyMethod = "close")

특징

  • 메서드 이름을 자유롭게 지정할 수 있음
  • 스프링 빈이 스프링 코드에 의존하지 않음
  • 코드가 아니라 설정 정보를 사용함 → 코드를 고칠 수 없는 외부 라이브러리에도 초기화/종료 메서드 지정 가능

+) 독특한 기능 - 종료 메서드 추론

  • @BeandestroyMethod 속성 - 기본값이 (inferred)(추론)으로 되어 있음
  • close, shutdown이라는 이름의 메서드를 종료 메서드로 추론해서 자동으로 호출해줌
  • 추론 기능을 사용하기 싫으면 → destroyMethod="" 처럼 공백 지정하면 됨 (단, 설정을 아주 꼬이게 할 수 있으므로, 추천하지 않음)

방법 3. 애노테이션 @PostConstruct, @PreDestroy

특징

  • 가장 편리하고 간단하게 초기화/종료 메서드 실행 가능
  • 최신 스프링에서 가장 권장하는 방법
  • 애너테이션 하나만 붙이면 됨
  • javax.annotation.PostConstruct 패키지 : 스프링에 종속적인 기술이 아닌 자바 표준 → Spring이 아닌 다른 컨테이너에서도 동작함
  • Component Scan과 잘 어울림
  • 유일한 단점 : 외부 라이브러리에는 적용하지 못함(까볼 수 없으니까) → 외부 라이브러리 이용 시에는 방법2(@Bean) 기능 활용하기

0개의 댓글