[Spring] 스프링의 빈(Bean) 생명주기 콜백의 개념 및 필요성
1. 빈 생명주기 콜백의 필요성
보통 프로젝트를 하다보면 데이터베이스 커넥션 풀과 같이
애플리케이션 시작 시점에 특정 작업을 수행하고 종료되는 시점에도 작업을 해야하는 경우가 있다.
이럴 때 빈 생명주기를 알고 있다면 유용하게 활용할 수 있다.
2. 빈 생명주기 필요한 경우의 예제
실제로 간단한 예제를 통해 필요한 경우를 예시로 생각해보자.
다음은 네트워크를 연결하는 경우의 예시이다.
(실제로 연결하지는 않고 간단하게 로그만 찍어보았다)
public class NetworkClient {
private String url;
public NetworkClient() {
System.out.println("생성자 호출, url: "+url);
connect();
call("초기화 메시지");
}
public void setUrl(String url) {
this.url = url;
}
// 애플리케이션 시작시 호출.
public void connect() {
System.out.println("연결할 url = " + url);
}
//서비스중에 호출.
public void call(String message) {
System.out.println("url: "+url+"/message = " + message);
}
//서비스 종료시 호출.
public void disconnect() {
System.out.println("서비스 종료!");
}
}
이렇게 객체를 만들어보고 아래와 같이 테스트를 한번 해보기로 한다.
public class BeanTest {
@Test
public void beanTest() {
ConfigurableApplicationContext ac = new AnnotationConfigApplicationContext(Config.class);
NetworkClient client = ac.getBean(NetworkClient.class);
ac.close();
}
@Configuration
static class Config {
@Bean
public NetworkClient networkClient() {
NetworkClient networkClient = new NetworkClient();
networkClient.setUrl("http://test.com");
return networkClient;
}
}
}
위의 코드를 돌리면 당연히 아래와 같이 로그가 찍힌다.
위의 결과에서 볼 때 어찌보면 당연한 이야기지만
객체를 생성할 때는 url이 없고 생성이 끝나고 외부에서 setter를 통해 데이터를 주입받아야 url이 생기게 된다.
스프링의 빈은 기본적으로 객체생성->의존관계 주입 과 같은 라이프사이클을 가진다.
객체를 생성하고 의존관계 주입이 끝난 다음에야 데이터를 사용할 수 있는 준비가 완료되고 따라서 초기화 작업은 url이 있는 상태, 즉 의존관계 주입이 끝난 다음에 호출해야 한다.
그러면 여기서 우리가 의존관계 주입이 끝나는 시점을 어떻게 알 수 있을까?
이 때 스프링 빈의 생명주기를 알고 콜백을 알면 유용하게 활용가능하다.
스프링 빈의 라이프 사이클은 다음과 같이 진행된다.
스프링 컨테이너 생성-> 스프링 빈 생성(Constructor Injection)-> 의존관계 주입(Setter Injection 및 Field Injection이 일어남)-> 초기화 콜백 사용-> 소멸전 콜백->스프링 종료
여기서 중요한 부분은 콜백부분이라고 할 수 있다.
- 초기화 콜백: 빈이 생성되고, 빈의 의존관계 주입이 완료된 후 호출
- 소멸전 콜백: 빈이 소멸되기 직전에 호출
그렇다면 이 콜백은 구체적으로 어떻게 사용하면 좋을까?
스프링은 크게 3가지 방법으로 빈 생명주기 콜백을 지원한다.
- 인터페이스(InitializingBean, DisposableBean)
- 설정 정보에 초기화 메서드, 종료 메서드 지정
- @PostConstruct, @PreDestory 애노테이션 지원
각각에 대한 사용방법은 다음 포스팅에서 알아보도록 한다.
스프링 빈(Bean)을 초기화 및 종료하는 3가지 방법(Bean 생명주기 콜백)
Reference
이 포스팅은 아래의 강좌를 참고하여 만들어졌습니다.
- 스프링 핵심 원리-기본편
'Backend > Spring' 카테고리의 다른 글
ipTIME의 DDNS를 이용하여 운영 서버 구축하기(포트포워딩) (1) | 2020.10.30 |
---|---|
[Spring]빈 스코프(Bean Scope)의 종류 및 개념 (0) | 2020.10.27 |
[Spring]스프링 빈(Bean)을 초기화 및 종료하는 3가지 방법(Bean 생명주기 콜백) (0) | 2020.10.27 |
[SpringBoot] ajax로 사진 업로드와 삭제, 썸네일 미리보기 기능 구현하기 (4) | 2020.07.30 |
[Spring]게시글 사진 업로드기능 구현(MultipartHttpServletRequest) (0) | 2020.07.16 |