본문 바로가기

Programming/Spring

Spring Bean 생명주기와 스코프 정리

반응형

Spring에서 Bean은 객체를 자동으로 생성하고 관리하는 단위다. 이 Bean이 생성되고 사용되며 종료되는 전 과정이 생명주기이고, Bean이 어떤 범위로 관리되는지가 스코프다.


1. Bean 생명주기

Bean은 아래와 같은 순서를 따라 생성되고 제거된다.

생명주기 단계

  1. 객체 생성
    • Spring 컨테이너가 Bean 정의를 기반으로 객체를 생성한다.
  2. 의존성 주입
    • 생성된 객체에 필요한 의존성이 주입된다.
  3. 초기화 콜백
    • @PostConstruct 또는 InitializingBean.afterPropertiesSet()을 통해 초기화 작업 수행.
  4. 사용
    • 컨테이너가 Bean을 필요에 따라 사용한다.
  5. 소멸 콜백
    • @PreDestroy 또는 DisposableBean.destroy() 호출로 정리 작업 수행.

 


 

예제

@Component
public class MyService implements InitializingBean, DisposableBean {

    @PostConstruct
    public void init() {
        System.out.println("초기화 작업 수행");
    }

    @Override
    public void afterPropertiesSet() {
        System.out.println("InitializingBean - 의존성 주입 완료 후");
    }

    @PreDestroy
    public void cleanup() {
        System.out.println("종료 전 정리 작업");
    }

    @Override
    public void destroy() {
        System.out.println("DisposableBean - 컨테이너 종료 시 호출");
    }
}

대부분의 경우 @PostConstruct, @PreDestroy 애노테이션만으로 충분하다. 인터페이스는 더 정밀한 컨트롤이 필요할 때 사용한다.


 

2. Bean 스코프

스코프는 Bean의 인스턴스가 생성되고 유지되는 범위를 결정한다. 기본은 singleton이며, 다음과 같은 종류가 있다.

스코프 설명
singleton 컨테이너당 1개 인스턴스 (기본값)
prototype 요청마다 새 인스턴스 생성
request HTTP 요청마다 새 인스턴스 (웹 전용)
session HTTP 세션마다 새 인스턴스 (웹 전용)
application 서블릿 컨텍스트 범위에서 1개 (웹 전용)

예제

@Component
@Scope("prototype")
public class PrototypeBean {
    public PrototypeBean() {
        System.out.println("새 인스턴스 생성됨");
    }
}

상태를 갖는 Bean은 prototype으로 두는 게 안전하다. singleton Bean은 상태를 가지면 동시성 문제가 발생할 수 있다.


요약

  • 생명주기: Bean 생성 → 의존성 주입 → 초기화 → 사용 → 소멸
  • 스코프: Bean이 얼마나 오래, 어떻게 유지될지 결정
  • 실무에서는 @PostConstruct, @PreDestroy, @Scope 정도만으로 대부분의 요구를 충족할 수 있음

스프링 애플리케이션에서 Bean이 언제 만들어지고, 얼마나 유지되는지 아는 것은 리소스 관리나 동시성 문제를 방지하는 데 필수다.

반응형