빈 스코프

Spring 빈이 생성되고 유지되는 범위로, 스코프에 따라 빈 인스턴스의 생성 시점과 공유 여부가 결정됩니다.

스코프 종류

스코프인스턴스 생성범위
singleton1개 (컨테이너당)애플리케이션 전체 공유
prototype요청마다 새로 생성공유 없음
requestHTTP 요청마다요청 1건
sessionHTTP 세션마다세션 1개
applicationServletContext당 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();  // 매번 새 인스턴스
    }
}

언제 쓰나

→ Spring Container

CSLOG에서 보기