빈 스코프 - Scope
스프링 빈은 스프링 컨테이너의 시작과 함께 생성되어서 스프링 컨테이너가 종료될 때까지 유지된다.
기본적으로 스프링 빈은 singleton으로 생성되기 때문이다.
스프링은 singleton 외에도 다양한 스코프를 지원한다
- 싱글톤 (singleton) : 기본 지정 스코프, 컨테이너 시작과 종료까지 유지되는 가장 넓은 범위의 스코프
- 프로토타입 (prototype) : 프로토타입 빈의 생성과 의존관계 주입까지만 관여하고 더는 관리하지 않는 매우 짧은 범위의 스코프
- 웹 관련 스코프
- request : 웹 요청이 들어오고 나갈때 까지 유지되는 스코프
- session : 웹 세션이 생성되고 종료될 때 까지 유지되는 스코프
- application : 웹의 서블릿 컨텍스트와 같은 범위로 유지되는 스코프
1. 싱글톤 스코프 - @Scope("singleton)
컨테이너 시작시 생성되어 유지되는 방식으로 하나의 동일한 인스턴스를 가지고 있기 때문에 클라이언트가 요청 시 항상 동일한 인스턴스의 스프링 빈을 반환한다.
시작과 종료까지 유지 -> 컨테이너 실행 시 생성, 종료 시 소멸
2. 프로토타입 스코프 - @Scope("prototype")
클라이언트가 요청할 때 프로토타입 빈을 생성하고 의존관계를 주입한다.
이후 생성한 빈을 반환하고 클라이언트가 새로 요청할 때마다 반복한다.
즉 매번 요청시 새로운 인스턴스가 반환된다.
요청 시 생성 -> 생성에는 관여하나 소멸에 대한 책임은 없음 -> 클라이언트가 직접 종료 호출
3. 웹 스코프
3.1 @Scope("request")
웹 애플리케이션에서 요청(request) 당 하나의 인스턴스를 생성하는 스코프이다.
각각의 HTTP 요청마다 새로운 빈 인스턴스가 생성되며, 요청 처리가 끝나면 빈 인스턴스는 폐기된다.
동시에 여러 요청이 온다면 정확히 어떤 요청이 남긴 로그인지 구분하기 어렵다.
requset 스코프를 사용하면 요청당 인스턴스가 생성되기 때문에 구분하기 편하다.
스프링 애플리케이션을 실행할 때 싱글톤 빈은 생성해서 주입이 되지만 request 빈은 요청 시 생성을 수행하기 때문에 Provider를 사용해 request를 호출하는 시점까지 생성을 지연해 주거나 프록시를 사용해 대리 객체를 생성해 주어야 한다.
@Scope(value = "request", proxyMode = ScopedProxyMode.TARGET_CLASS)
스코프 내에 프록시 코드를 추가해 주면 가짜 클래스를 만들어 대신 주입을 해두고 실제 요청이 들어올 시 진짜로 교체하여 사용하는 방식이다.
3.2 @Scope("session")
웹 애플리케이션에서 세션(session) 당 하나의 인스턴스를 생성하는 스코프이다.
주로 사용자의 로그인된 상태나 장바구니와 같은 세션에 의존적인 데이터를 관리할 때 유용하다.
세션 스코프 또한 세션이 생성될 때 인스턴스가 생성되기 때문에 프록시를 사용해 주어야 한다.
3.3 @Scope("application")
애플리케이션 스코프는 웹 애플리케이션의 생명주기와 같은 범위를 가지는 스코프이다.
즉, 웹 애플리케이션이 시작될 때 생성되고, 종료될 때 함께 소멸된다.
따라서 하나의 애플리케이션 내에서 단 하나의 인스턴스만 존재한다.
스프링의 싱글톤 스코프의 웹 버전이라고 생각하면 된다.
하지만 스프링 애플리케이션과는 시작 시점이 다를 수 있기에 프록시를 사용해 초기화 시점을 조정해 주는 것이 좋다
스프링 핵심 원리 - 기본편 강의 | 김영한 - 인프런 강의 내용 참고
'백엔드 > Spring' 카테고리의 다른 글
[Spring] 서블릿 & JSP MVC (0) | 2024.07.22 |
---|---|
[Spring] 자바 Servlet & JSP (3) | 2024.07.22 |
[Spring] 의존관계 주입 (1) | 2024.07.12 |
[Spring] 컴포넌트 스캔 - Component Scan (0) | 2024.07.11 |
[Spring] 스프링 컨테이너 - Spring Container (0) | 2024.07.11 |