스프링 컨테이너: 싱글톤 컨테이너
Spring Framework에서 빈(Bean)의 기본 스코프로 싱글톤(Singleton) 패턴을 따릅니다. 이는 기본적으로 스프링 컨테이너가 빈을 싱글톤으로 관리하기 때문입니다.
싱글톤 패턴은 어플리케이션 전체에서 단일 인스턴스를 공유하여 메모리 사용량을 줄이고 객체 생성 비용을 절감하는 디자인 패턴입니다. 즉, 스프링 컨테이너가 해당 빈을 생성하고 초기화한 후, 동일한 빈을 요청할 때마다 동일한 인스턴스가 반환됩니다. 이로 인해 다음과 같은 이점이 있습니다.
- 일관성
여러 곳에서 동시에 빈을 참조하더라도 상태 공유나 동기화 문제 없이 안전하게 사용할 수 있습니다. 여러 개의 인스턴스를 사용할 때 발생할 수 있는 데이터의 불일치 문제를 방지할 수 있습니다. - 자원 절약
동일한 빈 인스턴스를 재사용하여 메모리 및 자원을 절약할 수 있습니다. 매번 Bean을 생성하는데 비용이 들지 않아 비용면으로 유리합니다. - 의존성 관리 용이
싱글톤 스코프를 사용하여 동일한 빈 인스턴스에 의존성을 주입하기 때문에 의존성 관리가 용이해집니다.
스프링에서 모든 빈이 싱글톤으로 관리되는 것은 아닙니다. 스프링은 다른 스코프의 빈을 생성하도록 지원하며, 이를 통해 프로토타입(Prototype), 요청(Request), 세션(Session) 등의 다른 범위의 빈을 사용할 수 있습니다. 이러한 스코프는 필요에 따라 다른 인스턴스를 생성하거나 범위 내에서 공유하는 빈을 만들 수 있게 해줍니다.
예를 들어 싱글톤으로 관리되는 객체가 상태를 가지고 있는 경우 멀티스레드 환경에서 동기화 문제가 발생할 수 있습니다. 이때는 싱글톤 스코프를 사용하는 것이 아니라 프로토타입(Prototype) 스코프 등을 이용하여 문제를 해결할 수 있습니다.
💡@Configuration과 싱글톤
@Configuration을 부여하면 바이트 코드를 조작하는 CGLIB기술로 싱글톤을 보장합니다.
만약 @Configuration을 부여하지 않고 @Bean만 적용하여 구동하면, 스프링 빈으로 등록은 되지만 싱글톤을 보장하지 않습니다. 그렇기 때문에 스프링 설정 정보는 반드시 @Configuration을 부여해주어야 합니다.
빈 스코프 ( Bean Scope )
- Singleton (싱글톤)
기본 스코프로, 스프링 컨테이너 내에서 단 하나의 인스턴스를 생성하고 공유합니다. 모든 빈은 싱글톤으로 생성됩니다. - Prototype (프로토타입)
요청할 때마다 매번 새로운 인스턴스를 생성합니다. 각 요청마다 독립적인 빈 인스턴스를 제공합니다. 멀티 스레드 환경에서 예기치 못한 동작이 발생하지 않아야 하는 빈(thread-safe)인 경우 prototype을 사용해주어야 합니다. - Request (요청)
웹 애플리케이션에서 사용되는 스코프로, HTTP 요청마다 새로운 인스턴스를 생성합니다. 각 HTTP 요청마다 독립적인 빈 인스턴스를 제공합니다. - Session (세션)
웹 애플리케이션에서 사용되는 스코프로, 세션 당 하나의 인스턴스를 생성합니다. 각 세션마다 독립적인 빈 인스턴스를 제공합니다. - Global Session (글로벌 세션)
Portlet을 사용한 웹 애플리케이션에서 사용되는 스코프로, 글로벌 세션 당 하나의 인스턴스를 생성합니다. 각 글로벌 세션마다 독립적인 빈 인스턴스를 제공합니다. - Application (애플리케이션)
웹 애플리케이션 컨텍스트의 생명주기에 따라 하나의 인스턴스를 생성합니다. 애플리케이션 전체에서 공유되는 빈 인스턴스를 제공합니다. 즉 서블릿 컨텍스트가 만들어질 때마다 빈 인스턴스가 만들어 집니다. - WebSocket (웹소켓)
웹소켓 세션 당 하나의 인스턴스를 생성합니다. 각 웹소켓 세션마다 독립적인 빈 인스턴스를 제공합니다. - Custom (사용자 정의)
스코프 이름을 직접 정할 수 있고 정의한 규칙에 따라 빈 인스턴스를 생성합니다.
스코프는 @Scope 어노테이션을 사용하여 설정하거나, XML 기반의 설정 파일에서 지정할 수 있습니다.
프로토타입 스코프 (Prototype Scope)
프로토타입 스코프는 매번 빈을 요청할 때마다 새로운 인스턴스를 생성하여 반환합니다. 각 요청마다 독립적인 빈 인스턴스를 제공합니다.
프로토타입 빈을 사용하는 경우, 스프링 컨테이너는 빈을 생성하고 의존성 주입 등의 초기화 작업을 수행한 후에 해당 빈을 반환합니다. 이후에 같은 빈을 요청하더라도 매번 새로운 인스턴스를 생성하여 반환하므로, 각각의 빈 인스턴스는 독립적으로 동작합니다.
하지만 프로토타입 스코프는 빈을 반환해주고 나면 컨테이너는 더 이상 빈을 관리하지 않습니다. 그렇기에 프로토타입 빈을 관리할 책임은 프로토타입 빈을 받은 클라이언트에 있습니다.
프로토타입 빈 사용 경우
- 상태 정보가 유지되어야 하는 경우
싱글톤 빈은 상태 정보를 공유하기 때문에 여러 클라이언트 간에 동일한 상태를 유지할 수 없습니다. 이에 반해 프로토타입 빈은 각 클라이언트에게 독립적인 상태 정보를 제공할 수 있습니다. - 매 요청마다 새로운 인스턴스가 필요한 경우
예를 들어, 웹 애플리케이션에서 사용자 요청마다 새로운 폼 객체를 생성해야 하는 경우에 프로토타입 빈을 사용할 수 있습니다.
프로토타입 사용 방법
- `@Scope` 어노테이션 사용
@Component
@Scope("prototype")
public class PrototypeBean {
// ...
}
- XML 설정 파일 사용
<bean id="prototypeBean" class="com.example.PrototypeBean" scope="prototype" />
Web Scope: Request / Session / Application
웹 스코프는 웹 어플리케이션에서 사용되는 스코프로, HTTP 요청과 관련된 빈의 생명주기를 관리하는데 사용됩니다.
Spring Framework에서는 Request, Session, Application 3 가지 웹 스코프를 지원합니다.
- Request 스코프
Request 스코프는 HTTP 요청마다 새로운 인스턴스를 생성하고 해당 요청 동안만 유지합니다. 각 요청마다 독립적인 빈 인스턴스를 제공하며, 주로 요청마다 사용자 세션 정보와 관련된 빈을 처리하는 데 사용됩니다. - Session 스코프
Session 스코프는 사용자의 세션에 대한 라이프사이클을 따르는 빈을 관리합니다. 하나의 세션 내에서는 동일한 빈 인스턴스가 사용되며, 세션이 끝나면 해당 빈 인스턴스도 소멸됩니다. 주로 사용자 세션에 상태를 유지해야 하는 빈을 처리하는 데 사용됩니다. - Application 스코프
Application 스코프는 웹 애플리케이션의 생명주기를 따르는 빈을 관리합니다. 하나의 웹 애플리케이션 내에서는 동일한 빈 인스턴스가 사용되며, 웹 애플리케이션이 시작되고 종료될 때까지 유지됩니다. 주로 애플리케이션 전반에서 공유해야 하는 빈을 처리하는 데 사용됩니다.
웹 스코프 사용 방법
- `@Scope` 어노테이션 사용
@Component
@Scope("request") // @Scope("session"), @Scope("application")
public class webScopeBean {
// ...
}
- XML 설정 파일 사용
<bean id="requestScopedBean" class="com.example.RequestScopedBean" scope="request" />
'Spring Framework' 카테고리의 다른 글
Spring @ComponentScan, @Import, @Enable (0) | 2022.08.24 |
---|---|
Spring 빈 생명주기( Bean Life Cycle ) (0) | 2022.08.24 |
Spring @Autowried: 의존 관계 자동 주입 (0) | 2022.08.21 |
Spring 빈(Bean) 등록 방법 ( XML, Annotation, Java 설정 클래스 ) (0) | 2022.08.20 |
Spring IoC 컨테이너 계층구조 및 구성(웹 어플리케이션) (0) | 2022.08.20 |