Spring/강의

[📘 심화 Spring] 3-1. Spring Bean 생명주기

가지코딩 2025. 6. 9. 20:47

📘 목차

  1. Bean 생명주기
  2. 생명주기 콜백 종류
  3. Bean Scope와 생명주기

1. Bean 생명주기

Spring이 Bean을 생성하고 의존성을 주입한 뒤, 초기화 작업을 수행하고, 필요 시 종료 메서드를 호출하는 일련의 과정을 의미한다.

 

생명주기 요약

  1. Spring Container 초기화
  2. Bean 인스턴스 생성
  3. 의존성 주입 (DI)
  4. 초기화 메서드 호출 (@PostConstruct, afterPropertiesSet())
    • Bean 생성 및 의존관계 설정이 완료된 후 호출
  5. Bean 사용
  6. 소멸 메서드 호출 (@PreDestroy, destroy())
    • Bean이 소멸되기 직전에 호출
  7. Bean 소멸

2. 생명주기 콜백 종류

Spring은 Bean의 초기화와 소멸 시점에 사용자 정의 로직을 삽입할 수 있도록 다양한 콜백 수단을 제공한다.

 

 

InitializingBean & DisposableBean 인터페이스

  • InitializingBean은 초기화 콜백을 제공한다.
  • DisposableBean은 소멸 콜백을 제공한다.
  • 단점: Spring에 종속적이며, 하나의 Bean이 여러 인터페이스를 동시에 구현하면 관리가 복잡해진다.
public class MyBean implements InitializingBean, DisposableBean {

    @Override
    public void afterPropertiesSet() {
        // 초기화 로직
        System.out.println("afterPropertiesSet 호출됨");
    }

    @Override
    public void destroy() {
        // 소멸 로직
        System.out.println("destroy 호출됨");
    }
}

 

 

@PostConstruct, @PreDestroy 어노테이션

  • Java 표준 어노테이션으로 Spring뿐만 아니라 다른 프레임워크에서도 사용 가능하다.
  • 권장 방식: 명확하고 가독성 좋으며, Spring에 종속되지 않는다.
@Component
public class MyBean {

    @PostConstruct
    public void init() {
        System.out.println("초기화 메서드 실행");
    }

    @PreDestroy
    public void cleanup() {
        System.out.println("소멸 메서드 실행");
    }
}

 

 

@Bean의 initMethod, destroyMethod 속성

  • Java Config를 사용하는 경우, 메서드 이름을 직접 지정할 수 있다.
  • 외부 라이브러리 등 수정할 수 없는 클래스에도 초기화/소멸 로직 지정 가능.
@Configuration
public class AppConfig {

    @Bean(initMethod = "init", destroyMethod = "cleanup")
    public MyBean myBean() {
        return new MyBean();
    }
}
public class MyBean {
    public void init() {
        System.out.println("초기화 메서드 실행");
    }

    public void cleanup() {
        System.out.println("소멸 메서드 실행");
    }
}

 

 

* 정리

방법 초기화 소멸 특징
InitializingBean, DisposableBean afterPropertiesSet() destroy() Spring 인터페이스 구현
@PostConstruct, @PreDestroy @PostConstruct @PreDestroy Java 표준, 가장 추천
@Bean(initMethod, destroyMethod) 지정한 메서드명 지정한 메서드명 외부 클래스 적용 가능

3. Bean Scope

Bean Scope

  • Spring 컨테이너에서 Bean이 어떻게 생성되고 관리되는지를 정의하는 개념으로 Spring은 다양한 범위(스코프)를 제공하여 Bean의 생명주기를 설정할 수 있다.
  • 각 스코프는 Bean이 얼마나 오래 유지되는지, 여러 번 사용할 수 있는지 등을 결정한다.

 

Bean Scope 종류

  • 싱글톤(singleton)
    • Spring 컨테이너당 하나의 Bean만 생성된다.
    • 기본 스코프이며, 모든 요청이 같은 인스턴스를 공유한다.
  • 프로토타입(prototype)
    • Bean을 요청할 때마다 매번 새로운 인스턴스를 생성한다.
    • 초기화까지만 Spring이 관리하고, 소멸은 직접 해야 한다. 필요한 의존관계를 주입한다.
  • 웹 스코프
    • request: 하나의 HTTP 요청마다 새로운 Bean이 생성되고, 요청이 끝나면 소멸된다. 주로 Web MVC에서 사용된다.
    • session: 하나의 HTTP 세션 동안 같은 Bean 인스턴스를 유지한다.
    • application: 하나의 ServletContext 범위에서 Bean을 공유한다.
    • websocket: 하나의 WebSocket 세션 동안 같은 Bean 인스턴스를 유지한다.

 

 

Bean Scope 등록 방법

/* 자동 등록 */
@Scope("prototype") // 또는 "singleton", "request", "session" 등
@Component
public class MyBean {
    ...
}
/* 수동 등록 */
@Configuration
public class AppConfig {

    @Bean
    @Scope("prototype") // 또는 "singleton", "request", "session" 등
    public MyBean myBean() {
        return new MyBean();
    }

}