본문 바로가기

Spring/Spring 입문

빈(Bean) 스코프

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) 방식으로 매번 새로 생성해야 함.

 

해결 방법

  1. ObjectFactory 사용
  2. 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