1. 빈 생명주기 콜백
- 데이터베이스 커넥션 풀이나 네트워크 소켓처럼 앱 시작 시점에 필요한 연결을 미리 해두고, 앱 종료 시점에 연결을 모두 종료하는 작업을 진행하려면, 객체의 초기화와 종료 작업이 필요하다.
- 스프링 빈은 객체 생성 -> 의존관계 주입의 라이프사이클을 가진다. (생성자 주입은 예외)
- 초기화작업은 의존관계 주입이 모두 완료되고 난 다음에 호출해야 한다.
- 개발자가 의존관계 주입이 완료된 시점을 알기 위해서는 ?
- 스프링은 의존관계 주입이 완료되면 스프링 빈에게 콜백 메서드를 통해 초기화 시점을 알려주는 기능을 제공한다.
- 소멸 콜백도 준다.
- 스프링컨테이너 생성 -> 스프링빈 생성 -> 의존관계주입(setter, 필드주입) -> 초기화 콜백 -> 사용 -> 소멸전 콜백 -> 스프링 종료
- 객체의 생성과 초기화를 분리하는 것이 좋다
: 생성자는 필수정보를 받고 메모리를 할당해서 객체를 생성하는 책임을 가진다.
: 초기화는 생성된 값을 활용해서 외부 커넥션을 연결하는 등의 무거운 동작을 수행한다.
: 초기화작업이 단순한 경우에는 생성자에서 한번에 처리하는 것이 나을 수 있다.
2. 스프링의 콜백 지원 (이제 사용 안함 옛날거)
1) interface InitializingBean, DisposableBean
- implements 로 interface를 받아온다
- 메서드를 구현해주면 된다.
- 단점 : 스프링 전용 인터페이스이므로 의존해야함, 내가 코드를 고칠 수 없는 외부 라이브러리에 적용할 수 없다.
- 옛날방법이라 거의 사용하지 않음 ㅡㅡ
3. 콜백 지원 2 (결론은 4번꺼 애너테이션 쓰셈)
- 설정 정보에 @Bean(initMethod = "init", destroyMethod = "close") 처럼 메서드를 지정할 수 있다. (@Bean일때만 가능)
- 코드가 아니라 설정정보를 활용하므로 외부 라이브러리에도 초기화, 종료 메서드를 적용할 수 있다.
- 라이브러리는 대부분 close, shutdown 이라는 이름의 종료메서드를 사용한다.
- @Bean의 'destroyMethod'는 기본 값이 추론이다. close, shutdown같은 종료메서드를 추론해서 호출해준다.
- 그래서 스프링 빈으로 등록하면 종료메서드는 따로 적어주지 않아도 잘 동작한다.
4. 콜백지원 3 (이게 이 글 결론)
- 애너테이션으로 적용하기 @PostConstruct, @PreDestory
- 자바 표준이므로 스프링이 아닌 다른 컨테이너에서도 잘 동작한다.
- 단점 : 외부 라이브러리에는 적용을 못한다 (@Bean 을 사용하면 된다)
'Backend - Java Spring > Spring Core 핵심원리(완)' 카테고리의 다른 글
[SpringCore 핵심원리] 웹스코프 (0) | 2024.02.18 |
---|---|
[SpringCore 핵심원리] Bean 스코프 (0) | 2024.02.18 |
[SpringCore 핵심원리] List, Map (0) | 2024.02.17 |
[SpringCore 핵심원리] 애너테이션 (0) | 2024.02.17 |
[SpringCore 핵심원리] 생성자주입과 롬복 (0) | 2024.02.17 |
댓글