230428 Spring bean container 생성부터 스프링 종료까지의 사이클

Jongleee·2023년 4월 28일
0

TIL

목록 보기
245/576

스프링 Bean의 LifeCycle

스프링 IoC 컨테이너 생성 → 스프링 빈 생성 → 의존관계 주입 → 초기화 콜백 메소드 호출 → 사용 → 소멸 전 콜백 메소드 호출 → 스프링 종료

  1. 스프링 IoC컨테이너가 생성되면 Component-Scan으로 Bean을 등록
  2. IoC컨테이너에서 의존성을 주입
  3. 스프링은 Bean에게 콜백 메서드를 통해 초기화 시점을 알려주며 스프링 컨테이너가 종료되기 직전에도 소멸 콜백 메서드를 통해 소멸 시점을 알려주고 스프링이 종료

스프링 빈 생명주기 콜백 관리방법

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

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

  3. @PostConstruct, @PreDestroy 어노테이션 지원

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

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

InitalizingBean은 afterPropertiesSet() 메소드로 초기화를 지원 (의존관계 주입이 끝난 후에 초기화 진행)
DisposableBean은 destory() 메소드로 소멸을 지원 (Bean 종료 전에 마무리 작업, 예를 들면 자원 해제(close() 등))

  • 단점
    InitalizingBean, DisposableBean 인터페이스는 스프링 전용 인터페이스
    해당 코드가 인터페이스에 의존
    초기화, 소멸 메소드를 오버라이드 하기 때문에 메소드명을 변경할 수 없음
    코드를 커스터마이징 할 수 없는 외부 라이브러리에 적용 불가능
    스프링 초창기에 나온 방법들이며, 지금은 거의 사용하지 않음

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

public class SettingBean {
 
    public void initialize() throws Exception {
        // 초기화 콜백 (의존관계 주입이 끝나면 호출)
    }
 
    public void close() throws Exception {
        // 소멸 전 콜백 (메모리 반납, 연결 종료와 같은 과정)
    }
}
 
@Configuration
class LifeCycleConfig {
 
    @Bean(initMethod = "initialize", destroyMethod = "close")
    public SettingBean settingBean() {
        // 생략
    }
}
  • 장점
    메소드명 자유롭게 부여 가능
    스프링 코드에 의존 X
    설정 정보를 사용하기 때문에 코드를 커스터마이징 할 수 없는 외부라이브러리에서도 적용 가능
  • 단점
    Bean 지정시 initMethod와 destoryMethod를 직접 지정해야 하는 번거로움
  • @Bean의 destoryMethod 속성의 특징
    라이브러리는 대부분 종료 메소드명이 close 혹은 shutdown
    @Bean의 destoryMethod는 기본값이 inferred(추론)으로 등록 즉, close, shutdown이라는 이름의 메소드가 종료 메소드라고 추론하고 자동으로 호출
    추론 기능을 사용하기 싫다면 명시적으로 destroyMethod=""으로 지정해야 함

3. @PostConstruct, @PreDestroy 어노테이션

import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;
 
public class AnnotationBean {
 
    @PostConstruct
    public void initialize() throws Exception {
        // 초기화 콜백 (의존관계 주입이 끝나면 호출)
    }
 
    @PreDestroy
    public void close() throws Exception {
        // 소멸 전 콜백 (메모리 반납, 연결 종료와 같은 과정)
    }
}
  • 장점
    최신 스프링에서 가장 권장하는 방법
    어노테이션 하나만 붙이면 되므로 매우 편리
    패키지가 javax.annotation.xxx로 스프링에 종속적인 기술이 아닌 JSR-250이라는 자바 표준이므로 스프링이 아닌 다른 컨테이너에서도 동작
    컴포넌트 스캔과 잘어울림
  • 단점
    커스터마이징이 불가능한 외부 라이브러리에서 적용이 불가능
    외부 라이브러리에서 초기화, 종료를 해야 할 경우 @Bean의 initMethod와 destoryMethod 속성을 사용해야 함

0개의 댓글