애플리케이션이 시작되었을 때 초기화 작업, 종료되기 전에 종료 작업이 필요한 경우가 있습니다.
스프링 빈은 객체가 생성되고, 의존관계 주입이 끝나야 사용가능한 상태가 됩니다.
개발자들은 어떻게 그 시기를 알 수 있으며, 종료 전에 종료작업을 진행 할 수 있을까요?
=> 콜백메서드를 통해 초기화 작업 및 종료 작업을 진행할 수 있습니다.
스프링 빈의 생명주기
스프링 빈의 경우 두가지 등록 과정을 거칩니다.
- 스프링 빈 생성
- 의존관계 주입
두가지 등록 과정을 마쳤을 때, 사용가능한 상태가 됩니다. 이 때, 스프링이 초기화 콜백메서드를 호출해 줍니다.
또한 스프링은 스프링이 종료되기 전에 소멸전 콜백메서드를 호출해 줍니다.
빈 생명주기 콜백 방식
빈 생명주기 콜백 방식은 크게 3가지로 나뉩니다.
- 인터페이스 (InitializingBean, DisposableBean) 구현
- @Bean 설정 정보에 초기화 메서드 및 종료 메서드 지정
- @PostConstruct, @PreDestory 사용
본문부터 말하자면 @PostConstruct, @PreDestroy 어노테이션을 사용하는 것을 권장합니다.
인터페이스 구현
스프링은 InitializingBean, DisposableBean 인터페이스를 제공합니다.
초기화 및 소멸전 콜백을 하고자 하는 클래스에서 초기화 작업의 경우 InitializingBean을, 종료 전 작업의 경우 DisposableBean을 구현하면 됩니다.
이 방식에는 다음과 같은 단점이 존재합니다.
- 스프링에서 제공하는 인터페이스
- 코드가 스프링 전용 인터페이스에 의존
- 초기화, 소멸 메서드의 이름을 변경 할 수 없다.
- 수정이 불가능한 외부 라이브러리에 적용 불가
@Bean 설정 정보에 초기화 메서드 및 종료 메서드 지정
@Configuration이 붙은 클래스에서 초기화 및 종료 메서드를 지정하고자 하는 클래스를 스프링 빈에 등록할 때 @Bean에 메서드를 지정할 수 있습니다.
@Bean을 등록할 시에 사용가능한 옵션 값들 중 initMethod, destroyMethod가 있습니다.
초기화 하고자 하는 메서드를 initMethod에 등록, 종료 전 실행하고자 하는 메서드를 destroyMethod에 등록하면 됩니다.
destroyMethod에 default 값은 "(inferred)" 입니다.
만약 destroyMethod 이름이 close 혹은 shutdown과 같다면 destroyMethod를 지정해주지 않아도 알아서 호출됩니다.
@Bean 설정 정보에 지정하는 방식의 특징은 다음과 같습니다.
- 메서드 이름 지정이 자유롭다.
- 스프링 코드에 의존적이지 않다.
- 수정이 불가능한 외부라이브러리에도 적용이 가능하다.
@PostConstruct, @PreDestory
초기화 과정을 하는 메서드에는 @PostConsturct, 종료 작업을 하는 메서드에는 @PreDestroy를 붙여주면 됩니다.
메서드명은 개발자가 원하는 메서드명을 지정해주면 됩니다.
어노테이션을 사용하는 방식의 특징은 다음과 같습니다.
- 어노테이션만 붙이면 되므로 비교적 편리하다.
- javax.annotation package에 해당한다.
- 스프링이 아닌 다른 컨테이너에서도 동작한다.
- 외부라이브러리에 적용이 불가하다.
정리
이렇게 초기화 및 종료 작업을 지정할 수 있는 방법들을 알아보았습니다.
- 개발자가 수정 가능한 코드
- @PostConstruct, @PreDestory 어노테이션 활용
- 개발자가 수정 불가능한 코드
- @Configuration 관련 설정을 할 때 @Bean을 활용해 initMethod, destoryMethod 지정
'Spring' 카테고리의 다른 글
JdbcTemplate 사용 방법에 대해서 (0) | 2023.07.01 |
---|---|
프론트 컨트롤러 패턴은 무엇인가요? (0) | 2023.06.01 |
Spring의 핵심 Concept는 무엇인가 (0) | 2023.05.23 |
Enum Validation (0) | 2023.04.24 |
Spring Bean의 생명주기 (0) | 2023.04.21 |