본문 바로가기

웹 프로그래밍/Spring

[Spring] Bean Scope

728x90
반응형

spring bean scope

  1. singleton (default) : Spring Container 시작과 종료까지 유지되는 가장 넓은 범위의 스코프
  2. prototype : Spring Container가 프로토타입의 빈 생성. 의존관계 주입까지만 관여하고 더이상 관리하지 않는 짧은 범위의 스코프
  3. web
    • request : 고객의 웹 요청이 들어오고 나갈 때까지 유지되는 스코프
    • session : 웹 세션이 생성되고 종료될 때까지 유지되는 스코프
    • application : 웹의 서블릿 컨텍스트와 같은 범위로 유지되는 스코프
    • websocket : 웹 소켓과 동일한 생명 주기를 가지는 스코프

 

Scope 설정

ComponentScan 자동 등록, @Bean을 이용한 수동 등록 모두 Scope 지정 시 아래와 같이 작성하면 됩니다..
Default 값은 singleton이고 이외의 스코프로 설정하고 싶은 경우 @Scope 어노테이션에 속성 값을 추가하면 됩니다.

@Scope                 // singleton
@Scope("prototype") // prototype

 

Singleton Scope

Bean 생성 시 기본으로 설정되는 스코프입니다.
싱글톤 스코프 빈은 단 하나의 공유 인스턴스만 관리 되며, 해당 빈에 대한 모든 요청은 Spring Container에서 동일한 인스턴스로 반환합니다.
즉, 싱글톤 빈을 정의할 경우 Spring IOC 컨테이너는 해당 빈 객체 인스턴스를 정확히 하나만 만듭니다. 이 단일 인스턴스는 싱글톤 빈의 캐시에 저장되고, 명명된 빈에 대한 모든 요청과 참조는 캐시된 객체를 반환합니다.

singleton scope

 

Prototype Scope

Bean에 대한 요청이 있을 때마다 새로운 인스턴스가 생성되는 스코프입니다.
클라이언트가 프로토타입 스코프의 빈을 컨테이너에 요청 시, 컨테이너는 프로토타입 빈을 생성하고 필요한 의존 관계를 주입하여 클라이언트에 반환합니다.
Spring Container는 프로토타입 빈을 생성하고, 의존 관계 주입과 초기화까지만 처리합니다다. 즉 Spring Container는 프로토타입 빈의 전체 수명 주기를 관리하지 않습니다. 프로토타입 빈을 관리할 책임은 빈을 받은 클라이언트에게 있기 때문에 @PreDestroy와 같은 종료 메서드가 호출되지 않습니다.
어떻게 보면 프로토타입 빈과 관련된 Spring Container의 역할은 Java의 new 연산자를 대체하는 것입니다.

prototype scope

 

Web Scope

웹 환경에서만 동작하는 빈 스코프입니다.

Request Scope

해당 Bean은 HTTP 요청 수준에서 범위 지정됩니다. HTTP 요청 하나가 들어오고 나갈 때까지 유지되는 스코프로 각각의 HTTP 요청마다 별도의 빈 인스턴스가 생성되고 관리됩니다. (HTTP 라이프 사이클마다 한개의 빈 사용)
동일한 Bean 정의에서 생성된 다른 인스턴스는 이러한 상태 변경을 볼 수 없기 때문에 생성된 인스턴스 내부 상태를 원하는 만큼 변경할 수 있습니다. 이러한 변경은 개별 Request에만 해당됩니다.
요청 처리가 완료되면 Request Scope Bean은 삭제됩니다.

@RequestScope 어노테이션을 사용하여 범위 할당

@RequestScope
@Component
public class LoginAction {
    // ...
}

 

Session Scope

HTTP Session과 동일한 생명주기를 가지는 스코프입니다.

@SessionScope 어노테이션을 사용하여 범위 할당

@SessionScope
@Component
public class UserPreferences {
    // ...
}

 

Application Scope

서블릿 컨텍스트(ServletContext)와 동일한 생명주기를 가지는 스코프입니다.
Spring Container는 전체 웹 어플리케이션에 대해 Bean 정의를 사용하여 한 번 새 인스턴스를 만듭니다.
즉, Bean은 ServletContext 레벨에서 범위가 지정되고 ServletContext의 일반 속성으로 저장됩니다.

@ApplicationScope 어노테이션을 사용하여 범위 할당

@ApplicationScope
@Component
public class AppPreferences {
    // ...
}

 

WebSocket Scope

웹 소켓과 동일한 생명주기를 가지는 스코프입니다.

728x90
반응형