빈 생명주기 콜백

2022. 10. 28. 14:01Spring

해당 내용은 김영한님의_인프런 [스프링 핵심 원리]를 바탕으로 합니다.

객체 생성과 동시에 미리 초기화 작업을 해야할 때가 있다. 예를 들어 디비 커넥션 풀의 경우, 접근마다 커넥션을 연결하고 끊는 것보다는 미리 객체를 만들어놓고 연결을 해놓는 작업이 성능과 속도면에서 좋다. 또한 계속 연결을 가지고 있지않고 연결을 종료해주어야한다. 네트워크 소켓도 마찬가지다. 애플리케이션 시작 시점에 필요한 연결을 미리 해두고 종료 시점에 연결을 종료하는 작업을 진행하려면 객체의 생성 뿐만 아니라 초기화와 종료작업이 필요하다.

Bean LifeCycle

스프링 빈은

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

과정의 라이프사이클을 가진다.
객체가 생성되고 빈들의 의존관계가 주입되고나면 초기화를, 스프링 종료시점 전에는 빈 객체 소멸을 해야하는데
 시점을 잡아주는 세 가지 기능이 있다.

  1. @PostConstruct, @PreDestroy
  2. 빈 등록에 초기화, 소멸 메소드 지정
  3. 인터페이스 InitializingBean, DisposableBean

1) @PostConstruct, @PreDestroy

  • 객체 클래스의 메소드에 @PostConstruct 를 붙여주면 해당 메소드를 초기화 시점에 실행시켜준다.
  • 마찬가지로 @PreDestroy를 종료시점에 실행시켜준다.
  • 가장 간단하고 권장하는 방법!
  • 해당 애노테이션은 스프링이 아닌 자바에서 제공하는 기능이기 때문에 스프링에 종속적이지 않다.
  • 단점은 외부 라이브러리에는 적용하지 못한다는 것이다. 외부 라이브러리를 초기화, 종료 해야 하면 2번 방법을 사용한다.

 


위의 사진을 보면 컨테이너를 만들고 빈 객체들을 만들면서 생성자가 호출되고 바로 초기화 메서드를 호출, 컨테이너 종료 시점에 종료전 콜백 시점을 잡아 메서드를 실행시켜준것을 볼 수 있다.

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

 

@Bean 등록을 할 때 @Bean(initMethod = "init", destroyMethod = "close") 처럼 초기화, 종료시점에 해당 메소드를 지정할 수 있다.

  • 메서드 이름을 자유롭게 줄 수 있다.
  • 코드가 아니라 설정 정보를 사용하기 때문에 코드를 고칠 수 없는 외부 라이브러리에도 초기화, 종료 메서드를 적용할 수 있다.

3) 인터페이스 InitializingBean, DisposableBean

  • 객체 클래스에 인테페이스를 상속받아야한다.
  • InitializingBean  afterPropertiesSet() 메서드로 초기화를 지원한다.
  • DisposableBean  destroy() 메서드로 소멸을 지원한다.
  • 스프링 전용 인터페이스이다.
  • 해당 방법은 스프링 초창기에 나온 방법들로, 현재는 거의 사용하지 않는다.

'Spring' 카테고리의 다른 글

프록시  (0) 2022.10.28
빈 스코프  (0) 2022.10.28
의존 주입할 빈이 두개 이상 조회 될 때  (0) 2022.10.26
의존관계 자동 주입 방법  (0) 2022.10.26
컴포넌트 스캔과 자동 의존관계 주입  (0) 2022.10.26