빈 스코프란
이번에는 빈 스코프에 대해 알아보려고 합니다.
빈 스코프란 단순하게 다양한 빈 설정 정보 중 하나로 볼 수 있습니다.
스코프(Scope)라는 이름에 맞게, 빈 스코프는 빈 객체가 생성되어 사용되는 범위입니다.
스프링에서는 이러한 빈 스코프를 클래스 레벨에서 기술할 필요 없이 Configuration 파일에서 기술할 수 있게 해줍니다.
스프링이 제공하는 빈 스코프는 총 6가지가 있는데요,
그 중 4개는 세션 정보가 필요해서, 웹서버와 함께 Spring을 구동할 때에만 사용이 가능합니다.
참고로 커스텀 빈 스코프도 만들 수 있다고 하니, 빈 스코프 확장에 대한 제약은 없어보입니다.
그럼 이제 스프링이 제공하는 6개의 빈 스코프를 알아보겠습니다.
Singleton Scope
디폴트 빈 스코프이며 말 그대로 해당 빈을 싱글톤으로 관리합니다.
달리 말하면, 스프링 IoC 컨테이너는 해당하는 빈을 정확히 하나의 인스턴스로 관리합니다.
그리고 스프링 컨테이너에서는 이러한 싱글턴 인스턴스들을 캐시에 저장시킵니다.
하지만 일반적으로 이야기하는 GoF의 싱글톤 패턴하고는 다른데요, GoF에서 기술하는 싱글톤은 ClassLoader 당 하나의 클래스임을 보장하는 것이지만 스프링에서의 싱글톤은 컨테이너 당 하나의 빈임을 보장하는 것입니다.
ClassLoader란, .class 바이트 코드를 읽어들여 class 객체를 생성하는 역할을 담당합니다. (JVM 개념)
Prototype Scope
싱글톤 빈과는 다르게 매 빈에 대한 요청마다 빈이 컨테이너에 생성됩니다.
여기서 말하는 요청은 웹 요청을 의미하는 것은 아니며, 주입되거나 getBean() 메소드를 통해 빈 요청을 보내는 경우를 의미합니다.
스프링에서는 모든 상태를 가지는 빈에는 Prototype Scope를, 상태를 가지지 않는 빈에는 Singleton Scope를 권장합니다.
다른 스코프를 가진 빈들과는 대비되는 점이 몇 개 있는데요,
- 스프링 컨테이너는 프로토타입 빈의 전체 라이프사이클을 관리하지는 않습니다.
- 따라서 스프링 컨테이너는 프로토타입 빈에 대한 생성 책임은 있지만, 소멸 책임은 가지지 않습니다.
- 즉, 이 말은 클라이언트 코드에서 프로로타입 빈에 대한 자원 반납을 해줘야 한다는 것을 의미합니다.
- 만약 프로토타입 빈을 사용하면서 자원 반납을 스프링에게 맡기고 싶다면, bean post-procesor를 사용하라고 합니다.
어떻게보면 프로토타입 빈은 단순하게 자바의 new 연산자를 대체한다고 봐도 됩니다.
new 연산자를 사용한 뒤의 객체의 책임은 클라이언트에게 있듯, 프로토타입 빈도 똑같습니다.
그렇지만 프로토타입 빈은 문제점을 하나 가지는데요, 바로 싱글톤 빈과 함께 사용되었을 땝니다.
IoC 컨테이너는 의존성을 빈 생성 시점에 단 한번만 주입하는데 만약 싱글톤 빈이 프로토타입 빈을 참조하고 있다면 어떻게 될까요? 프로토타입 빈은 생명주기가 컨테이너와 같지 않은데요, 싱글톤 빈이 참조하는 경우라면 소멸되지 않습니다. 즉, 프로토타입 빈이 싱글톤 빈처럼 작동하게 됩니다.
만약 싱글톤 빈에서 프로토타입 빈을 참조하면서도 프로토타입 빈을 여러 번 생성하고 싶다면 Method Injection, ObjectFactory, Provider 등의 방법을 사용하면 되는데, 범위를 벗어나기에 여기서는 다루지 않겠습니다.
Request, Session, Application, WebSocket Scope
위 스코프들은 모두 웹 관련 스코프입니다.
간단하게 설명하자면 다음과 같습니다.
- Request Scope
scope를 request로 지정하는 경우, HTTP 요청이 들어올 때마다 빈이 생성됩니다.
만약 요청에 대한 작업이 끝났을 경우 해당 빈은 컨테이너에서 제거됩니다.
- Session Scope
HTTP 세션의 수명과 동일하게 유지되는 빈입니다.
세션이 폐기되면 Session Scope 빈도 컨테이너에서 제거됩니다.
- Application Scope
전체 웹 어플리케이션에 대해 한 번 생성되는 빈입니다.
싱글톤 빈과 비슷하게 느껴질 수 있지만, 두 가지 다른 특징이 존재합니다.
우선 첫번째로, 싱글톤은 ApplicationContext 마다 하나의 빈으로 관리되지만, Application Scope는 ServeletContext마다 하나씩 관리됩니다. 두번째로, Application Scope에 대한 정보는 ServletContext에서 드러나게 됩니다.
- WebSocket Scope
웹소켓 세션과 동일한 생명주기를 가지는 빈입니다.
참고자료
https://docs.spring.io/spring-framework/docs/current/reference/html/core.html#beans-factory-scopes
'Spring' 카테고리의 다른 글
Spring Interceptor (8) | 2023.05.03 |
---|---|
ResponseEntity, RequestEntity, HttpEntity (1) | 2023.05.01 |
Spring Boot에서 로깅해보기 (1) | 2023.05.01 |
의존성 주입(DI)이란? (1) | 2023.04.16 |
Bean, IoC 컨테이너의 기본 개념 정립하기 (0) | 2023.04.16 |