반응형
Spring에서 Bean은 객체를 자동으로 생성하고 관리하는 단위다. 이 Bean이 생성되고 사용되며 종료되는 전 과정이 생명주기이고, Bean이 어떤 범위로 관리되는지가 스코프다.
1. Bean 생명주기
Bean은 아래와 같은 순서를 따라 생성되고 제거된다.
생명주기 단계
- 객체 생성
- Spring 컨테이너가 Bean 정의를 기반으로 객체를 생성한다.
- 의존성 주입
- 생성된 객체에 필요한 의존성이 주입된다.
- 초기화 콜백
- @PostConstruct 또는 InitializingBean.afterPropertiesSet()을 통해 초기화 작업 수행.
- 사용
- 컨테이너가 Bean을 필요에 따라 사용한다.
- 소멸 콜백
- @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이 언제 만들어지고, 얼마나 유지되는지 아는 것은 리소스 관리나 동시성 문제를 방지하는 데 필수다.
반응형
'Programming > Spring' 카테고리의 다른 글
Spring Boot와 기존 Spring의 차이점 (0) | 2025.04.24 |
---|---|
Spring @Transactional : 원리부터 실전 주의사항까지 (0) | 2025.04.24 |
스프링으로 웹페이지 만들기 - 6. 카카오오븐 사용하여 UI UX 정의하기 (0) | 2022.02.07 |
스프링으로 웹페이지 만들기 - 5. 부트스트랩 무료템플릿 사용하기 (0) | 2022.02.07 |
스프링으로 웹페이지 만들기 - 4. 데이터 주고 받기 (0) | 2022.01.25 |