빈 생명주기 콜백

빈 생명주기 콜백

  • 데이터베이스 커넥션 풀이나 네트워크 소켓처럼 애플리케이션 시작 시점에 필요한 연결을 미리 해두고, 애플리케이션 종료 시점에 연결을 모두 종료하는 작업 진행을 위해 객체의 초기화와 종료 작업이 필요하다.
  • 외부 네트워크에 미리 연결하는 객체를 하나 생성한다고 가정
  • NetworkClient는 애플리케이션 시작 시점에 connect()를 호출해 연결해야하고 종료 시 disconnect()로 연결을 종료해야함.
  • 스프링은 객체 생성 후 의존 관계를 주입하는 라이프사이클을 가진다.

의존관계 주입 완료 시점

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

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

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

스프링의 콜백 지원 방식

  • 인터페이스
  • 설정 정보에 초기화 메서드, 종료 메서드 지정
  • @Pastconstruct, @PreDestory 에노테이션 지원

콜백 지원 방식1.  인터페이스

  1. InitializingBean: afterPropertiesSet()
    • 의존관계 주입이 끝난 후 호출되어 메서드 초기화
  2. DisposableBean: destory()
    • 연결 종료시 사용

단점

  • 스프링 전용 인터페이스라 스프링 인터페이스에 의존하게 된다.
  • 초기화, 소멸 메서드의 이름을 변경할 수 없다
  • 코드를 고칠 수 없는 외부 라이브러리에 적용 불가능

그래서 요즘은 거의 사용하지 않는다.

콜백 지원 방식2.  빈 등록 초기화, 소멸 메서드

  • 설정 정보에 @Bean(initMethod = "init", destroyMethod = "closure")와 같이 초기화, 소멸 메서드를 지정하는 방식

장점

  1. 메서드 이름 자유롭게 변경 가능
  2. 스프링 빈이 스프링 코드에 의존하지 않음
  3. 코드를 고칠 수 없는 외부 라이브러리에도 초기화, 종료 메서드 적용 가능

종료 메서드 추론

  • destoryMethod에 이름을 지정해주지 않아도 메서드를 자동 호출해준다.
  • 라이브러리가 대부분 close, shutdown이라는 이름의 종료 메서드를 사용하기 때문

콜백 지원 방식3.  애노테이션

  • @PostConstruct, @PreDestory를 이용해 초기화와 종료를 실행할 수 있다.

특징

  • 최신 스프링에서 권장하는 방식
  • javax패키지를 사용하여 자바 표준이다. 따라서 다른 컨테이너에서도 동작한다.
  • 컴포넌트 스캔과 잘 어울린다.
  • 유일한 단점은 외부 라이브러리에 적용하지 못한다는 것
[출처]

homebdy
homebdy 개발에 이제 막 발 담근 사람. 개발에 이제 막 발 담근 사람. 개발에 이제 막 발 담근 사람. 개발에 이제 막 발 담근 사람.
comments powered by Disqus