JAVA/Spring

스코프(Scope) 란? /SpringFramework

min민 2023. 3. 13.

 

스코프(Scope) 란? 

스프링 프레임워크에서 빈(Bean) 객체의 생성 및 소멸 시점과 라이프사이클을 관리하는 것 중 하나가 스코프(Scope)다.

 

스코프는 빈 객체의 생성 범위를 지정하며, 해당 범위에서만 빈 객체를 공유하고 관리한다. 스프링은 다양한 스코프를 제공하여 객체의 생성 및 소멸을 효율적으로 관리할 수 있도록 지원한다.

 

 

 

1️⃣ 스코프 종류

  • Singleton: 스프링 컨테이너에서 생성되는 빈 객체는 기본적으로 Singleton 스코프로 생성된다. 따라서 컨테이너 내에서 하나의 인스턴스만 생성되고, 이를 모든 빈에서 공유하여 사용한다.
@Component // 기본 스코프는 Singleton
public class MyComponent {
}

Singleton 스코프는 스프링 컨테이너에서 딱 한 번만 객체를 생성하고, 이후에는 항상 동일한 객체를 반환한다. 따라서 Singleton 스코프를 사용하는 빈은 애플리케이션 전역에서 공유된다. 기본값이며, 별도의 설정 없이도 사용할 수 있다.

 

 

  • Prototype: Prototype 스코프를 지정하면 빈 객체를 요청할 때마다 새로운 인스턴스가 생성된다. 따라서 빈 객체를 공유하지 않고 독립적으로 사용할 수 있다.
@Component
@Scope("prototype")
public class MyComponent {
}

Prototype 스코프는 빈이 요청될 때마다 매번 새로운 객체를 생성한다. 따라서 Prototype 스코프를 사용하는 빈은 각각 독립적인 객체로 취급된다.

 

 

  • Request: Request 스코프를 지정하면 웹 요청마다 새로운 인스턴스가 생성된다. 따라서 같은 웹 요청에서는 빈 객체를 공유하여 사용할 수 있지만, 다른 웹 요청에서는 별도의 인스턴스가 생성된다.
@Component
@Scope(value = WebApplicationContext.SCOPE_REQUEST, proxyMode = ScopedProxyMode.TARGET_CLASS)
public class MyComponent {
}

Request 스코프는 HTTP 요청이 들어올 때마다 새로운 객체를 생성한다. 따라서 Request 스코프를 사용하는 빈은 각각의 HTTP 요청마다 독립적인 객체로 취급된다.

 

 

  • Session: Session 스코프를 지정하면 웹 세션이 생성될 때 새로운 인스턴스가 생성된다. 따라서 같은 세션에서는 빈 객체를 공유하여 사용할 수 있지만, 다른 세션에서는 별도의 인스턴스가 생성된다.
@Component
@Scope(value = WebApplicationContext.SCOPE_SESSION, proxyMode = ScopedProxyMode.TARGET_CLASS)
public class MyComponent {
}

Session 스코프는 HTTP 세션이 시작될 때마다 새로운 객체를 생성한다. 따라서 Session 스코프를 사용하는 빈은 각각의 HTTP 세션마다 독립적인 객체로 취급된다.

 

 

  • GlobalSession: GlobalSession 스코프는 Portlet 환경에서 사용된다. Portlet 애플리케이션 전체에서 공유할 수 있는 빈 객체를 생성한다.
@Component
@Scope(value = WebApplicationContext.SCOPE_GLOBAL_SESSION, proxyMode = ScopedProxyMode.TARGET_CLASS)
public class MyComponent {
}

GlobalSession 스코프는 Portlet 환경에서 사용된다. Portlet은 웹 페이지 안에서 다른 웹 페이지를 띄울 수 있는 기능을 제공하는데, GlobalSession 스코프를 사용하면 여러 개의 Portlet이 공유하는 세션에 대한 객체를 생성할 수 있다.

 

 

스프링에서 제공하는 스코프 외에도, 사용자가 직접 스코프를 구현할 수도 있다.

 

 

 

2️⃣ 스코프 설정 방법

1. 어노테이션을 이용하여 설정

@Scope 어노테이션을 이용하여 설정.

 

@Component
@Scope("prototype")
public class MyPrototypeBean {
}

 

2. XML 설정 파일을 이용한 설정

<bean> 태그의 scope 속성을 이용하여 스코프를 설정

 

<bean id="myPrototypeBean" class="com.example.MyPrototypeBean" scope="prototype" />

 

 

 

3️⃣ 스코프의 적용

스프링에서 스코프를 적용하기 위해서는 해당 스코프를 가진 빈을 사용하는 컨텍스트에서 해당 스코프를 지원해야 한다.

예를 들어, WebApplicationContext는 Request 스코프와 Session 스코프를 지원한다. 따라서 웹 애플리케이션에서 Request 스코프와 Session 스코프를 사용하기 위해서는 WebApplicationContext를 이용해야 한다.

 

@Controller
@RequestMapping("/myController")
@Scope("request")
public class MyController {
}

위 예제 에서는 Request 스코프를 지정하여 MyController 클래스가 생성될 때마다 새로운 인스턴스가 생성되도록 설정하였다. 이렇게 설정하면 HTTP 요청마다 새로운 인스턴스가 생성되어 사용되므로, 다른 HTTP 요청에서 영향을 받지 않는다.

 

 

 

4️⃣ 스코프의 주의점

  • Singleton 스코프를 사용하는 경우, 객체를 공유하기 때문에 멀티스레드 환경에서 문제가 발생할 수 있다. 이를 해결하기 위해서는 동기화 처리를 해주어야 한다.
  • Prototype 스코프를 사용하는 경우, 객체를 계속 생성하므로 메모리 사용량이 늘어날 수 있다. 따라서 대량의 객체 생성이 예상되는 경우에는 다른 스코프를 사용하는 것이 좋다.
  • Request 스코프와 Session 스코프를 사용하는 경우, 해당 스코프를 가지는 빈 객체에 대한 참조를 유지하고 있어야 한다. 예를 들어, HttpServletRequest나 HttpSession을 파라미터로 받아 사용하거나, @Autowired 어노테이션을 이용하여 주입받아 사용해야 한다.

 

 

 

#️⃣ point

스프링 컨테이너에서 빈의 스코프는 객체의 생성과 소멸을 관리하는 중요한 요소다. 스코프를 적절하게 사용함으로써 객체를 효율적으로 관리할 수 있으며, 애플리케이션의 성능을 향상시킬 수 있다. 스프링에서는 다양한 스코프를 제공하며, 사용자가 직접 스코프를 구현할 수도 있다. 적절한 스코프를 선택하여 스프링 애플리케이션을 개발하면 더욱 효율적인 애플리리케이션을 개발할 수 있다.또한, 스코프는 멀티스레딩 환경에서 안전하게 사용될 수 있도록 설계되어 있습니다

 

 

더 알아가기 point (사실 모르는거 추가정리)

 

* 멀티스레딩 환경에서 안전하게 사용할 수 있는 이유 ↓

각 스코프는 별도의 인스턴스를 유지하며, 스코프를 변경하면 해당 스코프에 속한 빈들의 인스턴스도 변경된다. 이러한 스코프의 특성을 이용하여 멀티스레딩 환경에서도 안전하게 빈 인스턴스를 사용할 수 있습니다.

댓글