빈 생명주기 콜백
- 요청에 대한 빠른 응답을 위해서 데이터베이스 커넥션 풀, 네트워크 소켓처럼 애플리케이션 시작 시점에 필요한 연결을 미리 해두고 애플리케이션 종료 시점에 연결을 모두 종료하는 작업이 필요하다.
- 스프링에서 이러한 기능을 지원해주기 위해서 다양한 생명주기 콜백을 제공한다.
- 빈 생명주기 콜백 : 스프링 빈이 생성되거나 종료되기 전에 스프링이 빈의 메소드를 호출해줄 수 있는 기능이다.
- 스프링이 지원하는 빈 생명주기 콜백 3가지
- 인터페이스 (InitializingBean, DisposableBean)
- 설정 정보에 초기화 메소드, 종료 메소드 지정
- @PostConstruct, @PreDestroy 어노테이션 지원
- 스프링 빈은 라이프 사이클을 가진다.
- 객체 생성 -> 의존관계 주입
- 생성자 주입은 예외로 객체 생성과 의존관계 주입이 동시에 일어난다.
- 스프링 빈은 객체를 생성하고 의존관계 주입이 다 끝난 후에 필요한 데이터를 사용할 수 있는 준비가 완료된다.
- 초기화 작업 (객체가 처음 일을 시작하는 것)은 의존관계 주입이 모두 완료된 후에 호출해야 한다.
- 의존관계 주입이 모두 완료된 시점을 알 수 있는 방법은?
- 스프링은 의존관계 주입이 완료되면 스프링 빈에게 콜백 메소드를 통해서 초기화 시점을 알려주는 다양한 기능을 제공한다.
- 스프링은 스프링 컨테이너가 종료되기 직전에 소멸 콜백을 준다.
- 스프링 빈의 이벤트 라이프사이클
- 스프링 컨테이너 생성 -> 스프링 빈 생성 -> 의존관계 주입 -> 초기화 콜백 -> 사용 -> 소멸전 콜백 -> 스프링 종료
- 초기화 콜백 : 빈이 생성되고 빈의 의존관계 주입이 완료된 후에 호출된다.
- 소멸전 콜백 : 빈이 소멸되기 직전에 호출된다.
- 객체의 생성과 초기화를 분리하자
- 생성자는 필수 정보(매개 변수)를 받고 메모리를 할당해서 객체를 생성하는 책임을 갖는다.
- 초기화 작업은 생성된 값들을 활용해서 외부 커넥션을 연결하는 등 무거운 작업을 수행한다.
- 생성자 안에서 객체 내부 값 지정하는 것 외에는 초기화 작업을 함께하는 것보다 역할을 명확하게 나누는 것이 유지보수 관점에서 좋다.
초기화, 소멸 인터페이스 (InitializingBean, DisposableBean)
public class Client implements InitializingBean, DisposableBean {
//의존관계 주입이 끝나면 호출되는 메소드
@Override
public void afterPropertiesSet() throws Exception {...}
//스프링 빈 소멸 직전에 호출되는 메소드
@Override
public void destroy() throws Exception {...}
}
- InitializingBean 인터페이스는 afterPropertiesSet() 메소드를 선언하고 있으면 의존관계 주입이 끝나면 호출되는 메소드이다.
- DisposableBean 인터페이스는 destory() 메소드를 선언하고 있으며 스프링 빈이 소멸하기 직전에 호출되는 메소드이다.
- 초기화, 소멸 인터페이스의 단점
- 스프링 전용 인터페이스로 스프링 전용 인터페이스에 의존하게 된다.
- 초기화 afterPropertiesSet(), 소멸 destroy() 메소드의 이름을 변경할 수 없다.
- 코드를 고칠 수 없는 외부 라이브러리에 적용할 수 없다.
- 인터페이스 방식은 스프링 초기 방법으로 최근에는 거의 사용하지 않는다.
빈 등록 초기화, 소멸 메소드
- 빈 등록 초기화, 소멸 메소드
- 스프링 설정 정보에서 @Bean(initMethod = "...", destroyMethod = "...")로 각 메소드 명을 넘겨주면 된다.
- 메소드 명을 자유롭게 줄 수 있다.
- 스프링 빈이 스프링 코드에 의존하지 않는다.
- 설정 정보를 사용하기 때문에 코드를 고칠 수 없는 외부 라이브러리에 적용할 수 있다.
@Configuration
static class LifeCycleConfig {
//init 메소드를 초기화 메소드로 사용, close 메소드를 소멸 메소드로 사용
@Bean(initMethod = "init", destroyMethod = "close ")
public NetworkClient networkClient() {
return new NetworkClient();
}
}
- @Bean의 destroyMethod 속성에 특별한 기능이 있다.
- 대부분 라이브러리에서 종료 메소드로 close, shutdown을 사용한다.
- @Bean destroyMethod 속성의 기본 값으로 (inferred) (=추론)로 등록되어있고 추론 기능은 close, shutdown이라는 이름의 메소드를 자동으로 호출해준다.
- 추론 기능을 사용하고 싶지 않으면 공백을 지정하면 된다.
어노테이션 @PostConstruct, @PreDestroy
- 초기화, 소멸 어노테이션
- 최신 스프링에서 가장 권장하는 방법이다.
- javax 패키지로 스프링에 종속적인 기술이 아니기에 스프링이 아닌 다른 컨테이너에서도 동작한다.
- 외부 라이브러리에 적용할 수 없다는 단점이 있다.
//초기화 메소드로 지정
@PostConstruct
public void init(){...}
//소멸 메소드로 지정
@PreDestroy
public void close(){...}
- 일반적으로 @PostConstruct, @PreDestroy 어노테이션을 사용하고 외부 라이브러리를 초기화, 종료해야하는 경우 @Bean의 initMethod, destroyMethod 속성을 사용하자.
출처 : [인프런 김영한 스프링 핵심 원리 - 기본편]
스프링 핵심 원리 - 기본편 강의 | 김영한 - 인프런
김영한 | 스프링 입문자가 예제를 만들어가면서 스프링의 핵심 원리를 이해하고, 스프링 기본기를 확실히 다질 수 있습니다., 스프링 핵심 원리를 이해하고, 성장하는 백엔드 개발자가 되어보
www.inflearn.com
'Spring > [인프런 김영한 스프링 핵심 원리 -기본편]' 카테고리의 다른 글
[인프런 김영한 스프링 핵심 원리 - 기본편] 빈 스코프 (1) | 2024.08.15 |
---|---|
[인프런 김영한 스프링 핵심 원리 - 기본편] 의존관계 자동 주입 (1) | 2024.08.14 |
[인프런 김영한 스프링 핵심 원리 - 기본편] 컴포넌트 스캔 (0) | 2024.08.14 |
[인프런 김영한 스프링 핵심 원리 - 기본편] 싱글톤 컨테이너 (0) | 2024.08.13 |
[인프런 김영한 스프링 핵심 원리 - 기본편] 스프링 컨테이너와 스프링 빈 (1) | 2024.08.13 |