본문 바로가기
Backend - Java Spring/Spring Core

[SpringCore 핵심원리] 빈 생명주기 콜백

by VictorMeredith 2024. 2. 17.

1. 빈 생명주기 콜백

- 데이터베이스 커넥션 풀이나 네트워크 소켓처럼 앱 시작 시점에 필요한 연결을 미리 해두고, 앱 종료 시점에 연결을 모두 종료하는 작업을 진행하려면, 객체의 초기화와 종료 작업이 필요하다.

- 스프링 빈은 객체 생성 -> 의존관계 주입의 라이프사이클을 가진다. (생성자 주입은 예외)

- 초기화작업은 의존관계 주입이 모두 완료되고 난 다음에 호출해야 한다.

- 개발자가 의존관계 주입이 완료된 시점을 알기 위해서는 ? 

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

- 소멸 콜백도 준다. 

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

 

- 객체의 생성과 초기화를 분리하는 것이 좋다

  : 생성자는 필수정보를 받고 메모리를 할당해서 객체를 생성하는 책임을 가진다.

  : 초기화는 생성된 값을 활용해서 외부 커넥션을 연결하는 등의 무거운 동작을 수행한다.

  : 초기화작업이 단순한 경우에는 생성자에서 한번에 처리하는 것이 나을 수 있다.

 

2. 스프링의 콜백 지원 (이제 사용 안함 옛날거)

 1) interface InitializingBean, DisposableBean

  - implements 로 interface를 받아온다

 

- 메서드를 구현해주면 된다.

connect와 disconnect는 클래스의 메서드

 

- 단점 : 스프링 전용 인터페이스이므로 의존해야함, 내가 코드를 고칠 수 없는 외부 라이브러리에 적용할 수 없다.

- 옛날방법이라 거의 사용하지 않음 ㅡㅡ

 

3. 콜백 지원 2 (결론은 4번꺼 애너테이션 쓰셈)

- 설정 정보에 @Bean(initMethod = "init", destroyMethod = "close") 처럼 메서드를 지정할 수 있다. (@Bean일때만 가능)

이런식으로 Bean 등록 시 활용 가능

- 코드가 아니라 설정정보를 활용하므로 외부 라이브러리에도 초기화, 종료 메서드를 적용할 수 있다.

- 라이브러리는 대부분 close, shutdown 이라는 이름의 종료메서드를 사용한다.

- @Bean의 'destroyMethod'는 기본 값이 추론이다. close, shutdown같은 종료메서드를 추론해서 호출해준다.

- 그래서 스프링 빈으로 등록하면 종료메서드는 따로 적어주지 않아도 잘 동작한다.

 

4. 콜백지원 3 (이게 이 글 결론)

- 애너테이션으로 적용하기 @PostConstruct, @PreDestory 

아니 이렇게 하면 되자나

- 자바 표준이므로 스프링이 아닌 다른 컨테이너에서도 잘 동작한다.

- 단점 : 외부 라이브러리에는 적용을 못한다 (@Bean 을 사용하면  된다)

 

댓글