스프링 Bean 생명주기와 scope
2025. 6. 12. 15:26ㆍspring
반응형
스프링 빈의 생명주기 단계 요약
- 객체 생성 (new)
- 의존성 주입 (@Autowired 등)
- 초기화 콜백 (초기화 작업 수행)
- 사용
- 소멸 콜백 (정리 작업 수행)
예시: 자동차의 생명주기
@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 |