백엔드/Spring

[Spring] 빈 스코프

kwang2134 2024. 7. 12. 19:05
728x90

빈 스코프 - 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")

 

애플리케이션 스코프는 웹 애플리케이션의 생명주기와 같은 범위를 가지는 스코프이다.

즉, 웹 애플리케이션이 시작될 때 생성되고, 종료될 때 함께 소멸된다.

따라서 하나의 애플리케이션 내에서 단 하나의 인스턴스만 존재한다.

스프링의 싱글톤 스코프의 웹 버전이라고 생각하면 된다.

하지만 스프링 애플리케이션과는 시작 시점이 다를 수 있기에 프록시를 사용해 초기화 시점을 조정해 주는 것이 좋다


스프링 핵심 원리 - 기본편 강의 | 김영한 - 인프런 강의 내용 참고

 

728x90