Spring bean scope
스프링 빈(bean)에서의 scope(스코프)란 빈 이 생성되고 제거되는 생명주기라고 정의할 수 있다.
흔히 알고 스프링의 기본 빈은 싱글톤으로 생성되며 해당 빈의 스코프는 스프링의 컨테이너가 시작부터 종료까지 유지되는 가장 긴 생명주기를 가지고 있다.
주로 필드 주입, 기본 생성자 방식으로 DI 하는 클래스 나 인터페이스 객체들이 이 빈 스코프 생명 주기에 해당한다.
스프링 빈들의 스코프는 스프링 컨테이너가 관리를 하며 일반적으로 클라이언트가 관리하지 않는 스프링에 의존적인 빈 들이다.
하지만, 일반적인 스코프를 가지지 않는 빈들 또한 스프링에 존재한다.
- prototype scope: 이름 그대로 사용자 정의 빈 스코프이다. 빈의 생성과 DI만 스프링이 관여하고 빈을 제거하고 변경하는 것은 사용자가 직접 제어할 수 있다.
- Web Scope: HTTP reuqest 웹 요청이 들어오고 나갈 때까지 생명주기를 갖는 request 스코프나 session 생성 만료까지 생명주기를 갖는 session scope 등 스프링 웹에서 사용하는 스코프 주기가 있다. 기본 생성 빈과는 다르게 특수한 조건을 만족할 때 생성되거나 제거되지만 해당 빈들의 스코프는 스프링 컨테이너가 관리한다.
프로토타입 스코프(prototype scope)
싱글톤 빈을 요청하면 스프링 컨테이너가 자신이 관리하는 해당 빈 객체를 반환해 준다.
그리고 어떤 클라이언트가 요청하든 동일한 주솟값을 가지는 동일 객체이다.
프로토타입 스코프는 빈을 요청하면 빈을 요청한 시기에 스프링 컨테이너가 생성과 DI(의존관계 주입)를 설정해 주고 클라이언트에게 반환해 준다. 하지만 싱글톤 패턴이 아니기 때문에 해당 빈 생성 요청마다 새로운 빈 객체를 반환한다.
빈의 관리 책임은 클라이언트에게 있으며 빈의 제거 또한 클라이언트가 책임을 진다.
프로토타입 스코프는 앞선 예시에서 Web scope와 같은 특수한 생명주기를 가져야 할 때 활용된다.
비록 Web scope는 스프링 컨테이너가 관리 정확히는 웹 서블릿 애플리케이션 컨텍스트 기반으로 스프링 컨테이너가 관리하지만 클라이언트가 특수한 생명주기를 가진 빈 이 필요하다고 할 때 클라이언트 관리 기반으로 설계가 가능한 장점이 있다.
싱글톤 빈이 프로토타입 스코프 빈을 의존 할때
싱글톤 빈 내에서 프로토타입 빈을 사용하고 있다면 기본 싱글톤 빈은 단 한 번만 생성되기 때문에 의존하고 있는
프로토타입 스코프를 가진 빈 또한 한 번만 생성돼서 해당 싱글톤 빈에 주입되기 때문에 프로토타입 스코프 빈을 생성한
목적과 맞지 않게 싱글톤 빈처럼 동일한 프로토타입 스코프 빈 객체만 싱글톤 빈 이 참조하게 된다.
이러한 문제는 빈 생성 시 스프링 어노테이션 기반 @Scope 설정을 통해서 해결이 가능하다.
@Component
@Scope(value = "prototype", proxyMode = ScopedProxyMode.TARGET_CLASS)
public class HelloWorld {
}
proxyMode설정을 통해서 해당 HelloWorld 빈을 의존하고 있는 싱글톤 빈 객체 생성시 HelloWorld가상의 구상체를 통해서 의존하게끔 하여 실제 HelloWorld 객체를 요청시에는 실제 빈 객체를 생성해서 사용할 수 있도록 문제해결이 가능하다.
'개발 > 백엔드' 카테고리의 다른 글
[백엔드]Singleflight 디자인패턴 (0) | 2025.07.11 |
---|