[TIL] 스프링 빈 생명주기 - Spring Bean Lifycycle

최은창·2025년 12월 29일
post-thumbnail

01. 개요

  • Bean의 생명주기를 통해 그 사이사이를 커스터마이징 할 수 있다.
  • 서버가 시작하면서 Bean 설정 초기화와 종료 전 수집 관련해서 꼭 필요한 역할

02. Bean

빈(Bean)은 스프링 컨테이너에 의해 관리되는 재사용 가능한 소프트웨어 컴포넌트

  • Bean은 Spring Framework에서 매우 중요한 개념 중 하나
    • Spring 컨테이너에 의해 관리되는 객체를 의미
    • Spring 애플리케이션에 모든 객체가 Bean으로 관리될 수 있다.
    • Bean은 애플리케이션의 다양한 컴포넌트들 간의 의존성을 정의하고 관리하는 역할
@Configuration
public class AppConfig{

	@Bean
	public MyBean myBean() {
		return new MyBean();
	}
}
  1. Spring 컨테이너에 의해 관리됨
    • Bean은 Spring IoC(Inversion of Control) 컨테이너에 의해 생성되고, 관리된다.
  2. 싱글톤 기본 스코프
    • 기본적으로 Spring Bean은 싱글톤 스코프를 가진다.
    • 동일한 Bean 정의에 대해 Spring 컨테이너는 단일 인스턴스만을 생성, 애플리케이션에서 공유
    • 싱글톤 외 프로토타입, 요청, 세션 등 다양한 스코프가 존재
  3. 의존성 주입 (Dependency Injection)
    • Spring은 의존성 주입을 통해 Bean들 간의 의존 관계를 설정
    • 이를 통해 객체 간의 결합도를 낮추고 코드의 유연성과 테스트 용이성을 높임
  4. 설정 방식의 유연성
    • Spring Bean은 XML, Java Config, 어노테이션 등 다양한 방법으로 설정
      • @Component , @Service , @Repository , @Controller 등을 통해 Spring이 자동으로 해당 클래스를 Bean으로 등록

03. 생명주기(Bean Lifecycle)

  • 싱글톤 타입의 스프링 빈의 생명 주기
    • 객체 생성 → 의존성 주입 → Aware → 초기화 전 처리초기화초기화 후 처리 → 사용 가능
  • 이 과정이 완료되면, Bean은 사용 가능한 상태가 되어 애플리케이션에 사용 됨
  • Spring 컨테이너가 종료 될 때, Bean이 DisposableBean 인터페이스를 구현한 경우 Destroy()메서드가 호출되거나 Destroy-method로 지정된 메서드가 호출되어 Bean이 소멸됨

04. Bean의 생명주기 콜백

  • Bean 생명주기 중간중간에 원하는 코드를 심을 수 있음
  • 크게 초기화 콜백인 @PostConstruct 와 소멸 전 콜백인 @PreDestroy 가 있음

@PostConstruct

  • @PostConstruct 는 Spring 에서 빈(Bean)의 초기화 작업을 수행할 때 사용하는 애노테이션
  • 빈이 생성되고, 모든 의존성 주입이 완료된 후 자동 호출됨
    • 이를 통해 빈의 초기화 과정에서 추가적인 설정이나 초기화 작업을 수행할 수 있음
      • 예) API_KEY 를 DB 호출이나 외부 URL을 통해 얻어야 하는 경
@Component
public class ExternalApiConnector{
	private final ApiClient apiClient;
	private String API_KEY;
	
	public ExternalApiConnector(ApiClient apiClient){
		this.apiClient = apiClient;
	}
	
	@PostConstruct
	public void initializeConnection(){
		this.API_KEY = apiClient.getApiKey();
	}
	
	public void callExternalService(){
		apiClient.callService(API_KEY);
	}
}

@PreDestroy

  • @PreDestroy 는 Spring에서 빈(Bean)이 소멸되기 직전에 호출되는 메서드를 지정하는 애노테이션
  • 애플리케이션 종료 전에 꼭 처리해야 하는 작업을 수행할 때 사용
    • 리소스 정리, 연결 종료 등
  • @PreDestroy@PostConstruct 와 반대로, 빈이 컨테이너에서 제거되기 전에 마지막으로 실행되어야 하는 작업을 정의
    • 예) 캐시에 저장된 데이터 저장
@Componet
public class CacheService{
	private Map<String, String> cache = new HashMap<>();
	
	pubilc void putInCache(String key, String value) {
		cache.put(key, value);
	}
	
	public String getFromCache(String key){
		return cache.get(key);
	}
	
	@PreDestroy
	public void saveCacheTodatabase(){
		// 캐시 데이터를 데이터베이스에 저장하는 로직
		System.out.println("Saving cache data to database...");
		// 실제 데이터베이스 저장 로직
	}
	
}

05. Spring이 자동으로 호출하는 이유

  • Spring 컨테이너는 애플리케이션의 실행 중에 빈을 관리하며, 각 빈의 생명주기를 제어
  • 이 생명 주기 동안 다양한 단계에서 특정 작업을 자동으로 수행할 수 있는 메커니즘을 제공
    • @PostConstruct , @PreDestroy

빈의 생명주기와 애노테이션

  1. 빈의 생성(Instantiaion)
    • 빈이 생성되고, 생성자가 호출
  2. 의존성 주입(Dependency Injecton)
    • 빈에 필요한 의존성이 주입, 생성자, 필드, setter 주입 등 이 단계에서 이루어짐
  3. 초기화(Initialization)
    • 빈의 모든 의존성이 주입된 후, 빈이 사용되기 전에 추가적인 초기화 작업이 필요
    • 이때 @PostContruct 애노테이션이 붙은 메서드가 자동으로 호출
    • 빈이 완전히 초기화된 상태에서 호출되므로, 초기화 작업을 수행하기에 적합
  4. 사용(Usage)
    • 빈이 초기화된 후, 애플리케이션에서 빈이 실제로 사용
  5. 소멸(Destruction)
    • 애플리케이션이 종료되거나 빈이 컨테이너에서 제거될 때, 리소스를 해제하거나 정리하는 작업이 필요
    • 이때 @PreDestroy 애노테이션이 붙은 메서드가 자동으로 호출
@Componet
public class MyService{
	@PostConstruct
	public void init(){
		// 이 메서드는 빈이 생성되고 모든 의존성이 주입된 후 자동으로 호출
		System.out.println("MyService bean is fully initialized");
	}
}
	
@Component
pubilc class MyService{
	public void cleanup(){
		// 이 메서드는 빈이 소멸되기 직전에 자동으로 호출
		System.out.println("MyService bean is about to be destoryed");
	}
}

자동 호출의 이유와 장점

  1. 명시적 관리
    • 개발자가 명시적으로 특정 작업이 필요한 시점을 지정할 수 있음
      • 초기화 작업 @PostConstruct
      • 정리 작업 @PreDestroy
  2. 코드의 간결성
    • 초기화 및 정리 작업을 생성자나 소멸자에서 관리하지 않아도 되므로 코드가 간결해짐
    • 객체 생성 및 소멸 시 수행 할 작업을 분리하여 관리할 수 있어 유지보수성이 향상됨
  3. 의존성 주입 후 작업 가능
    • @PostConstruct 메서드는 모든 의존성 주입이 완료된 후에 호출됨
    • 주입된 객체를 안전하게 사용할 수 있음

06. 결론

  • @PostConstruct@PreDestroy 와 같은 애노테이션은 Spring에서 빈의 생명주기 중 특정 시점에서 자동으로 호출됨
  • 이를 통해 빈의 초기화 및 정리 작업을 명확하고 간편하게 수행할 수 있음
  • 개발자가 빈의 생명주기를 쉽게 관리할 수 있도록 도와줌
  • Spring은 이러한 메서드들을 자동으로 호출하기 때문에, 필요한 로직을 정의하는 것만으로 빈의 생명주기 내에서 필요한 작업을 처리할 수 있음
profile
비슷한 어려움을 겪는 누군가에게 도움이 되길

0개의 댓글