스코프(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 (사실 모르는거 추가정리)
* 멀티스레딩 환경에서 안전하게 사용할 수 있는 이유 ↓
각 스코프는 별도의 인스턴스를 유지하며, 스코프를 변경하면 해당 스코프에 속한 빈들의 인스턴스도 변경된다. 이러한 스코프의 특성을 이용하여 멀티스레딩 환경에서도 안전하게 빈 인스턴스를 사용할 수 있습니다.
'JAVA > Spring' 카테고리의 다른 글
DI(Dependency Injection) 이란? / (포스팅 하나로 세부내용까지 총 정리) (3) | 2023.03.13 |
---|---|
Java 기반 컨테이너 설정방법 (Spring 어노테이션 활용) (0) | 2023.03.13 |
Spring Boot 이란? [Spring Boot은 왜써?] (0) | 2023.03.10 |
Spring Framework 기본 [스프링 제대로 알아가기] DAY1 (1) | 2023.03.09 |
Aggregate? (애그리거트) 객체지향 프로그래밍 중요 개념 / Java Spring 학습 (0) | 2023.02.21 |
댓글