728x90
반응형
스프링 빈 스코프 개요
스프링에서 빈 스코프는 빈의 생명주기를 정의하는 중요한 개념입니다. 즉, 스프링 IoC 컨테이너가 빈을 언제 생성하고 어떻게 관리하고, 어떻게 주입할지 결정하는 설정입니다. 스프링은 다양한 스코프를 지원하고, 각각의 스코프는 특정 시점에서 빈을 어떻게 주입할지를 정의합니다. 스프링에서 지원하는 대표적인 빈 스코프에는 아래와 같은 방법이 있습니다.
- 싱글톤(Singleton) : 기본 스코프로, 애플리케이션 전체에서 하나의 빈 인스턴스만 생성하고 공유합니다.
- 프로토타입(Prototype) : 요청할 때마다 새로운 빈 인스턴스를 생성합니다.
- Request : 웹 애플리케이션의 HTTP 요청 시마다 새로운 빈을 생성합니다.
- Session : HTTP 세션당 하나의 빈 인스턴스를 생성하고, 세션이 유지되는 동안만 사용합니다.
- Application : Application 스코프는 ServletContext와 동일한 범위로, 애플리케이션에서 하나의 인스턴스를 공유합니다.
대표적인 빈 스코프 : 싱글톤과 프로토타입
- 싱글톤 스코트
- 기본 설정 : 스프링에서 기본적으로 모든 빈은 싱글톤 스코프로 설정됩니다.
- 특징 : 애플리케이션이 실행되는 동안 IoC 컨테이너에 의해 하나의 빈 인스턴스만 생성되고, 모든 요청에서 동일한 인스턴스를 사용합니다.
- 장점 : 메모리 사용량이 적고, 빈 생성 비용이 적으며, 애플리케이션에서 공유하는 객체에 적합합니다.
- 단점 : 여러 곳에서 공유되기 때문에 상태를 가지고 있으면 동기화 문제를 발생시킬 수 있습니다.
// @Scope("singleton") // 생략 가능, 기본 스코프가 싱글톤이기 때문
@Component
public class SingletonService {
public String getMessage() {
return "This is a singleton service";
}
}
- 프로토 타입 스코프
- 특징 : 요청할 때마다 새로운 빈 인스턴스가 생성됩니다. 즉, 매번 새로운 객체가 필요할 때 사용합니다.
- 장점 : 빈이 상태를 가지는 경우 각 요청마다 독립적인 인스턴스를 생성하기 때문에 안전합니다.
- 단점 : 빈이 자주 생성되기 때문에 메모리 사용량이 증가할 수 있고 빈의 생명주기를 수동으로 관리해야 합니다.
@Scope("prototype")
@Component
public class PrototypeService {
public String getMessage() {
return "This is a prototype service";
}
}
웹 애플리케이션에서 사용되는 빈 스코프
- Request 스코프
- 특징 : 각 HTTP 요청마다 새로운 빈 인스턴스를 생성합니다. 웹 애플리케이션에서 요청 범위 내에서만 데이터를 유지할 필요가 있을 경우에만 사용합니다.
@Scope(value = WebApplicationContext.SCOPE_REQUEST, proxyMode = ScopedProxyMode.TARGET_CLASS)
@Component
public class RequestService {
public String getRequestScopedMessage() {
return "Request scoped message";
}
}
- Session 스코프
- 특징 : HTTP 세션당 하나의 빈 인스턴스가 생성되고, 세션이 유지되는 동안 동일한 빈을 사용할 수 있습니다. 주로 사용자의 세션 상태를 관리할 때 사용합니다.
@Scope(value = WebApplicationContext.SCOPE_SESSION, proxyMode = ScopedProxyMode.TARGET_CLASS)
@Component
public class SessionService {
public String getSessionScopedMessage() {
return "Session scoped message";
}
}
- Application 스코프
- 특징 : 애플리케이션 전체에서 하나의 빈 인스턴스가 생성되고, 모든 요청에서 동일한 빈을 공유합니다. ServletContext와 동일한 범위로, 주로 애플리케이션 전체에서 공유할 설정이나 데이터를 저장할 때 사용됩니다.
@Scope(value = WebApplicationContext.SCOPE_APPLICATION)
@Component
public class ApplicationService {
public String getApplicationScopedMessage() {
return "Application scoped message";
}
}
스프링 스코프 활용 시 주의점
- 프로토 타입 스코프의 생명주기 관리 : 프로토 타입을 사용할 때는 빈의 생명주기를 직접 관리해야 할 경우가 많아집니다. 특히, 스프링이 관리하는 싱글톤 빈에서 프로토 타입의 빈을 주입받을 경우 프로토 타입 빈이 재사용될 수 있기 때문에 주의해야 합니다. 이를 방지하기 위해 ObjectFactory 또는 @Lookup 애노테이션을 사용해서 항상 새로운 프로토 타입 빈을 생성할 수 있도록 처리해야 합니다.
- Request 및 Session 스코프의 웹 애플리케이션 적용 : 이 두 스코프는 웹 환경에서만 사용할 수 있으며, 일반 자바 애플리케이션에서는 이러한 스코프를 사용할 수 없습니다. 따라서 웹 애플리케이션 환경에서만 사용해야 합니다.
빈의 스코프와 성능 최적화
싱글톤 빈의 스레드 안전성
- 불변 객체 설계 : 싱글톤 빈은 상태를 가지지 않는 불변 객체로 설계하면, 멀티스레드 환경에서 스레드 안전성을 보장할 수 있습니다.
- 스레드 동기화 : 만약 싱글톤 빈이 상태를 가지는 경우에, 동기화(synchronized)를 통해 여러 스레드 간 동시 접근 문제를 해결할 수 있습니다.
- ThreadLocal 사용 : 스레드 간 독립적인 상태를 관리해야 한다면, ThreadLocal을 활용해서 각 스레드마다 고유한 데이터를 저장할 수 있습니다.
@Component
public class SingletonService {
private ThreadLocal<Integer> threadLocalCounter = ThreadLocal.withInitial(() -> 0);
public void incrementCounter() {
threadLocalCounter.set(threadLocalCounter.get() + 1);
}
public int getCounter() {
return threadLocalCounter.get();
}
}
프로토 타입 빈의 성능 최적화
- 생성 비용 최적화 : 프로토 타입 빈이 자주 생성되면 성능 저하를 초래할 수 있으므로, 불필요한 리소스를 사용하는 초기화 과정을 피하는 것이 좋습니다.
- 빈의 생명주기 관리 : 프로토 타입 빈은 스프링 컨테이너가 생명주기를 관리하지 않기 때문에 빈 사용 후 자원을 명시적으로 해제하는 것이 성능 최적화에 도움이 됩니다.
결론
스프링에서 빈의 스코프는 빈의 생명주기를 관리하는 중요한 요소입니다. 싱글톤 스코프는 기본 스코프로, 애플리케이션 전반에서 인스턴스를 공유하며, 프로토타입 스코프는 요청할 때마다 새 인스턴스를 생성해서 독립적인 객체 관리를 할 수 있습니다. 또한, 웹 애플리케이션에서는 HTTP 요청과 세션에 맞춰 Request, Session 스코프를 효과적으로 활용할 수 있습니다.
728x90
반응형
'🌱프레임워크 & 라이브러리 > 스프링부트' 카테고리의 다른 글
[Spring] 빈 등록과 관리 방법의 다양한 패턴 (0) | 2024.10.02 |
---|---|
[Spring] IoC 컨테이너의 동장 방식과 빈의 생명주기 관리 (0) | 2024.09.30 |
[Spring] IoC 컨테이너의 계층 구조 [루트와 서블릿] (0) | 2024.09.29 |
[Spring] DI(Dependency Injection, 의존성 주입) 개념과 원리 (0) | 2024.09.26 |
[Spring] 전통과 현재의 IoC 컨테이너 개요 (0) | 2024.09.26 |