본문 바로가기
코딩 공부/web & Java

[Spring] Bean 스코프

by 현장 2023. 10. 5.

싱글톤 스코프

기본적으로 Spring Framework에서 생성되는 모든 Bean은 싱글톤으로 생성됩니다. Spring IOC 컨테이너 당 객체 인스턴스를 딱 하나를 가지게 됩니다. 따라서 Spring IoC 컨테이너에서 같은 인스턴스를 다시 사용하고 싶다면 싱클톤 스코프를 사용하면 됩니다.

@Component
class NormalClass {

}

@Scope(value = ConfigurableBeanFactory.SCOPE_PROTOTYPE)
@Component
class PrototypeClass {

}


@Configuration
@ComponentScan
public class BeanScopesLuncherApplication {

    public static void main(String[] args) {
        try (var context =
                     new AnnotationConfigApplicationContext
                             (BeanScopesLuncherApplication.class))
        {
            System.out.println(context.getBean(NormalClass.class));
            System.out.println(context.getBean(NormalClass.class));
        }


    }
}

출력

com.in28minutes.learnspringframework.examples.e1.NormalClass@4d02f94e
com.in28minutes.learnspringframework.examples.e1.NormalClass@4d02f94e

 

Java Singleton와 차이점

Spring IoC 컨테이너 하나에는 객체 인스턴스가 하나입니다. 하지만 Java 싱글톤에서는 Java 가상 머신 하나당 객체 인스턴스가 하나입니다.

JVM에 Spring IoC 컨테이너를 하나만 실행한다면 Spring 싱글톤과 Java 싱글톤은 같은 의미일 수 있습니다. 하지만 JVM에 Spring IoC 컨테이너 여러 개를 실행하면 Spring 싱글톤은 Java 싱글톤과 달라집니다. 보통은 JVM에 Spring IoC 컨테이너 여러 개를 실행하지는 않아서 대부분의 경우 Spring 싱글톤과 Java 싱글톤은 똑같습니다. 
대부분 똑같지만 그래도 유의해야할 점입니다.

 

프로토 타입 스코프

프로토 타입 스코프의 경우 일반적으로 생성한 클래스와 다르게 출력할 때마다 새로운 인스턴스를 출력합니다. 따라서 Bean을 참조할 때마다 매번 다른 인스턴스를 생성하고 싶은 경우에 프로토 타입을 사용하면 됩니다.

 

@Component
class NormalClass {

}

@Scope(value = ConfigurableBeanFactory.SCOPE_PROTOTYPE)
@Component
class PrototypeClass {

}


@Configuration
@ComponentScan
public class BeanScopesLuncherApplication {

    public static void main(String[] args) {
        try (var context =
                     new AnnotationConfigApplicationContext
                             (BeanScopesLuncherApplication.class))
        {
            System.out.println(context.getBean(PrototypeClass.class));
            System.out.println(context.getBean(PrototypeClass.class));
            System.out.println(context.getBean(PrototypeClass.class));
        }


    }
}

출력

com.in28minutes.learnspringframework.examples.e1.PrototypeClass@2b48a640
com.in28minutes.learnspringframework.examples.e1.PrototypeClass@1e683a3e
com.in28minutes.learnspringframework.examples.e1.PrototypeClass@2053d869

사용법은 위와 같이 @Scope(value = ConfigurableBeanFactory.SCOPE_PROTOTYPE) 어노테이션을 클래스 바로 위에 입력을 해주면 됩니다.

 

싱글톤 스코프와 프로토 타입 스코프 차이점

  싱글톤 프로토타입
인스턴스 Spring IOC 컨테이너 하나 당 하나만 존재 가능 Spring IOC 컨테이너 하나 당 여러개 존재 가능
Bean 같은 Bean 인스턴스를 사용 Bean 참조 마다 새로운 Bean 인스턴스 생성
기본값 O X
코드 @Scope(value =
ConfigurableBeanFactory.SCOPE_SINGLETON) or Default
@Scope(value =
ConfigurableBeanFactory.SCOPE_PROTOTYPE)
사용 대부분 사용 가끔 사용
권장 시나리오 Statefu Beanl의 경우 Stateless Bean의 경우

 

웹 어플리케이션에서만 적용되는 스코프(간단히)

1. 리퀘스트 스코프

web-aware ApplicationContext에서만 사용되는 스코프로 웹 애플리케이션에는 HTTP 요청이 존재하는데 리퀘스트 스코프의 경우 HTTP 요청당 객체 인스턴스 하나가 생성됩니다.

 

2. 세션 스코프

세션은 보통 사용자와 관련되며 동일한 사용자에게 속하는 여러 번의 요청이 같은 세션에 속해 있을 수 있습니다.  또한 사용자 HTTP 세션당 객체 인스턴스 하나가 생성됩니다

3. 애플리케이션 스코프

애플리케이션 스코프는 웹 애플리케이션 전체에 객체 인스턴스가 하나입니다. 웹소켓 스코프에도 만들 수 있고, 웹소켓 인스턴스당 객체 인스턴스 하나입니다.

 

'코딩 공부 > web & Java' 카테고리의 다른 글

[Java] Java EE, J2EE, Jakarta EE  (1) 2023.10.06
[Spring] @PostConstruct와 @PreDestroy  (1) 2023.10.06
[Spring] 지연 초기화  (0) 2023.10.04
[Spring] @Component와 @Bean의 차이  (1) 2023.10.02
[Spring] Spring Bean  (0) 2023.10.01