빈 스코프
말 그대로
스프링 컨테이너가 관리해 주는 객체인 스프링 빈이 존재할 수 있는 범위를 뜻하며
대표적인 종류로는 싱글톤, 프로토타입, request, session, appliction 등이 있다.
빈 스코프는 왜 필요할까?
객체의 생명주기를 상황에 맞게 관리하고 최적화하기 위해필요.
스프링 애플리케이션은 다양한 요구사항을 처리하기 때문에,
모든 객체를 무조건 하나만 생성하거나 매번 새로 생성하면 비효율적이거나 기능적으로 문제가 발생할 수 있음.
대부분의 서비스나 DAO는 상태 없이 사용되므로 하나만 생성해서 공유하는 것이 가장 효율적이다.
매번 새로 만들면 메모리 낭비 + 성능 저하 발생가능.
→ 메모리 효율을 위해 싱글톤 스코프 적합.
어떤 계산 로직에서 매번 다른 값 저장이 필요한 경우처럼
내부에서 요청마다 다른 상태를 가져야 할 때는 매번 새 객체를 만들어야 한다.
→ 프로토타입 스코프 적합.
로그인 사용자 정보, 장바구니 와 같이 로그인 한 사용자마다 다른 정보를 가지고 있어야 할 경우
→ request/session 스코프 적합.
적절한 빈 스코프를 설정해 효율적인 객체 관리를 하자.
| Scope 이름 | 설명 | 생성 주기 | 사용 위치 |
| singleton (기본값) | 하나의 Bean만 생성되어 공유됨 | 컨테이너 시작 시 1회 생성 | 모든 스프링 애플리케이션 |
| prototype | 요청할 때마다 새 객체 생성 | 요청 시마다 새로 생성 | 일반 애플리케이션 |
| request | HTTP 요청마다 새 Bean 생성 | 웹 요청마다 | 웹 애플리케이션(Spring MVC) |
| session | HTTP 세션마다 새 Bean 생성 | 세션 시작 시 | 웹 애플리케이션 |
| application | ServletContext마다 하나 | 웹 애플리케이션 전역 공유 | 웹 애플리케이션 |
| websocket | WebSocket 세션마다 생성 | WebSocket 세션 시작 시 | WebSocket 기반 앱 |
스코프는 다음과 같이 @Scope 어노테이션으로 지정할 수 있다.
@Component
@Scope("singleton") // 생략 가능 (기본값)
public class SingletonBean {
}
@Component
@Scope("prototype")
public class PrototypeBean {
}
@Component
@Scope(value = WebApplicationContext.SCOPE_REQUEST, proxyMode = ScopedProxyMode.TARGET_CLASS)
public class RequestScopedBean {
}
반응형
'정리' 카테고리의 다른 글
| 클린 코드를 위한 소프트웨어 설계 원칙: DRY 원칙 (1) | 2025.05.03 |
|---|---|
| 스프링의 @Transactional (0) | 2025.05.02 |
| 싱글톤패턴 (0) | 2025.04.29 |
| 자바 동시성이슈 (0) | 2025.04.28 |
| 동기(Synchronous)와 비동기(Asynchronous), blocking과 nonBlocking (0) | 2025.04.27 |