포스트

빈 생명주기 콜백

빈 생명주기 콜백

스프링 빈의 이벤트 라이프 사이클

  1. 스프링 컨테이너 생성
  2. 스프링 빈 생성
  3. 의존 관계 주입
  4. 초기화 콜백
  5. 사용
  6. 소멸전 콜백
  7. 스프링 종료

💡 객체의 생성과 초기화를 분리하자

생성자는 필수 정보를 받고, 메모리를 할당해서 객체를 생성하는 책임을 가집니다. 반면에 초기화는 이렇게 생성된 값들을 활용해서 외부 커넥션을 연결하는 등 무거운 동작을 수행합니다.

따라서 생성자 안에서 무거은 초기화 작업을 함께 하는 것 보다는 객체를 생성하는 부분과 초기화 하는 부분을 명확하게 나누는 것이 유지보수 관점에서 좋습니다.

인터페이스 InitalizingBean, DisposableBean

1
2
3
4
5
6
7
8
9
10
11
12
public class NetworkClient implements InitializingBean, DisposableBean {

  @Override
  public void afterPropertiesSet() throws Exception {
    System.out.println("초기화");
  }

  @Override
  public void destroy() throws Exception {
    System.out.println("종료");
  }
}
  • InitializingBean: 초기화 인터페이스
  • DisposableBean: 종료 인터페이스

단점

  • 이 인터페이스는 스프링 전용 인터페이스이기 때문에 해당 코드가 스프링 전용 인터페이스에 의존
  • 초기화, 소멸 메서드의 이름을 변경할 수 없음
  • 내가 코드를 고칠 수 없는 외부 라이브러리에 적용할 스 없음

빈 등록 초기화, 소멸 메서드 지정

1
2
3
4
5
6
7
8
9
10
public class NetworkClient {

  public void init() {
    System.out.println("초기화");
  }

  public void close() {
    System.out.println("종료");
  }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
public class BeanLifeCycleTest {

  @Configuration
  static class LifeCycleConfig {

    @Bean(initMethod = "init", destroyMethod = "close")
    public NetworkClient newNetworkClient() {
      NetworkClient networkClient = new NetworkClient();
      networkClient.setUrl("http://hello-spring.com");
      return networkClient;
    }
  }
}

특징

  • 메서드 이름을 자유롭게 줄 수 있음
  • 스프링 빈이 스프링 코드에 의존하지 않음
  • 코드가 아니라 설정 정보를 사용하기 때문에 코드를 고칠 수 없는 외부 라이브러리에도 초기화, 종료 메서드를 적용할 수 있음

종료 메서드 추론

  • destroyMethod의 기본 값은 (inferred)로 생략 시, close, shutdown 메서드를 자동으로 호출

어노테이션 @PostConstruct, @PreDestroy

1
2
3
4
5
6
7
8
9
10
11
12
public class NetworkClient {

  @PostConstruct
  public void init() {
    System.out.println("초기화");
  }

  @PreDestroy
  public void close() {
    System.out.println("종료");
  }
}

특징

  • 최신 스프링에서 가장 권장하는 방법
  • 스프링에 종속적인 기술이 아니라 JSR-250라는 자바 표준이다. 따라서 스프링이 아닌 다른 컨테이너에서도 동작 함
  • 컴포넌트 스캔과 잘 어울림
  • 유일한 단점은 외부 라이브러리에는 적용하지 못한다는 것
  • 외부 라이브러리를 초기화, 종료 해야 하면 @Bean의 기능을 사용해야 함

참고

이 기사는 저작권자의 CC BY 4.0 라이센스를 따릅니다.