Backend/Spring

[Spring] Bean Scope(빈 스코프) 란?

누구세연 2024. 9. 21. 18:49

스프링에서 다양한 객체(Bean)를 관리하고, 그 생명주기와 사용 범위를 제어할 수 있습니다.

이번 글에서는 스프링의 Bean Scope(빈 스코프)에 대해 알아보겠습니다.🧐

 

 

Bean이란?

스프링에서 Bean이란 스프링 IoC(Inversion of Control) 컨테이너에 의해 관리되는 객체를 말합니다.

스프링 애플리케이션에서는 대부분의 객체가 Bean으로 등록되고, 이를 통해 객체의 생명주기나 사용 범위를 쉽게 관리할 수 있습니다.

 

Bean Scope란?

Bean Scope는 말 그대로 Bean의 사용 범위를 의미합니다.

예를 들어, 어떤 Bean은 애플리케이션 내에서 딱 하나만 생성되어야 하고, 어떤 Bean은 매번 새롭게 생성되어야 할 수도 있습니다.

이런 필요에 따라 스프링에서는 다양한 스코프를 제공합니다.

 

스프링의 기본 Bean Scope는 singleton입니다.

만약 별도로 설정하지 않으면, 스프링은 Bean을 단 하나만 생성하고 이를 애플리케이션 내에서 공유해서 사용합니다.

하지만, 특정 요구 사항에 따라 다른 스코프도 사용할 수 있습니다.

 

Bean Scope의 종류

스프링이 제공하는 주요 Bean Scope를 살펴보겠습니다.

singleton(싱글톤)

  • 해당 Bean은 IoC 컨테이너에서 단 하나의 객체로만 존재합니다.
  • 애플리케이션이 시작될 때 한 번 생성되고, 모든 요청에서 동일한 인스턴스를 공유하여 사용합니다.
  • 대부분의 경우 Bean은 이 스코프를 사용합니다.
@Component
public class Service {

}

prototype(프로토타입)

  • 해당 Bean은 요청할 때마다 새로운 객체를 생성합니다.
  • 즉, Bean을 사용할 때마다 새로운 인스턴스가 필요할 때 사용합니다.
  • 일반적으로 상태를 가지는 객체나 특정 요청마다 고유한 인스턴스가 필요할 때 사용합니다.
@Scope("prototype")
@Component
public class MyPrototypeBean {

}

request(리퀘스트)

  • 주로 웹 애플리케이션에서 각 HTTP 요청마다 별도의 상태를 유지해야 할 때 사용됩니다.
  • 로그인 시도 정보나 특정 요청과 관련된 데이터를 저장하고 싶을 때 유용합니다.
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Component;

@Scope("request")
@Component
public class MyRequestBean {
}

session(세션)

  • 한 사용자의 HTTP 세션 동안 Bean 인스턴스가 유지되는 스코프입니다.
    즉, 같은 사용자가 여러 요청을 하더라도 해당 세션이 유지되는 동안 동일한 Bean 인스턴스를 사용할 수 있습니다.
  • 일반적으로 로그인 정보나 사용자 설정 같은 데이터를 유지할 때 사용됩니다.
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Component;

@Scope("session")
@Component
public class MySessionBean {
}

global session(글로벌 세션)

  • 포털 애플리케이션이나 글로벌 세션을 지원하는 분산 환경에서 사용됩니다.
  • 거의 사용되지 않으며 복잡한 웹 애플리케이션 환경에서 사용됩니다.
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Component;

@Scope("globalSession")
@Component
public class GlobalBean {
}
Tip: request, session, global session은 웹 애플리케이션에서만 사용가능합니다.
일반적인 스프링 애플리케이션에서는 사용하지 않습니다.

 

 

Bean Scope 사용법

Bean의 Scope는 클래스에 어노테이션을 추가해서 설정할 수 있습니다.

예를 들어, prototype 스코프를 적용하려면 아래와 같이 @Scope 어노테이션을 사용하면 됩니다.

import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Component;

@Scope("prototype")
@Component
public class MyController {

}

위 예제에서 MyController 클래스는 prototype 스코프로 지정되어, Bean을 요청할 때마다 새로운 인스턴스가 생성됩니다.

 

언제 어떤 Scope를 사용해야 할까?

  • singleton: 상태를 가지지 않는 서비스, 데이터 접근 객체(DAO), 유틸리티 객체 등에 사용합니다.
  • prototype: 상태가 필요하거나, 매번 새로운 객체가 필요한 경우 사용합니다.
  • request: HTTP 요청마다 고유한 데이터를 유지해야 할 때 사용합니다.
  • session: 사용자별로 고유한 데이터를 관리해야 할 때 사용합니다.

 

💡Bean Scope를 적절히 설정하면 애플리케이션의 성능과 메모리 사용을 최적화할 수 있습니다.
각 스코프의 특성과 용도를 이해하고, 상황에 맞게 사용하는 것이 중요합니다.