0. 개요
이번 게시물에서는 스프링 빈의 생명주기에 대해 작성할 것이다. 해당 게시물을 보기 전, 아래 링크의 글을 보고 오는 것을 추천한다.
1. 스프링 빈 생명 주기
모든 설명에 나오는 예시 프로젝트의 설계 방식은 아래 링크를 참고 https://imgzon.tistory.com/114 |
개발자가 스프링 빈을 사용하기 위해서는 스브링 빈 객체가 생성되고, 의존관계가 주입된 후이다. 따라서 스프링에서는 스프링 빈에게 콜백 메서드를 통해서 초기화 시점을 알려주는 다양한 기능을 제공한다.
따라서 스프링 빈의 라이프사이클을 정리해보면,
스프링 컨테이너 생성 -> 스프링 빈 생성 -> 의존관계 주입 -> 초기화 콜백 -> 사용 -> 소멸전 콜백 -> 스프링 종료 |
- 초기화 콜백: 빈이 생성되고, 의존관계가 주입된 후
- 소멸전 콜백: 빈이 소멸되기 직전에 호출
스프링은 크게 3가지 방법으로 빈 생명주기 콜백을 지원한다!
- 참고로, 객체의 생성과 값 초기화를 분리하는 것을 추천한다!
-> 생성자는 파라미터를 받고, 메모리를 할당하여 객체를 생성하는 아주 중요한 책임을 지닌다.
-> 초기화는 외부 커넥션을 연결하는 등 마찬가지로 무거운 동작을 수행한다.
-> 따라서 생성자 안에서 무거운 초기화를 하는 것 보다는, 따로 분리하는 것이 유지보수 관점에서 좋다
2. InitializingBean, DisposableBean
첫 번째 방법은 InitializingBean, DisposableBean 인터페이스를 구현하는 것이다.
public class BeanCallBack implements InitializingBean, DisposableBean {
@Override
public void afterPropertiesSet() throws Exception {
//초기화 콜백
}
@Override
public void destroy() throws Exception {
//소멸 전 콜백
}
}
- InitializingBean이 afterPropertiesSet() 메서드를 지원하며, 초기화 콜백시 호출된다.
- DispoableBean이 destroy() 메서드를 지원하며, 소멸 전 콜백시 호출된다.
인터페이스 사용의 단점
- 스프링 전용 인터페이스이므로, 코드가 스프링에 의존하게 된다.
- 초기화, 소멸 콜백 메서드의 이름을 변경할 수 없다(override 해야하므로)
3. 빈 등록 시 초기화, 소멸 메서드 지정
빈 등록 시 별도로 초기화, 소멸 메서드를 지정해준다.
public class BeanCallBack implements InitializingBean, DisposableBean {
public void init() throws Exception {
//초기화 콜백
}
public void close() throws Exception {
//소멸 전 콜백
}
}
@Configuration
public class AppConfig {
@Bean(initMethod = "init", destoryMethod = "close")
public BeanCallBack beanCallBack() {
//생략
}
}
빈 설정시 @Bean(initMethod = "init", destroyMethod = "close")처럼 초기화, 소멸 콜백 시 사용할 메서드를 지정해 줄 수 있다.
해당 방식의 장점
- 메서드 이름 커스텀이 가능하다.
- 스프링 빈이 스프링 코드에 의존하지 않는다.
- 설정 정보에서 지정해주기 때문에, 코드를 고칠 수 없는 외부 라이브러리에도 적용할 수 있다.
참고로 별도로 destroyMethod를 지정해 주지 않아도, close, shutdown 이름의 메서드가 있다면 소멸 콜백 시 자동으로 호출하게 된다!(자동으로 추론한다.) 이것이 싫다면, destroyMethod = "" 처럼 빈 공백을 지정해주어야 한다.
4. @PostConstruct, @PreDestroy
public class BeanCallBack implements InitializingBean, DisposableBean {
@PostConstruct
public void afterPropertiesSet() throws Exception {
//초기화 콜백
}
@PreDestroy
public void destroy() throws Exception {
//소멸 전 콜백
}
}
@PostConstruct를 초기화 메서드에, @PreDestroy를 소멸 전 메서드에 붙여주면 된다.
해당 방식의 장점
- 애노테이션만 붙이면 되므로, 편리하다.
- javax.annotation.PostConstruct로, 스프링에 종속적인 기술이 아닌 JSR-250이라는 자바 표준이다.
-> 따라서 스프링이 아니어도 잘 작동한다.
해당 방식의 단점
- 코드 수정이 불가능한 외부 라이브러리에는 적용하지 못한다.
5. 그래서 뭘 사용해야 하지?
- 실제로 최신 스프링에서는 @PostConstruct, @PreDestroy 애노테이션 붙이는 것을 권장한다.
- 코드 수정이 불가능한 외부 라이브러리의 경우에만 @Bean(initMethod = , destroyMethod = )를 사용하자.
위 내용은 김영한 님의 인프런 강의 "스프링 핵심 원리 - 기본편"의 내용과 강의자료를 토대로 작성된 게시글입니다.
강의 링크:
'Web > spring study' 카테고리의 다른 글
웹 서버, 웹 어플리케이션(WAS), 그리고 사용법 (0) | 2023.01.15 |
---|---|
[Spring] 빈 스코프 (@Scope) (0) | 2023.01.10 |
[Spring] 스프링 빈 조회 (0) | 2023.01.10 |
[Spring] 싱글톤 패턴, 스프링 컨테이너, @Configuration (0) | 2023.01.10 |
[Spring] 컴포넌트 스캔(@ComponentScan), 의존관계 자동 주입, 롬복(lombok) (0) | 2023.01.10 |
댓글