스프링에서 빈의 종류는 스코프(Scope)로 결정된다. 빈의 스코프는 "하나의 빈(객체)이 언제 생성되어 어디까지 공유되고, 언제 사라지는가"를 정의하는 규칙이다.
크게 두 그룹으로 나눌 수 있다.
- 핵심 스코프
- 웹 환경 전용 스코프
I. 핵심 스코프 (Core Scopes)
웹 환경이 아니어도 스프링을 사용하는 곳이라면 어디서든 사용할 수 있는 기본적인 스코프다.
1. 싱글톤 (Singleton)
- 설명: 스프링 컨테이너(IoC Container) 안에서 단 하나의 인스턴스만 생성되어 애플리케이션 전반에 걸쳐 공유된다.
- 특징: 기본값(Default)으로 설정된 스코프다. 별도로 스코프를 지정하지 않으면 모든 빈은 싱글톤으로 만들어진다. 메모리 효율이 좋고 상태를 공유하지 않는(Stateless) 서비스나 DAO(Data Access Object)에 주로 사용된다.
- 생명주기: 스프링 컨테이너의 시작과 함께 생성되어, 컨테이너가 종료될 때 함께 소멸한다.
- 비유: 공공기관의 민원 담당 직원. 어떤 민원인(다른 객체)이 찾아와도 항상 그 직원이 업무를 처리한다.
2. 프로토타입 (Prototype)
- 설명: 빈을 주입받거나 컨테이너에 요청할 때마다 매번 새로운 인스턴스를 생성한다.
- 특징: 모든 요청에 대해 독립적인 객체가 필요할 때 사용된다. 즉, 상태를 가져야 하는(Stateful) 객체에 적합하다. 중요한 점은 스프링 컨테이너가 생성과 의존성 주입까지만 관여하고, 그 이후의 소멸은 관리하지 않는다는 것이다.
- 생명주기: 요청 시에 생성되며, 스프링 컨테이너가 소멸을 관리하지 않으므로 GC(가비지 컬렉터)에 의해 처리되거나 사용자가 직접 소멸 처리를 해야 한다.
- 비유: 자판기의 종이컵. 버튼을 누를 때마다(요청할 때마다) 새 컵이 나오고, 사용 후에는 사용자가 직접 버려야 한다.
II. 웹 환경 전용 스코프 (Web-Aware Scopes)
웹 애플리케이션 환경에서만 의미를 가지며, DispatcherServlet
과 같은 웹 관련 컨텍스트가 구성되어 있어야 동작한다.
1. 리퀘스트 (Request)
- 설명: 하나의 HTTP 요청(Request)이 시작되고 끝날 때까지 단 하나의 인스턴스만 유지된다.
- 특징: 각각의 HTTP 요청은 자신만의 빈 인스턴스를 가진다. 따라서 다른 요청과 데이터가 섞일 염려가 없다. 요청과 관련된 정보를 처리할 때 유용하다.
- 비유: 식당의 주문서. 한 손님(HTTP 요청)이 주문하고 식사를 마칠 때까지만 유효한 주문서다. 다른 손님은 다른 주문서를 받는다.
2. 세션 (Session)
- 설명: 하나의 HTTP 세션(Session)이 유지되는 동안 단 하나의 인스턴스만 유지된다.
- 특징: 사용자가 웹 사이트에 접속해서 로그아웃하거나 브라우저를 닫을 때까지(세션이 만료될 때까지) 동일한 빈을 계속 사용할 수 있다. 사용자의 로그인 정보, 장바구니 기능 등에 주로 사용된다.
- 비유: 대형마트의 쇼핑 카트. 한 명의 고객(세션)이 쇼핑을 시작해서 마칠 때까지 계속 사용하는 카트다.
3. 애플리케이션 (Application)
- 설명: 웹 애플리케이션 전체(
ServletContext
)의 생명주기와 동일하게 단 하나의 인스턴스만 유지된다. - 특징: 싱글톤과 매우 유사하지만, 웹 애플리케이션 단위로만 생성된다는 점에서 차이가 있다. 애플리케이션 전반에서 사용되는 설정 정보나 공용 데이터를 관리할 때 사용된다.
- 비유: 애플리케이션 전체 공지사항 게시판. 앱이 실행되는 동안 모든 사용자가 동일한 게시판을 본다.
III. 설정 방법
빈의 스코프는 @Scope
어노테이션을 사용하여 직접 지정할 수 있다.
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Component;
@Component
@Scope("prototype") // 이 빈은 프로토타입 스코프로 동작한다.
public class MyPrototypeBean {
// ...
}
@Component // 스코프를 지정하지 않았으므로 기본값인 'singleton'으로 동작한다.
public class MySingletonService {
// ...
}
클릭하여 코드 복사
IV. 요약 표
스코프 (종류) | 핵심 개념 | 인스턴스 개수 | 주요 사용처 |
---|---|---|---|
싱글톤 | 컨테이너 당 하나 | 1개 (컨테이너 전체) | 서비스, DAO, 설정 클래스 |
프로토타입 | 요청 시마다 새로 생성 | N개 (요청 횟수만큼) | 상태를 가지는 객체 |
리퀘스트 | HTTP 요청 당 하나 | N개 (요청 횟수만큼) | 요청별 데이터 처리 |
세션 | HTTP 세션 당 하나 | N개 (세션 수만큼) | 로그인 정보, 장바구니 |
애플리케이션 | 웹 앱 당 하나 | 1개 (웹 앱 전체) | 앱 전역 공용 데이터 |
'Spring' 카테고리의 다른 글
스프링에서 받을 데이터는 '명시적'이어야 한다. (0) | 2025.06.13 |
---|---|
인스턴스 생명 주기와 애너테이션 : 한눈에 보기 - 콜백 (1) | 2025.06.09 |
스프링 프레임워크의 동작 방식 (2) | 2025.06.09 |
[3편] 좋은 DI 설계: 스프링의 빈 탐색 원리와 OCP (0) | 2025.06.03 |
[2편] 스프링 DI의 3가지 방식 : 생성자 주입을 써야만 하는 이유 (0) | 2025.06.03 |