빈 생명주기 콜백
빈 생명주기 콜백
스프링 빈의 이벤트 라이프 사이클
- 스프링 컨테이너 생성
- 스프링 빈 생성
- 의존 관계 주입
- 초기화 콜백
- 사용
- 소멸전 콜백
- 스프링 종료
💡 객체의 생성과 초기화를 분리하자
생성자는 필수 정보를 받고, 메모리를 할당해서 객체를 생성하는 책임을 가집니다. 반면에 초기화는 이렇게 생성된 값들을 활용해서 외부 커넥션을 연결하는 등 무거운 동작을 수행합니다.
따라서 생성자 안에서 무거은 초기화 작업을 함께 하는 것 보다는 객체를 생성하는 부분과 초기화 하는 부분을 명확하게 나누는 것이 유지보수 관점에서 좋습니다.
인터페이스 InitalizingBean, DisposableBean
1
2
3
4
5
6
7
8
9
10
11
12
public class NetworkClient implements InitializingBean, DisposableBean {
@Override
public void afterPropertiesSet() throws Exception {
System.out.println("초기화");
}
@Override
public void destroy() throws Exception {
System.out.println("종료");
}
}
InitializingBean: 초기화 인터페이스DisposableBean: 종료 인터페이스
단점
- 이 인터페이스는 스프링 전용 인터페이스이기 때문에 해당 코드가 스프링 전용 인터페이스에 의존
- 초기화, 소멸 메서드의 이름을 변경할 수 없음
- 내가 코드를 고칠 수 없는 외부 라이브러리에 적용할 스 없음
빈 등록 초기화, 소멸 메서드 지정
1
2
3
4
5
6
7
8
9
10
public class NetworkClient {
public void init() {
System.out.println("초기화");
}
public void close() {
System.out.println("종료");
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
public class BeanLifeCycleTest {
@Configuration
static class LifeCycleConfig {
@Bean(initMethod = "init", destroyMethod = "close")
public NetworkClient newNetworkClient() {
NetworkClient networkClient = new NetworkClient();
networkClient.setUrl("http://hello-spring.com");
return networkClient;
}
}
}
특징
- 메서드 이름을 자유롭게 줄 수 있음
- 스프링 빈이 스프링 코드에 의존하지 않음
- 코드가 아니라 설정 정보를 사용하기 때문에 코드를 고칠 수 없는 외부 라이브러리에도 초기화, 종료 메서드를 적용할 수 있음
종료 메서드 추론
destroyMethod의 기본 값은(inferred)로 생략 시,close,shutdown메서드를 자동으로 호출
어노테이션 @PostConstruct, @PreDestroy
1
2
3
4
5
6
7
8
9
10
11
12
public class NetworkClient {
@PostConstruct
public void init() {
System.out.println("초기화");
}
@PreDestroy
public void close() {
System.out.println("종료");
}
}
특징
- 최신 스프링에서 가장 권장하는 방법
- 스프링에 종속적인 기술이 아니라
JSR-250라는 자바 표준이다. 따라서 스프링이 아닌 다른 컨테이너에서도 동작 함 - 컴포넌트 스캔과 잘 어울림
- 유일한 단점은 외부 라이브러리에는 적용하지 못한다는 것
- 외부 라이브러리를 초기화, 종료 해야 하면
@Bean의 기능을 사용해야 함
참고
이 기사는 저작권자의 CC BY 4.0 라이센스를 따릅니다.