[Spring] Bean 생명주기 (1)

이연우·2025년 8월 20일

TIL

목록 보기
91/100

🔄 Bean 생명주기와 콜백

  • 콜백 메서드란?
    ⇢ Spring Bean이 생성의존성 주입초기화사용소멸
       의 과정을 거칠 때 특정 시점에서 실행되는 메서드
    👉 주로 초기화 작업(DB 연결, 리소스 준비)이나 소멸 작업(연결 해제, 파일 닫기)에 사용됨

🏗️ Spring Bean 생명주기 단계

1. 🏢 Spring Container 생성

  • ApplicationContext 또는 BeanFactory 컨테이너가 초기화됨
  • Bean 정의 정보를 읽음 (@Configuration, @ComponentScan, XML 등)

2. 🧩 Bean 인스턴스 생성

  • 컨테이너가 Bean 객체를 생성
  • 싱글톤 Bean → 애플리케이션 시작 시 미리 생성
  • 프로토타입 Bean → 요청 시점마다 생성

3. 🔗 의존성 주입 (DI)

  • 생성된 Bean에 필요한 다른 Bean을 연결
  • 생성자 주입, Setter 주입, 필드 주입 → 보통 생성자 주입 권장

💡 이 단계가 끝나야 Bean이 정상적으로 사용 가능

4. ⚡ 초기화 콜백

  • @PostConstruct 또는 afterPropertiesSet() 실행
  • DB 연결, 캐시 로딩, 설정 값 준비 같은 작업 수행

5. 🛠️ Bean 사용

  • 애플리케이션에서 자유롭게 Bean 활용
  • 비즈니스 로직 수행

6. 🧹 소멸 전 콜백

  • @PreDestroy 또는 destroy() 실행
  • 파일 닫기, DB 연결 해제 등 리소스 정리

7. 📴 Spring 종료 (Bean 소멸)

  • Bean이 메모리에서 제거됨
  • 더 이상 사용할 수 없음

📝 생명주기 요약

  1. 컨테이너 생성
  2. Bean 생성
  3. 의존성 주입
  4. 초기화 (@PostConstruct, afterPropertiesSet())
  5. 사용
  6. 소멸 (@PreDestroy, destroy())
  7. 종료

🛠️ Spring이 지원하는 콜백 방법

1. 🧩 인터페이스 구현InitializingBean, DisposableBean
2. ⚙️ @Bean 속성initMethod, destroyMethod
3. 🏷️ 어노테이션@PostConstruct, @PreDestroy


InitializingBean, DisposableBean

  • 인터페이스를 사용하여 콜백 메서드를 사용하는 방법은
    최근에는 잘 사용하지 않는 방법이지만,
    전체적인 동작 흐름코드로 이해하기 위해 만든 예시

💻 인터페이스 예시 코드

public class MyBean implements InitializingBean, DisposableBean {

    private String data;

    public MyBean() {
        System.out.println("Bean 생성자 호출");
        System.out.println("data = " + data);
    }

    public void setData(String data) {
        this.data = data;
    }

    // 초기화 콜백
    @Override
    public void afterPropertiesSet() {
        System.out.println("MyBean 초기화 - afterPropertiesSet() 호출됨");
        System.out.println("data = " + data);
    }

    // 소멸 콜백
    @Override
    public void destroy() {
        System.out.println("MyBean 종료 - destroy() 호출됨");
        data = null;
    }

    public void doSomething() {
        System.out.println("MyBean 작업 중...");
    }
}

📊 실행 흐름 출력 결과

1. 🏗️ Bean 생성자 호출

Bean 생성자 호출
data = null

2. 🔗 의존성 주입 (setData)

3. ⚡ 초기화 콜백 실행

MyBean 초기화 - afterPropertiesSet() 호출됨

4. 🛠️ Bean 사용

MyBean 작업 중...
data = Example

5. 📴 Spring 종료 직전

Example
MyBean 종료 - destroy() 호출됨
null

⚠️ 인터페이스 방식의 단점

  1. Spring 프레임워크에 강하게 의존 → 외부 라이브러리 적용 불가
  2. 메서드 이름을 강제로 사용해야 함 (afterPropertiesSet, destroy)

👉 그래서 최근에는 @PostConstruct, @PreDestroy 어노테이션 방식을 더 많이 사용함


🧠 요약 정리

📂 Spring Bean 생명주기 요약표

단계설명지원되는 콜백/방법
1. 컨테이너 생성ApplicationContext 또는 BeanFactory 생성,
Bean 정의 읽음
-
2. Bean 인스턴스 생성Bean 객체 생성
(싱글톤 → 시작 시 / 프로토타입 → 요청 시)
생성자 호출
3. 의존성 주입 (DI)필요한 Bean 연결 (생성자, Setter, 필드 주입)-
4. 초기화 콜백Bean 사용 전 준비 단계 (DB 연결, 리소스 초기화)@PostConstruct, afterPropertiesSet()
5. Bean 사용애플리케이션에서 비즈니스 로직 수행-
6. 소멸전 콜백컨테이너 종료 직전 리소스 정리
(DB 해제, 파일 닫기)
@PreDestroy, destroy()
7. Bean 소멸메모리에서 제거, 더 이상 사용 불가-

🛠️ 콜백 방식 비교

방식설명장점단점
InitializingBean, DisposableBean인터페이스 구현 후 메서드(afterPropertiesSet, destroy)
오버라이딩
코드 흐름 명확,
학습용 예제에 적합
Spring에 종속적,
메서드명 강제
@Bean(initMethod, destroyMethod)@Bean 정의 시 초기화/소멸 메서드 지정외부 라이브러리에도 적용 가능XML/자바 설정에 의존
@PostConstruct, @PreDestroy애노테이션 기반 초기화/소멸 처리가장 간단,
실무에서 권장
JSR-250 지원 필요

0개의 댓글