Spring

[Spring 완전 정복 시리즈] 20편 - 빈 생명주기 콜백과 초기화 전략 정리

dev-nadan 2025. 7. 31. 17:07

빈 생명주기란?

스프링에서 하나의 빈은 다음과 같은 라이프사이클을 가진다.

객체 생성 → 의존관계 주입 → 초기화 콜백 → 사용 → 소멸 전 콜백

초기화 작업은 객체가 의존관계 주입이 끝난 후에 실행되어야 하며, 소멸 작업은 스프링 컨테이너가 종료되기 직전에 실행된다.


왜 객체 생성과 초기화를 분리해야 할까?

  • 객체 생성 시점: new 키워드로 메모리 할당. 이 시점엔 의존관계가 주입되지 않음
  • 초기화 시점: 의존관계가 모두 주입된 이후, 실제 외부 연결 등 무거운 작업 수행

 

따라서 생성자에서는 객체 생성만 담당하고, 외부 커넥션이나 설정은 따로 초기화 메서드로 분리하는 것이 바람직하다.


생명주기 콜백 지원 방식 3가지

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

public class NetworkClient implements InitializingBean, DisposableBean {
    @Override
    public void afterPropertiesSet() throws Exception {
        // 초기화 로직
    }

    @Override
    public void destroy() throws Exception {
        // 종료 로직
    }
}

 

  • 단점: 스프링 전용 인터페이스에 의존 → 코드가 스프링에 종속됨
  • 비추천: 외부 라이브러리에 적용 불가, 메서드명 고정

2. @Bean 설정 정보에 메서드 지정

@Bean(initMethod = "init", destroyMethod = "close")
public NetworkClient networkClient() {
    return new NetworkClient();
}

 

  • 장점: 메서드명을 자유롭게 설정 가능
  • 외부 라이브러리에도 적용 가능 (코드 수정 없이)
  • 추론 기능: destroyMethod는 기본값으로 "inferred"이며, close() 또는 shutdown() 자동 호출

3. @PostConstruct, @PreDestroy 애노테이션 방식

@PostConstruct
public void init() {
    // 초기화 작업
}

@PreDestroy
public void close() {
    // 종료 작업
}

 

  • 가장 권장되는 방법
  • Java 표준 애노테이션 (javax → jakarta)
  • 컴포넌트 스캔과 궁합이 좋음
  • 단점: 외부 라이브러리에는 적용 불가

정리

장점 단점 추천 여부
InitializingBean, DisposableBean 구조 명확 스프링에 종속됨
@Bean(initMethod, destroyMethod) 외부 라이브러리에 적합 코드 외부 설정 필요
@PostConstruct, @PreDestroy 가장 간단, 표준 코드 수정 불가시 사용 못 함