스프링 Bean 생명주기와 scope

2025. 6. 12. 15:26spring

반응형

스프링 빈의 생명주기 단계 요약

  1. 객체 생성 (new)
  2. 의존성 주입 (@Autowired 등)
  3. 초기화 콜백 (초기화 작업 수행)
  4. 사용
  5. 소멸 콜백 (정리 작업 수행)

예시: 자동차의 생명주기

@Component
public class Car implements InitializingBean, DisposableBean {

    public Car() {
        System.out.println("1️⃣ 생성자 호출: Car 객체 생성됨");
    }

    @Autowired
    public void setEngine(Engine engine) {
        System.out.println("2️⃣ 의존성 주입: Engine 주입됨");
    }

    @Override
    public void afterPropertiesSet() {
        System.out.println("3️⃣ 초기화: afterPropertiesSet 호출됨");
    }

    @Override
    public void destroy() {
        System.out.println("5️⃣ 소멸: destroy 호출됨");
    }
}
@Component
public class Engine {
    public Engine() {
        System.out.println("Engine 생성됨");
    }
}

 

테스트 코드 (@SpringBootTest)

@SpringBootTest
public class LifeCycleTest {

    @Autowired
    private Car car;

    @Test
    void testCarLifeCycle() {
        System.out.println("4️⃣ 테스트 실행 중: Car 사용 중");
    }
}

실행 결과 (순서)

Engine 생성됨
1️⃣ 생성자 호출: Car 객체 생성됨
2️⃣ 의존성 주입: Engine 주입됨
3️⃣ 초기화: afterPropertiesSet 호출됨
4️⃣ 테스트 실행 중: Car 사용 중
5️⃣ 소멸: destroy 호출됨 (컨텍스트 종료 시)

 

1) 생성 ==> Spring이 new Car()로 객체를 생성

2) 의존성 주입 ==> @Autowired로 필요한 의존 객체를 주입

3) 초기화 콜백 ==> afterPropertiesSet() 같은 메서드 호출 → 초기 세팅

4) 사용 ==> 일반적으로 서비스/비즈니스 로직 수행

5) 소멸 콜백 ==> Spring 컨테이너 종료 시 destroy() 호출하여 정리

 

 

스프링 Bean Scope (스코프)

스코프는 빈이 생성되고 유지되는 범위(생명주기)를 의미합니다. 스프링에서 기본으로 제공하는 스코프는 다음과 같습니다.

 

 

주요 스코프 종류

스코프 이름설명사용 환경
singleton (기본값) 스프링 컨테이너 당 하나의 빈만 생성됨. 전역 공유 객체. 대부분의 빈
prototype 요청 시마다 새로운 빈을 생성. 관리 주체는 사용자, 소멸은 직접 처리 필요 상태가 변하는 객체나 다수 인스턴스 필요 시
request HTTP 요청 당 하나의 빈 생성. 웹 애플리케이션 전용 웹 요청마다 독립적인 빈 필요 시
session HTTP 세션 당 하나의 빈 생성. 웹 애플리케이션 전용 세션 별 사용자 상태 저장 시
application 서블릿 컨텍스트 당 하나의 빈 생성. 웹 애플리케이션 전용 웹 애플리케이션 범위 전역 빈
websocket 웹소켓 세션 당 하나의 빈 생성 웹소켓 세션 범위 빈

Scope별 상세 설명

  • singleton
    • 스프링 컨테이너가 시작될 때 생성되고 종료될 때 소멸됨
    • 모든 요청에 같은 인스턴스 반환
    • 메모리 사용 효율적, 상태를 가지면 주의 필요
  • prototype
    • 매번 요청 시 새로운 인스턴스 생성
    • 컨테이너가 관리하지만 초기 생성 이후 소멸은 직접 처리해야 함
    • 상태 저장 객체에 적합
  • request
    • 웹 요청 하나당 하나의 빈 인스턴스 생성
    • 요청이 끝나면 빈도 소멸
    • 주로 웹 컨트롤러에서 사용
  • session
    • HTTP 세션별로 빈 생성
    • 로그인 사용자별 상태 저장 등에 활용

 

 

Scope 설정 방법

  • XML 설정
<bean id="myBean" class="com.example.MyBean" scope="prototype"/>

 

  • 자바 Config
@Bean
@Scope("prototype")
public MyBean myBean() {
    return new MyBean();
}
  • 스테레오타입 어노테이션에서 @Scope 병행
@Component
@Scope("request")
public class MyRequestScopedBean {
}
반응형

'spring' 카테고리의 다른 글

스프링 컨테이너  (0) 2025.06.13
AOP (관점 지향 프로그래밍)  (0) 2025.06.13
DI (의존성 주입, Dependency Injection)  (0) 2025.06.12
IoC (제어의 역전, Inversion of Control)  (0) 2025.06.12
객체 지향 프로그래밍- SOLID  (1) 2024.05.23