Spring에서 빈(Bean) 스코프는 스프링 컨테이너가 관리하는 빈의 생성 범위를 지정하는 개념입니다. 쉽게 말해, 특정 빈이 어떤 범위에서, 얼마나 오래 유지되는지를 결정하는 설정입니다.
스프링 빈 스코프 종류
Spring은 다음과 같은 여러 가지 빈 스코프를 제공합니다.
스코프 종류 | 설명 | 사용 위치 |
singleton | (기본값) 하나의 인스턴스를 애플리케이션 내에서 공유 | 스프링 컨테이너 전체 |
prototype | 요청할 때마다 새로운 인스턴스를 생성 | 스프링 컨테이너 전체 |
request | HTTP 요청마다 새로운 인스턴스를 생성 | 웹 애플리케이션 (Spring MVC) |
session | HTTP 세션마다 새로운 인스턴스를 생성 | 웹 애플리케이션 (Spring MVC) |
application | 애플리케이션(ServletContext) 당 하나의 인스턴스를 생성 | 웹 애플리케이션 (Spring MVC) |
websocket | 웹소켓 연결마다 하나의 인스턴스를 생성 | 웹 애플리케이션 (Spring WebSocket) |
주요 스코프 상세 설명
1) singleton (싱글톤, 기본 스코프)
- 하나의 인스턴스만 생성되어 애플리케이션이 종료될 때까지 유지됨.
- 가장 일반적인 스코프로, 메모리를 절약할 수 있음.
- 단점: 공유 객체이므로 상태를 변경하면 여러 곳에 영향을 줄 수 있음 (무상태(stateless)로 설계해야 함).
@Component
@Scope("singleton") // 기본값이라 생략 가능
public class SingletonBean {
}
2) prototype (프로토타입)
- 요청할 때마다 새로운 인스턴스가 생성됨.
- 상태를 유지해야 하는 빈(예: DTO, 특정 비즈니스 객체)에 적합함.
- 단점: 스프링이 주입 후 관리하지 않으므로, 수명이 짧고 직접 해제해야 할 수도 있음.
@Component
@Scope("prototype")
public class PrototypeBean {
}
3) request (웹 요청 단위)
- HTTP 요청당 하나의 인스턴스를 생성하여 요청이 끝나면 소멸됨.
- 웹 애플리케이션에서 클라이언트별 데이터를 관리할 때 유용함.
@Component
@Scope("request")
public class RequestBean {
}
4) session (세션 단위)
- HTTP 세션당 하나의 인스턴스를 유지.
- 로그인한 사용자 정보 등을 저장할 때 유용함.
@Component
@Scope("session")
public class SessionBean {
}
5) application (애플리케이션 전역)
- 하나의 애플리케이션 컨텍스트(ServletContext) 당 하나의 인스턴스가 유지됨.
- 전역 설정 정보 등 애플리케이션 전체에서 공유해야 하는 데이터를 관리할 때 유용함.
@Component
@Scope("application")
public class ApplicationBean {
}
6) websocket (웹소켓 연결 단위)
- 웹소켓 연결당 하나의 인스턴스가 유지됨.
- 실시간 채팅 등의 기능에 적합.
@Component
@Scope("websocket")
public class WebSocketBean {
}
prototype 빈과 singleton 빈을 함께 사용할 때 문제점
- singleton 빈이 prototype 빈을 주입받으면, 한 번 생성된 prototype 빈이 계속 사용됨.
- prototype의 장점을 살리려면 DL(Dependency Lookup) 방식으로 매번 새로 생성해야 함.
해결 방법
- ObjectFactory 사용
- Provider 사용 (추천)
@Component
public class SingletonWithPrototype {
private final Provider<PrototypeBean> prototypeProvider;
@Autowired
public SingletonWithPrototype(Provider<PrototypeBean> prototypeProvider) {
this.prototypeProvider = prototypeProvider;
}
public void usePrototype() {
PrototypeBean prototype = prototypeProvider.get();
System.out.println(prototype);
}
}
정리
스코프 | 인스턴스 생성 시점 | 유지 기간 |
singleton | 최초 요청 시 한 번만 | 애플리케이션 종료 시까지 |
prototype | 매번 새로운 객체 | 사용 후 GC가 관리 |
request | HTTP 요청당 하나 | 요청 종료 시까지 |
session | HTTP 세션당 하나 | 세션 종료 시까지 |
application | 애플리케이션당 하나 | 애플리케이션 종료 시까지 |
websocket | 웹소켓 연결당 하나 | 웹소켓 연결 종료 시까지 |
싱글톤이 기본값이지만, 필요에 따라 다른 스코프를 활용하면 효율적인 객체 관리를 할 수 있다!
'Spring > Spring 입문' 카테고리의 다른 글
7. Validation (0) | 2022.08.23 |
---|---|
8. Object Mapper (0) | 2022.06.30 |
7. Response (0) | 2022.06.30 |
6. 리소스 삭제 DELETE (0) | 2022.06.30 |
5. PUT API (0) | 2022.06.30 |