관리 메뉴

공부 기록장 💻

[Spring] 빈 스코프란? (Singleton, Prototype Scope) 본문

# Tech Studies/Java Spring • Boot

[Spring] 빈 스코프란? (Singleton, Prototype Scope)

dream_for 2023. 3. 22. 19:02

인프런 - 스프링 핵심 원리 기본편 정리


빈 스코프란?

스프링 빈은 스프링 컨테이너의 시작과 함께 생성되어, 스프링 컨테이너가 종료될 때까지 유지된다. 이는 스프링 빈이 기본적으로 싱글톤 스코프로 생성되기 떄문이다. (이전에 싱글톤 패턴이 무엇인지, 그리고 스프링의 싱글톤 컨테이너에 대해 학습한 적이 있다.)

 

스코프란 빈이 존재할 수 있는 범위를 말하며, 싱글톤 스코프 외에 스프링에서 지원하는 다양한 스코프에 대해 알아보도록 하자.

 

스프링에서 지원하는 스코프

  • 싱글톤 스코프: 기본 스코프로, 스프링 컨테이너의 시작과 종료까지 유지되는 가장 넓은 범위의 스코프
  • 프로토타입 스코프: 스프링 컨테이너가 프로토타입 빈의 생성, 의존관계 주입까지만 관여하고 더이상 관리하지 않는 매우 짧은 범위의 스코프
  • 웹 관련 스코프
    • request: 고객의 웹 요청이 들어오고 나갈 때까지 유지되는 스코프
    • session: 웹 세션이 생성되고 종료될 때까지 유지되는 스코프
    • application: 웹의 서블릿 컨텍스트와 같은 범위로 유지되는 스코프

 

컴포넌트 스캔 자동 등록, 또는 @Bean을 이용한 수동 등록 모두 스코프를 지정할 때는 아래와 같이 추가해주면 된다.

@Scope 어노테이션과 함께 prototype인지,  singleton인지 속성 값을 추가해준다.

 

@Scope("prototype")	// 프로토타입 스코프의 빈
@Scope("singleton")	// 싱글톤 스코프의 빈

 

 

 

 


그동안 스프링 예제들을 통해 싱글톤 스코프를 다뤘으니, 프로토타입 스코프을 확인해보도록 하자.

 

 

프로토타입 스코프

 

싱글톤 스코프의 빈을 조회 시, 스프링 컨테이너는 항상 같은 인스턴스의 스프링 빈을 반환한다.

아래 그림과 같이, 스프링 컨테이너는 본인이 관리하는 스프링 빈을 반환한다. 이후 같은 요청이 와도 같은 객체 인스턴스의 스프링 빈을 반환하여, 클라이언트는 동일한 주소의 빈을 공유하여 사용하게 된다.

 

 

 

반면 프로토타입 스코프를 스프링 컨테이너에 조회하면, 스프링 컨테이너는 항상 새로운 인스턴스를 생성하여 반환한다. 

 

 

클라이언트가 프로토타입 스코프의 빈을 컨테이너에 요청 시, 컨테이너는 프로토타입 빈을 생성하고 필요한 의존 관계를 주입하여 클라이언트에 반환한다.

이후 같은 요청이 오면, 항상 새로운 프로토타입 빈을 생성하여 반환한다.

 

 

결적으로, 스프링 컨테이너는 프토토타입 빈을 생성하고, 의존 관계 주입과 초기화까지만 처리한다. 한 번 반환한 빈에 대해서는 더이상 컨테이너가 관리하거나 개입하지 않는다.

프로토타입 빈을 관리할 책임은 프로토타입 빈을 받은 클라이언트에 있다. 따라서 @PreDestroy와 같은 종료 메서드가 호출되지 않는다.

 


 

Scope Test

아래 Singleton과 Prototype Bean 두 개를 생성하여 각각의 주소를 확인해보자.

 

Singleton Bean Test

먼저 singleton scope의 SingleTonBean 두 개를 각각 생성한 경우이다.

 

 

결과를 보니, 생성한 두 빈의 주소가 같은 것을 확인할 수 있다.

init 초기화도 한 번만 실행된 것을 확인할 수 있다.

즉 스프링 컨테이너에서 클라이언트가 각각 동일한 빈을 요청했을 때 동일한 객체를 응답한 것이다.

빈의 소멸도 정상적으로 진행된 것을 확인할 수 있다.

 

 

 

Prototype Test

이번에는 protoype scope를 지정한 PrototypeBean 을 각각 두 개 생성하는 경우이다.

 

 

결과를 보면, init 초기화 메서드가 각각 두 번 실행되었으며,

클라이언트가 두 번 요청했을 때 각각 서로 다른 객체를 응답했음을 확인할 수 있다.

한 번 클라이언트에게 빈을 던져 준 후 컨테이너에서 더이상 관리를 하지 않기 때문에, destory 소멸 메서드는 실행되지 않고 종료되었다.

(소멸이 필요한 경우, 직접 destory() 메서드 호출이 필요하다.)

 

 

 

결론적으로, 프로토타입 빈은 스프링 컨테이너에서 요청할 때마다 새로 생성되며, 스프링 컨테이너는 프토로라팁 빈의 생성과 의존 관계 주입, 초기화까지만 관여한다.

따라서 프로토타입 빈은 종료 메서드를 포함하여, 프로토타입 빈을 조회한 클라이언트가 관리해야 한다.

 

 

 

728x90
반응형
Comments