스프링 빈의 라이프 사이클

  1. 스프링 컨테이너 생성
  2. 스프링 빈 생성
  3. 의존 관계 주입
  4. 초기화 콜백: 빈이 생성되고 빈의 의존 관계 주입이 완료된 후 호출
  5. 로직 실행
  6. 소멸 전 콜백: 빈이 소멸되기 직전에 호출
  7. 스프링 종료

객체의 생성과 초기화를 분리하는 것이 좋다.

생성자는 필수 정보(파라미터)를 받고, 메모리를 할당해서 객체를 생성하는 책임을 가진다. 반면에 초기화는 이렇게 생성된 값들을 활용해서 외부 커넥션을 연결하는 등 무거운 동작을 수행한다. 따라서 이 두 부분을 명확하게 나누는 것이 유지 보수 관점에서 좋다.

물론 객체 내부 값들만 약간 변경하는 정도의 단순한 초기화는 생성자에서 처리하여도 된다. 하지만 외부 커넥션을 연결하는 등 무거운 동작을 수행한다면 생성자에서 처리하는 것보다 별도의 초기화 메소드로 분리하는 것이 좋다.

방법1. 인터페이스(InitializingBean, DisposableBean)

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();
		}
}

방법2. 설정 정보에 초기화 메서드, 종료 메서드 지정

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;
    }
}