스프링 프레임워크의 싱글톤 스코프, 프로토타입 스코프, 웹 스코프는 각각 다른 빈(Bean) 생명주기와 관리 방식을 제공합니다. 이들의 공통점과 차이점을 아래와 같이 정리할 수 있습니다.
정의: 애플리케이션 전체에서 단 하나의 빈 인스턴스만을 생성하고 공유합니다.
생명주기: 애플리케이션이 시작될 때 생성되고 종료될 때 소멸합니다.
특징:
애플리케이션 내에서 공유되는 유일한 인스턴스입니다.
애플리케이션의 시작 시 생성되고 종료 시 소멸합니다.
메모리 사용 효율성이 높으며, 공유 상태 관리에 유의해야 합니다.
스프링의 기본 스코프입니다.
정의: 빈을 요청할 때마다 새로운 인스턴스를 생성합니다.
생명주기: 스프링 컨테이너는 빈의 생성과 의존성 주입 후 더 이상 관리하지 않습니다.
특징:
각 요청마다 독립적인 인스턴스가 제공됩니다.
스프링 컨테이너는 생성과 의존성 주입 후에는 빈의 생명주기를 관리하지 않습니다.
매 요청 시마다 초기화와 소멸 과정이 반복되므로 메모리 사용량이 높을 수 있습니다.
프로토타입 빈을 관리할 책임은 프로토타입 빈을 받은 클라이언트에 있다. 그래서@PreDestroy
같은 종료 메서드가 호출되지 않는다.
정의: 웹 애플리케이션의 특정 생명 주기 (예: HTTP 요청, 세션)에 따라 빈의 생명 주기가 관리됩니다.
생명주기: 예를 들어, request 스코프의 경우 HTTP 요청마다 새로운 인스턴스가 생성되고 요청이 끝나면 소멸합니다.
특징
웹 스코프는 다음과 같이 세분화됩니다:
- Request 스코프:
HTTP 요청마다 별도의 빈 인스턴스를 생성합니다.
요청이 시작될 때 생성되고, 요청이 끝날 때 소멸합니다.
각 요청이 개별적인 상태를 유지해야 할 때 유용합니다.- Session 스코프:
사용자의 HTTP 세션마다 별도의 빈 인스턴스를 생성합니다.
세션 생성 시점에 빈이 생성되며 세션이 종료될 때 소멸합니다.
사용자별 상태 정보를 유지할 때 사용됩니다.- Application 스코프:
웹 애플리케이션의 서블릿 컨텍스트마다 빈 인스턴스를 생성합니다.
애플리케이션 레벨에서 공유되는 데이터 관리에 적합합니다.
스프링 컨테이너 관리: 모든 스코프는 스프링 컨테이너에 의해 빈의 생성과 관리가 이루어집니다.
의존성 주입 지원: 스프링은 모든 스코프의 빈에 대해 의존성 주입을 지원합니다.
싱글톤: 애플리케이션 전체 생명주기에 걸쳐 하나의 인스턴스만 존재합니다.
프로토타입: 빈 요청시마다 새 인스턴스가 생성되며 스프링은 생성 후 관리하지 않습니다.
웹 스코프: 웹 요청이나 세션 등의 생명주기에 따라 빈이 생성되고 소멸합니다.
싱글톤: 웹 및 비웹 애플리케이션에 모두 사용될 수 있습니다.
프로토타입: 웹, 비웹 애플리케이션에 사용되며, 사용 후 관리는 사용자의 책임입니다.
웹 스코프: 웹 애플리케이션의 특정 생명주기 (HTTP 요청, 세션 등)에 국한됩니다.
싱글톤: 모든 클라이언트에게 동일한 인스턴스를 공유합니다.
프로토타입: 각 요청마다 독립적인 인스턴스를 제공합니다.
웹 스코프: 요청 또는 세션마다 독립적인 인스턴스를 제공합니다.
이러한 차이점들은 각 스코프를 특정 상황에 적합하게 만듭니다. 예를 들어, 전역적으로 공유되어야 하는 자원은 싱글톤 스코프로, 요청마다 독립적인 상태가 필요한 경우 프로토타입이나 웹 스코프로 관리할 수 있습니다.
@Scope("prototype")
@Component
public class HelloBean {}
@Scope("prototype")
@Bean
PrototypeBean HelloBean() {
return new HelloBean();
}
스프링 컨테이너에 프로토타입 스코프의 빈을 요청하면 항상 새로운 객체 인스턴스를 생성해서 반환한다. 하지만 싱글톤 빈과 함께 사용할 때는 의도한 대로 잘 동작하지 않으므로 주의해야 한다.
-> DL을 사용하면 문제 없다.