빈 생명주기 콜백

2023. 9. 26. 08:00LECTURES/스프링 핵심 원리 기본편

빈 생명주기 콜백 시작

코드

  • 데이터베이스 커넥션 풀이나, 네티워크 소켓처럼 애플리케이션 시작 시점에 필요한 연결을 미리 해두고, 애플리케이션 종료 시점에 연결을 모두 종료하는 작업을 진행하려면, 객체의 초기화와 종료 작업이 필요
  • 스프링 빈은 객체를 생성하고 의존관계 주입이 다 끝난 다음에야 필요한 데이터를 사용할 수 있는 준비가 완료됨
  • 따라서 초기화 작업은 의존관계 주입이 모두 완료된 후에 호출해야 함
  • 스프링은 의존관계 주입이 완료되면 스프링 빈에게 콜백 메서드를 통해 초기화 시점을 알려주는 다양한 기능을 제공
  • 스프링은 스프링 컨테이너가 종료되기 직전에 소멸 콜백을 줌

스프링 빈의 이벤트 라이프사이클

  1. 스프링 컨테이너 생성
  2. 스프링 빈 생성
  3. 의존관계 주입
  4. 초기화 콜백
    • 빈이 생성되고, 빈의 의존관계 주입이 완료된 후 호출
  5. 사용
  6. 소멸 전 콜백
    • 빈이 소멸되기 직전에 호출
  7. 스프링 종료

객체의 생성과 초기화를 분리하자

  • 생성자는 필수 정보를 받고, 메모리를 할당해서 객체를 생성하는 책임을 가짐
  • 초기화는 이렇게 생성된 값들을 활용해서 외부 커넥션을 연결하는 등 무거운 동작을 수행
  • 생성자 안에서 무거운 초기화 작업을 함께 하는 것보다는 객체를 생성하는 부분과 초기화하는 부분을 명확하게 나누는 것이 유지보수 관점에서 좋음
  • 초기화 작업이 단순한 경우에는 생성자에서 한 번에 다 처리하는 게 나을 수 있음

스프링 빈 생명주기 콜백 방식

인터페이스 InitializingBean, DisposableBean

코드

  • InitializingBean : afterPropertiesSet() 메서드로 초기화를 지원
  • DisposableBean : destroy() 메소드로 소멸을 지원

초기화, 소멸 인터페이스 단점

  • 스프링 전용 인터페이스에 의존
  • 초기화, 소멸 메서드의 이름 변경 불가능
  • 내가 코드를 고칠 수 없는 외부 라이브러리에 적용 불가능
  • 지금은 거의 사용하지 않음

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

코드

  • 설정 정보에 @Bean(initMethod = "init, destroyMethod = "close")처럼 초기화, 소멸 메서드를 지정 가능
  • 메서드 이름을 자유롭게 줄 수 있음
  • 스프링 빈이 스프링 코드에 의존하지 않음
  • 코드가 아니라 설정 정보를 사용하기 때문에 코드를 고칠 수 없는 외부 라이브러리에도 초기화, 종료 메서드를 적용 가능

종료 메서드 추론

  • 라이브러리 대부분은 종료 메서드 이름으로 close, shutdown 사용
  • @BeandestroyMethod는 기본값이 (inferred)로 등록되어 있음
  • 이 추론 기능은 close, shutdown이라는 이름의 메서드를 자동으로 호출해 줌
  • 직접 스프링 빈으로 등록하면 종료 메서드는 따로 적어주지 않아도 작 동작함
  • 추론 기능을 사용하기 싫으면 destroyMethod= "" 처럼 빈 공백을 지정하면 됨

애노테이션 @PostConstruct, @PreDestroy

코드

  • 최신 스프링에서 가장 권장하는 방법
  • 애노테이션 하나만 붙이면 돼서 매우 편리
  • 스프링에 종속적인 기술이 아니라 JSR-250라는 자바 표준이므로 스프링이 아닌 다른 컨테이너에서도 동작함
  • 컴포넌트 스캔과 잘 어울림
  • 유일한 단점은 외부 라이브러리에는 적용하지 못한다는 것
  • 외부 라이브러리를 초기화, 종료해야 하면 @Bean 기능을 사용

정리

  • @PostConstruct, @PreDestory 애노테이션을 사용하자
  • 코드를 고칠 수 없는 이부 라이브러리를 초기화, 종료해야 하면 @BeaninitMethod, destroyMethod를 사용하자
 

스프링 핵심 원리 - 기본편 - 인프런 | 강의

스프링 입문자가 예제를 만들어가면서 스프링의 핵심 원리를 이해하고, 스프링 기본기를 확실히 다질 수 있습니다., 스프링 핵심 원리를 이해하고, 성장하는 백엔드 개발자가 되어보세요! 📢

www.inflearn.com

 

'LECTURES > 스프링 핵심 원리 기본편' 카테고리의 다른 글

빈 스코프  (0) 2023.09.26
의존관계 자동 주입  (0) 2023.09.26
컴포넌트 스캔  (0) 2023.09.26
싱글톤 컨테이너  (0) 2023.09.26
스프링 컨테이너와 스프링 빈  (0) 2023.09.26