[Spring] 빈 생명주기 콜백(Bean Lifecycle Callback)
Updated:
1. 개요
빈 생명주기 콜백을 이용하면 빈을 생성하여 의존관계를 주입하고 실제로 사용하기 전, 빈의 사용이 끝나고 소멸시키기 전 이렇게 두 가지 경우에 원하는 동작을 하도록 구현할 수 있다. DB의 경우를 예로들면 DB를 사용하기 전 커넥션을 맺고, 사용이 끝나면 커넥션을 종료시킬 수 있다. 이번에는 빈 생명주기 콜백에 대해 알아보도록 하자.
스프링 빈 라이프사이클 : 스프링 컨테이너 생성 → 스프링 빈 생성 → 의존관계 주입 → 초기화 콜백 → 사용 → 소멸전 콜백 → 스프링 종료
2. 인터페이스 이용
InitializingBean 인터페이스의 afterPropertiesSet()를 구현하여 초기화 콜백, DisposableBean 인터페이스의 destroy()를 구현하여 소멸전 콜백을 이용할 수 있다. 메서드의 이름을 변경할 수 없고, 외부 라이브러리에 적용할 수 없다는 단점이 있다.
[DBService.java]
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
import org.springframework.beans.factory.DisposableBean;
import org.springframework.beans.factory.InitializingBean;
import org.springframework.stereotype.Service;
@Service
public class DBService implements InitializingBean, DisposableBean {
public DBService() {
System.out.println("생성자 호출");
}
@Override
public void afterPropertiesSet() throws Exception {
System.out.println("afterPropertiesSet() 호출");
}
@Override
public void destroy() throws Exception {
System.out.println("destroy() 호출");
}
}
[실행 결과]
3. 설정파일 이용
스프링 설정 파일을 이용하여 빈 등록 시, initMethod, destroyMethod 속성을 이용하여 초기화, 소멸전 콜백을 이용할 수 있다. 메서드 이름을 원하는대로 변경할 수 있고, 코드의 변경없이 설정 파일로 초기화, 소멸전 콜백을 적용할 수 있고, 외부 라이브러리에도 적용 가능하다.
[DBService.java]
1
2
3
4
5
6
7
8
9
10
11
12
13
14
public class DBService {
public DBService() {
System.out.println("생성자 호출");
}
public void init() {
System.out.println("init() 호출");
}
public void destroy() {
System.out.println("destroy() 호출");
}
}
[AppConfig.java]
1
2
3
4
5
6
7
8
9
10
11
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class AppConfig {
@Bean(initMethod = "init", destroyMethod = "destroy")
public DBService dbService() {
return new DBService();
}
}
[실행 결과]
4. Annotation 이용
@PostConstruct, @PreDestroy를 이용하여 초기화, 소멸전 콜백을 이용할 수 있고, 스프링에서 권장하는 방법으로 가장 편리하게 사용할 수 있는 방법이다. 외부 라이브러리에는 적용하지 못한다는 단점이 있는데, 외부 라이브러리는 설정파일 이용방식을 이용하자.
[DBService.java]
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
@Service
public class DBService {
public DBService() {
System.out.println("생성자 호출");
}
@PostConstruct
public void init() {
System.out.println("init() 호출");
}
@PreDestroy
public void destroy() {
System.out.println("destroy() 호출");
}
}
[실행 결과]
Leave a comment