8월 30, 2023

[Spring] Bean의 범위 - 싱글톤, 프로토타입, 요청, 세션, 글로벌 세션

Spring에서 Bean을 정읳라 때 Bean의 범위 (bean scope)에 따라 컨테이너로부터 요청을 받는 떄에 따라 인스턴스가 만들어지고 관리되는 규칙을 정의할 수 있다. Bean의 범위에는 크게 다섯가지 유형: 싱글턴 (singleton scope), 프로토타입 (prototype scoe), 요청 (request scope), 세션 (session scope), 글로벌 세션 (global session scope)으로 구성되며 오늘은 각각의 유형에 대해 알아보도록 하자.


1. 싱글톤 범위 (singleton scope)

Spring에서의 Singleton은 Java의 싱글톤 디자인 패턴과는 차이가 있다. Spring에서의 싱글톤은 컨테이너 당 하나의 인스턴스만 존재한다는 것을 의미한다. 또한 Spring에서 scope을 따로 명시하지 않을 경우 디폴트로 적용되는 scope은 싱글톤이다. 

 

컨테이너로부터 싱글톤 스콥의 Bean을 처음 요청하게 되면 Spring은 인스턴스 하나를 생성하고 캐시에 보관하게 된다. 만약 그 이후에도 동일 Bean을 요청하면 Spring은 처음 요청 시 캐시에 보관한 인스턴스의 참조들을 반환한다고 생각하면 된다. 




위와 같은 이미지로 설명이 될 수 있다. 즉 싱글톤 범위의 Bean은 여러 클래스 인스턴스들 사이에서 공유된다고 할 수 있다. 싱글톤 범위를 사용하면 요청을 받을 때마다 객체를 만들어내는 overhead를 걱정하지 않을 수 있다는 장점이 있다.


2. 프로토타입 범위 (prototype scope) 

프로토타입 범위의 Bean은 Java에서 new 키워드로 객체를 생성하는 것과 비슷하다고 생각하면 된다. 프로토타입 범위로 설정한 bean은 설정 xml파일에서 getBean() 메서드가 호출되거나, 다른 Bean에 주입이 이루어질 떄마다 객체가 생성된다. 

 

즉 프로토타입 스콥의 Bean은 컨테이너로부터 요청을 받을 시 매번 새로 생성되어 컨테이너 밖으로 전달된다. 그러나 예외가 있다. 종속 관계로 이루어진 클래스가 싱글톤 범위인 경우 다시 생성되지 않고 캐시된 인스턴스가 주입되어 반환된다.

 

즉 하나의 종속성과 1:1 참조관계인 것이다. 이는 같은 종속관계더라도 계속 여러 참조가 같은 인스턴스를 사용했던 싱글톤과는 차이가 있다는 것이다. 

 

프로토타입 스콥을 도식으로 나타내면 아래와 같다.

 


 


이렇게 가장 중요하다고 할 수 있는 싱글톤 범위, 프로토타입 범위를 알아보았다. 다음 요청범위, 세션범위, 글로벌세션 범위는 웹 응용프로그램의 관점에 국한했을 때만 유용한 기능이다. 

 

3. 요청 범위 (request scope) 

요청범위로 설정되어 있는 Bean은 HTTP의 요청으로 주입이 발생할 때마다 객체가 생성되는 방식이다. 


4. 세션 범위 (session scope)

세션범위의 Bean은 표준 세션 범위 변수의 범위 안에서만 사용 가능한 스콥이다. 


5. 글로벌 세션 범위 (global session scope) 

포틀릿 응용프로그램의 관점에서만 적용 가능한 스콥을 글로벌 세션 범위라고 부른다.