빈 스코프
Spring 빈이 생성되고 유지되는 범위로, 스코프에 따라 빈 인스턴스의 생성 시점과 공유 여부가 결정됩니다.
스코프 종류
| 스코프 | 인스턴스 생성 | 범위 |
|---|---|---|
| singleton | 1개 (컨테이너당) | 애플리케이션 전체 공유 |
| prototype | 요청마다 새로 생성 | 공유 없음 |
| request | HTTP 요청마다 | 요청 1건 |
| session | HTTP 세션마다 | 세션 1개 |
| application | ServletContext당 1개 | 웹 애플리케이션 전체 |
request,session,application은 웹 환경에서만 사용 가능
singleton (기본값)
@Component // 기본이 singleton
public class UserService { }
// 컨테이너에서 꺼낼 때마다 같은 인스턴스
UserService a = context.getBean(UserService.class);
UserService b = context.getBean(UserService.class);
a == b // true
prototype
@Component
@Scope("prototype")
public class ShoppingCart { }
ShoppingCart a = context.getBean(ShoppingCart.class);
ShoppingCart b = context.getBean(ShoppingCart.class);
a == b // false — 매번 새 인스턴스
prototype 빈은 Spring이 생성만 해주고 이후 관리(소멸)는 하지 않음
singleton + prototype 주입 문제
singleton 빈이 prototype 빈을 주입받으면, prototype이 singleton처럼 동작합니다.
@Component
public class OrderService {
@Autowired
private ShoppingCart cart; // 항상 같은 인스턴스 주입됨
}
해결: ObjectProvider 또는 @Lookup 사용
@Component
public class OrderService {
@Autowired
private ObjectProvider<ShoppingCart> cartProvider;
public void order() {
ShoppingCart cart = cartProvider.getObject(); // 매번 새 인스턴스
}
}
언제 쓰나
- singleton: 상태가 없는 서비스, 리포지토리 (대부분의 경우)
- prototype: 요청마다 독립적인 상태가 필요한 경우 (장바구니, 작업 단위 객체)
- request/session: 웹 요청/세션 단위로 상태를 유지해야 할 때