Spring Framework Bean 스코프 - 프로토타입 및 싱글톤

Soo·2024년 3월 5일

이번 포스팅에서는 Spring Bean의 스코프에 대해서 기록해 보겠습니다.

하나는 일반 @Component를 사용하고 다른 하나는 @Scope(value = ConfigurableBeanFactory.SCOPE_PROTOTYPE)를 사용하여 프로토 타입 Spring Bean으로 만듭니다.

package com.in28minutes.learnspringframework.example.e1;

import org.springframework.beans.factory.config.ConfigurableBeanFactory;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Component;

@Component
class NormalClass {

}

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

}

@Configuration
@ComponentScan
public class BeanScopeLauncherApplication {
    public static void main(String[] args) {

        try (var context = new AnnotationConfigApplicationContext
                (BeanScopeLauncherApplication.class)) {

            System.out.println(context.getBean(NormalClass.class));
            System.out.println(context.getBean(NormalClass.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.example.e1.NormalClass@4bb33f74
com.in28minutes.learnspringframework.example.e1.NormalClass@4bb33f74
com.in28minutes.learnspringframework.example.e1.PrototypeClass@759d26fb
com.in28minutes.learnspringframework.example.e1.PrototypeClass@3c73951
com.in28minutes.learnspringframework.example.e1.PrototypeClass@3d5c822d

@Component로 생성한 NormalClass의 경우 @4bb33f74로 하나의 해시코드를 가집니다.

하지만, PrototypeClass를 보면 해시코드가 모두 다릅니다.

기본적으로 Spring Framework에서 생성되는 모든 Bean은 싱글톤입니다.

싱글톤은 Bean을 요청할 때마다 같은 인스턴스가 반환됩니다.

싱글톤은 Spring IoC 컨테이너당 객체 인스턴스가 딱 하나입니다.

하지만, 프로토타입은 Spring IoC 컨테이너에 여러 객체 인스턴스가 있을 수 있습니다.

Bean을 요청할 때마다 특정한 Bean의 새 인스턴스를 반환합니다.

결론

Sprig IoC 컨테이너에서 같은 인스턴스를 다시 사용하고 싶다면 싱글톤 스코프를 사용하면 됩니다.

Bean 요청마다 새로운 인스턴스를 사용하고 싶다면 프로토타입 스코프를 사용하면 됩니다.

0개의 댓글