빈 생명주기란?
스프링에서 하나의 빈은 다음과 같은 라이프사이클을 가진다.
객체 생성 → 의존관계 주입 → 초기화 콜백 → 사용 → 소멸 전 콜백
초기화 작업은 객체가 의존관계 주입이 끝난 후에 실행되어야 하며, 소멸 작업은 스프링 컨테이너가 종료되기 직전에 실행된다.
왜 객체 생성과 초기화를 분리해야 할까?
- 객체 생성 시점: 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 | 가장 간단, 표준 | 코드 수정 불가시 사용 못 함 | ✅ |
'Spring' 카테고리의 다른 글
[Spring 완전 정복 시리즈] 22편 - 빈 스코프 완전 정복 (2): 웹 스코프와 Provider/프록시 패턴 (0) | 2025.08.01 |
---|---|
[Spring 완전 정복 시리즈] 21편 - 빈 스코프 완전 정복 (1): 싱글톤과 프로토타입 (0) | 2025.08.01 |
[Spring 완전 정복 시리즈] 19편 - 자동 주입 고급 기능과 전략 패턴 적용법 (3) | 2025.07.30 |
[Spring 완전 정복 시리즈] 18편 - 의존관계 자동 주입 방식 완전 정리 (0) | 2025.07.30 |
[Spring 완전 정복 시리즈] 17편 - 다양한 의존관계 자동 주입 방식 (1) | 2025.07.29 |