상세 컨텐츠

본문 제목

Bean Lifecycle

Spring Boot

by Wanderer Kim 2024. 8. 18. 17:55

본문

728x90

스츠링에서는 IoC 컨테이너가 Bean 객체들을 책입지고 의존성을 관리한다.

여기서 객체들을 관리한다는 것은 객체의 생성부터 소멸까지의 생명주기 관리를 개발자가 아닌 IoC 컨테이너가 대신 해준다는 의미이다.

 

스프링 빈 라이프 사이클

스프링 Bean의 LifeCycle을 아래와 같다.

스프링은 의존관계 주입이 완료되면 스프링 빈에게 콜백 메소드를 통해 초기화 시점을 알려주며, 스프링 컨테이너가 종료되기 직전에도 소멸 콜백 메소드를 통해 소멸 시점을 알려준다.

 

빈 생명주기 콜백 3가지 방법

스프링은 3가지 방법으로 빈 생명주기 콜백을 관리한다.

 

  1. 인터페이스(InitializingBean, DisposableBean)
  2. 설정 정보에 초기화 메소드, 종료 메소드 지정
  3. @PostConstruct, @PreDestroy annotaion 지원

인터페이스(InitializingBean, DisposableBean)

public class ExampleBean implements InitializingBean, DisposableBean {     
	@Override    public void afterPropertiesSet() throws Exception {
    // 초기화 콜백 (의존관계 주입이 끝나면 호출)    
    }     
    
    @Override    public void destroy() throws Exception {
    // 소멸 전 콜백 (메모리 반납, 연결 종료와 같은 과정)    
    }
 }
  • InitializingBean은 afterPropertiesSet() 메소드로 초기화를 지원한다. (의존관계 주입이 끝난 후에 초기화 진행)
  • DisposableBean은 destroy() 메소드로 소명을 지원한다. (Bean 종료 전에 마무리 작업, 예를 들면 자원 해제 등)

단점

  • 초기화, 소멸 메소드를 오버라이드 하기 때무넹 메소드명을 변경할 수 없다.
  • 코드를 커스터마이징 할 수 없는 외부 라이브러리에 적용 불가능하다.

인터페이스를 사용하는 초기화 및 종료 방법은 스프링 초창기에 나온 방법들이며 지금은 거의 사용하지 않는다.

 

설정 정보에서 초기화 메소드, 종료 메소드 지정

public class ExampleBean {     
	public void initialize() throws Exception {        
    // 초기화 콜백 (의존관계 주입이 끝나면 호출)    
    }     
    
    public void close() throws Exception {        
    // 소멸 전 콜백 (메모리 반납, 연결 종료와 같은 과정)    
    }
} 

@Configurationclass
LifeCycleConfig {     
	@Bean(initMethod = "initialize", destroyMethod = "close")    
    public ExampleBean exampleBean() {        // 생략    }
}

장점

  • 메소드명을 자유롭게 부여 가능하다.
  • 스프링 코드에 의존하지 않는다.
  • 설정 정보를 사용하기 때문에 코드를 커스터마이징 할 수 없는 외부라이브러리에서도 적용 가능하다.

단점

  • Bean 지정 시 initMethod와 destroyMethod를 직접 지정해야 하기에 번거롭다.

@Bean의 destroyMethod 속성의 특징

  • 라이브러리는 대부분 종료 메소드명이 close 혹은 shutdown이다. @Bean의 destroyMethod는 기본값이 inferred으로 등록되어 있다. 즉, close, shutdown이라는 이름의 메소드가 종료 메소드라고 추론하고 자동으로 호출해준다. 따라서 종료 메소드를 따로 부여하지 않더라도 잘 작동한다.
  • 추론 기능을 사용하기 싫다면 명시적으로 destroyMethod=""으로 지정해줘야 한다.

 

@PostConstruct, @PreDestroy 어노테이션

import jakarata.annotation.PostConstruct;
import jakarata.annotation.PreDestroy; 

public class ExampleBean {
    @PostConstruct    
    public void initialize() throws Exception {        
    // 초기화 콜백 (의존관계 주입이 끝나면 호출)    
    }     
    
    @PreDestroy    
    public void close() throws Exception {        
    // 소멸 전 콜백 (메모리 반납, 연결 종료와 같은 과정)    
    }
}

장점

  • 최신 스프링에서 권장하는 방법이다.
  • 어노테이션 하나만 붙이면 되므로 매우 편리하다.
  • 스프링에 종속적인 기술이 아닌 JSR-250이라는 자바 표준이다. 따라서 스프링이 아닌 다른 컨테이너에서도 동작한다.
  • 컴포넌트 스캔과 잘 어울린다.

단점

  • 커스터마이징이 불가능한 외부 라이브러리에서 적용이 불가능하다.
반응형

관련글 더보기

댓글 영역