🌱 스프링 빈 생명주기 콜백 & 스코프 정리
데이터베이스 커넥션 풀이나 네트워크 소켓처럼 애플리케이션 시작 시점에 미리 준비해둬야 하는 자원들이 있습니다.
또한 종료 시점에는 연결을 정리해줘야 하죠.
이런 과정을 위해 스프링은 빈의 초기화와 종료 콜백 메서드를 제공하고 있습니다.
🔄 스프링 빈의 이벤트 라이프사이클
스프링에서 빈이 어떻게 흘러가는지 한눈에 보면 다음과 같습니다.
스프링 컨테이너 생성 → 스프링 빈 생성 → 의존관계 주입 → 초기화 콜백(@PostConstruct) → 빈 사용
→ 소멸 전 콜백(@PreDestroy) → 스프링 종료
즉, 초기화는 모든 의존관계 주입이 끝난 이후에 호출되고, 종료 직전에는 소멸 콜백이 실행됩니다.
🏷️ 초기화 & 소멸 어노테이션
가장 권장되는 방법은 바로 @PostConstruct, @PreDestroy 어노테이션을 활용하는 방식입니다.
- ✅ 어노테이션 하나만 붙이면 편리하게 동작
- ✅ 스프링 전용 기술이 아니라 다른 컨테이너에서도 동작
- ✅ 컴포넌트 스캔과 잘 어울림
- ⚠️ 단점: 외부 라이브러리에는 적용 불가
@PostConstruct public void init() { // 초기화 로직 }
@PreDestroy public void close() { // 종료 로직 }
📦 빈 스코프란?
스코프(Scope)는 빈이 존재할 수 있는 "범위"를 의미합니다.
스프링은 기본적으로 싱글톤 스코프를 사용하지만, 여러 가지 스코프를 제공합니다.
1. 싱글톤 (Singleton)
- 기본 스코프
- 스프링 컨테이너 시작 ~ 종료까지 딱 하나의 인스턴스만 유지
2. 프로토타입 (Prototype)
- 요청할 때마다 새로운 빈을 생성
- 컨테이너는 생성 + 의존관계 주입 + 초기화까지만 관여
- 이후 관리하지 않기 때문에 @PreDestroy 콜백 호출 ❌
정리하자면,
- 요청마다 새 객체가 생성된다
- 컨테이너는 생성/주입까지만 관리한다
- 종료 메서드가 호출되지 않는다
3. 웹 관련 스코프
웹 애플리케이션에서만 동작하는 특별한 스코프입니다.
- request → HTTP 요청 단위로 빈 생성 및 소멸
- session → 세션 단위로 빈 유지
- application → 서블릿 콘텍스트와 동일한 범위
🌀 프로토타입 스코프의 문제
싱글톤 객체가 프로토타입 빈을 의존성 주입받는 경우,
컨테이너가 애초에 하나의 프로토타입 빈을 만들어 고정시켜 버리는 문제가 발생합니다.
즉, 요청마다 새로 생성되어야 하는 빈이 싱글톤처럼 공유되는 상황이 벌어집니다.
🌐 Request 스코프의 문제
Request 스코프 역시 비슷한 문제가 있습니다.
- Request 빈은 HTTP 요청이 와야 생성됩니다.
- 하지만 싱글톤 빈 입장에서는 애플리케이션 시작 시점에 이미 의존성을 해결해야 합니다.
- 결국 "생성되지 않은 request 빈을 어떻게 주입할까?"라는 문제가 생기죠.
🛠️ 해결책: 프락시(Proxy) 사용
이 문제를 해결하는 방법은 프록시 객체를 대신 주입하는 것입니다.
실제 객체 대신 가짜 껍데기(Proxy)를 넣어두고,
요청이 발생할 때 비로소 진짜 객체를 찾아 연결하는 방식입니다.
사용 예시:
@Component @Scope(value = "request", proxyMode = ScopedProxyMode.TARGET_CLASS)
public class MyRequestBean { ... }
이렇게 설정하면,
- 컨테이너는 우선 가짜 프락시를 싱글톤 빈에 주입
- 실제 HTTP 요청 시점에 진짜 Request 빈이 생성되어 동작
정리
- 빈 생명주기: 생성 → 의존관계 주입 → 초기화 → 사용 → 소멸
- 콜백 어노테이션: @PostConstruct, @PreDestroy
- 스코프 종류: 싱글톤, 프로토타입, 웹 스코프(request, session, application)
- 프로토타입 & Request 문제: 싱글톤 빈이 주입받을 때 생기는 불일치
- 해결책: proxyMode 옵션을 활용한 프록시 주입
마무리..
개인적으로는 실무에서 95% 이상은 싱글톤 스코프를 쓰고,
프로토타입이나 Request 스코프는 특수한 경우에만 사용하게 되더라고요.
특히 Request 스코프는 프락시 설정을 해주지 않으면 에러가 바로 터지기 때문에 꼭 주의해야 합니다. ⚡
'🌿 스프링 > 김영한' 카테고리의 다른 글
| 1. 스프링 컨테이너와 스프링 빈 (0) | 2026.02.08 |
|---|---|
| 2. 서블릿 (0) | 2026.02.07 |
| 1. 웹 애플리케이션의 이해 (0) | 2026.02.07 |
| 의존관계 자동 주입 (1) | 2025.08.25 |
| 스프링 컨테이너생성 과 Component Scan (1) | 2025.08.25 |