본문 바로가기

Spring

Spring Bean Scope 빈 스코프

728x90

Bean Scope란?

Bean Scope는 빈 객체를 정의할 때 지정 하는 범위를 말한다. 개인적으로 정의하자면 빈 객체가 어디 부분에서 쓰이고 얼마나 쓰일지에 대한 내용을 말하는것으로 생각한다. 

 

scope 값을 설정 하지 않으면 singleton(싱글톤)이 디폴트 값이다.

 

참고 문서 : https://docs.spring.io/spring-framework/docs/current/reference/html/core.html#beans-factory-scopes

 

Core Technologies

In the preceding scenario, using @Autowired works well and provides the desired modularity, but determining exactly where the autowired bean definitions are declared is still somewhat ambiguous. For example, as a developer looking at ServiceConfig, how do

docs.spring.io

 

Bean Scope 종류

singleton, prototype, request, session, application, websocket으로 구성 되어있다.

 

1. singleton

기본 값으로 빈 컨테이너(Ioc 컨테이너) 내 하나의 빈 인스턴스를 생성하고 이를 주입해주는 방식

 

 

xml 설정 코드

<bean id="accountService" class="com.something.DefaultAccountService"/>

<bean id="accountService" class="com.something.DefaultAccountService" scope="singleton"/>

 

 

2. prototype

정의된 Bean이 필요한 순간마다 새로운 객체가 생성되는 방식

 

 

xml 설정 코드

<bean id="accountService" class="com.something.DefaultAccountService" scope="prototype"/>

 

 

3. request

하나의 Http Request에 하나의 빈 객체를 사용하는 방식이다. Spring Web MVC와 같은 웹 베이스에서만 사용할 수 있다.

 

xml 설정 코드

<bean id="loginAction" class="com.something.LoginAction" scope="request"/>

 

어노테이션 설정 코드

@Component나 @Configuration으로 따로 구현할때는 @RequestScope를 추가로 넣어주면 된다.

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

 

 

추가로 DispatcherServlet 외부에서 사용하고 싶은 빈 객체를 선언한 Context의 경우 web.xml에 선언해주어야한다.

 

웹 컨테이너가 Servlet 3.0 이상인 경우

<web-app>
  ...
  <listener>
    <listener-class>org.springframework.web.context.request.RequestContextListener</listener-class>
  </listener>
  ...
</web-app>

 

 

웹 컨테이너가 Servlet 3.0 미만인 경우

<web-app>
    ...
    <filter>
        <filter-name>requestContextFilter</filter-name>
        <filter-class>org.springframework.web.filter.RequestContextFilter</filter-class>
    </filter>
    <filter-mapping>
        <filter-name>requestContextFilter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>
    ...
</web-app>

 

 

4. session

하나의 Http session에 하나의 빈 객체를 사용하는 방식이다. Spring Web MVC와 같은 웹 베이스에서만 사용할 수 있다.

 

xml 설정 코드

<bean id="userPreferences" class="com.something.UserPreferences" scope="session"/>

 

어노테이션 설정 코드

@Component나 @Configuration으로 따로 구현할때는 @SessionScope를 추가로 넣어주면 된다.

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

 

 

5. application

하나의 ServletContext에 하나의 빈 객체를 사용하는 방식이다. Spring Web MVC와 같은 웹 베이스에서만 사용할 수 있다.

 

xml 설정 코드

<bean id="appPreferences" class="com.something.AppPreferences" scope="application"/>

 

어노테이션 설정 코드

@Component나 @Configuration으로 따로 구현할때는 @ApplicationScope를 추가로 넣어주면 된다.

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

 

6. websocket

하나의 websocket 생명주기에 하나의 빈 객체를 사용하는 방식. Spring Web MVC와 같은 웹 베이스에서만 사용할 수 있다. 

 

xml 설정 코드

<bean id="beanId" class="com.howtodoinjava.BeanClass" scope="websocket" />

 

 

어노테이션 설정 코드

@Component
@Scope("websocket")
public class BeanClass {
	// ...
}
728x90