객체의 생성과 초기화를 분리하는 것이 좋다.
생성자는 필수 정보(파라미터)를 받고, 메모리를 할당해서 객체를 생성하는 책임을 가진다. 반면에 초기화는 이렇게 생성된 값들을 활용해서 외부 커넥션을 연결하는 등 무거운 동작을 수행한다. 따라서 이 두 부분을 명확하게 나누는 것이 유지 보수 관점에서 좋다.
물론 객체 내부 값들만 약간 변경하는 정도의 단순한 초기화는 생성자에서 처리하여도 된다. 하지만 외부 커넥션을 연결하는 등 무거운 동작을 수행한다면 생성자에서 처리하는 것보다 별도의 초기화 메소드로 분리하는 것이 좋다.
public class NetworkClient implements InitializingBean, DisposableBean {
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("connect: " + url);
}
// 데이터베이스 초기화
public void call(String message) {
System.out.println("call: " + url + " message = " + message);
}
// 데이터베이스 연결 종료
public void disConnect() {
System.out.println("close + " + url);
}
// InitializingBean 초기화 콜백
@Override
public void afterPropertiesSet() throws Exception {
connect();
call("초기화 연결 메시지");
}
// DisposableBean 소멸 전 콜백
@Override
public void destroy() throws Exception {
disConnect();
}
}
public class NetworkClient implements InitializingBean, DisposableBean {
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("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();
}
}
@Configuration
static class LifeCycleConfig {
@Bean(initMethod = "init", destroyMethod = "close")
public NetworkClient networkClient() {
NetworkClient networkClient = new NetworkClient();
networkClient.setUrl("<http://hello-spring.dev>");
return networkClient;
}
}