[Spring] 빈 생명주기 콜백
2025. 2. 19. 06:27ㆍ코딩 도구/백엔드 개발 (Backend Development)
반응형
스프링 빈 생명주기 콜백
김영한님의 "스프링 핵심 원리 - 기본편"을 수강하고 정리했습니다.
1. 빈 생명주기란?
스프링에서 관리하는 객체(빈)는 생성부터 소멸까지의 생명주기를 가진다. 특정 작업을 실행하기 위해 빈의 초기화 및 종료 시점에 특정 로직을 수행할 수 있도록 생명주기 콜백 기능을 제공한다.
2. 빈 생명주기 콜백 방식
1) @PostConstruct와 @PreDestroy 애노테이션 활용 (권장)
스프링이 제공하는 애노테이션을 활용하여 초기화 및 종료 작업을 수행할 수 있다.
import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;
import org.springframework.stereotype.Component;
@Component
public class NetworkClient {
private String url;
public NetworkClient() {
System.out.println("생성자 호출, url = " + url);
}
public void setUrl(String url) {
this.url = url;
}
@PostConstruct
public void init() {
System.out.println("초기화 메서드 호출");
connect();
call("초기화 연결 메시지");
}
@PreDestroy
public void close() {
System.out.println("종료 메서드 호출");
disconnect();
}
public void connect() {
System.out.println("connect: " + url);
}
public void call(String message) {
System.out.println("call: " + message);
}
public void disconnect() {
System.out.println("disconnect: " + url);
}
}
2) InitializingBean, DisposableBean 인터페이스 구현
스프링에서 제공하는 인터페이스를 활용할 수도 있다. 하지만, 스프링 전용 인터페이스에 의존하게 되어 권장되지 않는다.
import org.springframework.beans.factory.InitializingBean;
import org.springframework.beans.factory.DisposableBean;
import org.springframework.stereotype.Component;
@Component
public class NetworkClient implements InitializingBean, DisposableBean {
private String url;
@Override
public void afterPropertiesSet() throws Exception {
System.out.println("초기화 메서드 호출");
connect();
call("초기화 연결 메시지");
}
@Override
public void destroy() throws Exception {
System.out.println("종료 메서드 호출");
disconnect();
}
}
단점: 스프링 인터페이스를 직접 구현해야 하므로, 스프링 프레임워크에 종속된다.
3) @Bean(initMethod, destroyMethod) 활용
수동으로 빈을 등록할 경우, @Bean 애노테이션의 initMethod와 destroyMethod 속성을 활용할 수 있다.
@Configuration
public class AppConfig {
@Bean(initMethod = "init", destroyMethod = "close")
public NetworkClient networkClient() {
return new NetworkClient();
}
}
장점: 메서드 이름을 자유롭게 설정할 수 있다.
3. 실무에서 중요한 내용
1) DB 커넥션 풀, 네트워크 연결 등의 자원 관리 필요성
- DB 커넥션 풀, 네트워크 연결 등의 자원을 초기화 및 종료할 때 반드시 활용해야 한다.
- 자원을 미리 연결해두고 종료 시 적절히 해제하지 않으면 메모리 누수 및 성능 저하가 발생할 수 있다.
2) 스프링이 제공하는 생명주기 인터페이스 활용
- 가장 권장되는 방법: @PostConstruct와 @PreDestroy 애노테이션을 활용하는 방식
- @Bean(initMethod, destroyMethod)도 유용하지만, 애노테이션 방식이 더 간결함
4. 결론
스프링 빈의 생명주기 관리는 자원 관리를 위해 필수적인 요소다. @PostConstruct와 @PreDestroy를 활용하면 간결하고 유지보수하기 쉬운 코드를 작성할 수 있다. 필요에 따라 @Bean(initMethod, destroyMethod)를 활용할 수도 있지만, 인터페이스 구현 방식(InitializingBean, DisposableBean)은 지양하는 것이 좋다.
반응형
'코딩 도구 > 백엔드 개발 (Backend Development)' 카테고리의 다른 글
[Spring] 빈 스코프 (0) | 2025.02.21 |
---|---|
[Spring] 의존관계 자동 주입 (0) | 2025.02.18 |
[Spring] 컴포넌트 스캔(Component Scan) (0) | 2025.02.17 |
[Spring] 스프링 싱글톤 컨테이너 (0) | 2025.02.16 |
[Spring] 스프링 컨테이너와 스프링 빈 (0) | 2025.02.15 |