반응형
"김영한 스프링 핵심 원리 기본편" 내용을 기반으로 작성한 내용입니다.
📝Bean의 라이프 사이클 관리
Bean의 라이프 사이클은 아래와 같다.
스프링 컨테이너 생성 → 스프링 빈 생성 → 의존관계 주입 → 초기화 콜백 → 사용 → 소멸전 콜백 → 스프링 종료
다양한 방법이 있는데 필요한 것만 소개합니다.
방법1 (initMethod, destroyMethod)
public class NetworkClient {
private String url;
public NetworkClient() {
System.out.println("생성자 호출, url = " + url);
}
public void setUrl(String url) {
this.url = url;
}
//서비스 시작시 호출
public void connect() {
System.out.println("connect: " + url);
}
public void call(String message) {
System.out.println("call: " + url + " message = " + message);
}
//서비스 종료시 호출
public void disConnect() {
System.out.println("close + " + url);
}
public void init() {
System.out.println("NetworkClient.init");
connect();
call("초기화 연결 메시지");
}
public void close() {
System.out.println("NetworkClient.close");
disConnect();
}
}
// Bean 관리
@Configuration
static class LifeCycleConfig {
@Bean(initMethod = "init", destroyMethod = "close")
public NetworkClient networkClient() {
NetworkClient networkClient = new NetworkClient();
networkClient.setUrl("http://hello-spring.dev");
return networkClient;
}
}
Spring에서 제공하는 기능을 사용합니다. initMethod로 초기화 콜백을 설정할 수 있고 destoryMethod를 통해 종료 콜백을 설정할 수 있습니다. 하지만 스프링 전용이라 스프링에 의존적입니다.
방법2 (@PreConstruct, @PostConstruct)
public class NetworkClient {
private String url;
public NetworkClient() {
System.out.println("생성자 호출, url = " + url);
}
public void setUrl(String url) {
this.url = url;
}
//서비스 시작시 호출
public void connect() {
System.out.println("connect: " + url);
}
public void call(String message) {
System.out.println("call: " + url + " message = " + message);
}
//서비스 종료시 호출
public void disConnect() {
System.out.println("close + " + url);
}
@PostConstruct
public void init() {
System.out.println("NetworkClient.init");
connect();
call("초기화 연결 메시지");
}
@PreDestroy
public void close() {
System.out.println("NetworkClient.close");
disConnect();
}
}
// Bean 관리
@Configuration
static class LifeCycleConfig {
@Bean
public NetworkClient networkClient() {
NetworkClient networkClient = new NetworkClient();
networkClient.setUrl("http://hello-spring.dev");
return networkClient;
}
}
@PreDestory로 초기화 작업설정을 @PostConstruct로 종료 작업설정을 할 수 있습니다.
해당 어노테이션은 Java에서 제공하는 기능으로 스프링에 의존적이지 않습니다.
방법2를 많이 씁니다. 만약 외부 라이브러리에다가 적용이 필요한 경우(해당 외부라이브러리를 직접 수정할 수 없기 때문에)는 Bean을 따로 생성해서 거기에서 외부라이브러리 호출한 다음 새로운 Bean을 만들어서 사용하면 될 거 같다.
📝참고
객체 생성할 때 생성자 작업하고 초기화 작업은 분리시키는게 유지보수에 좋다. 생성자 작업의 경우는 필드 Injection을 하고 초기화 작업의 경우 DB Connection따위와 같은 작업이 들어간다.
반응형