ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Bean의 스코프
    SPRING/스프링프레임워크 핵심개념 2021. 5. 13. 00:16

    Singleton Scope :

    하나의 인스턴스를 사용하는 Scope

    @Component
    public class Single {
        @Autowired
        Proto proto;
    
        public Proto getProto() {
            return proto;
        }
    }
    
    @Component
    public class Proto {
    }
    
    @Component
    public class AppRunner implements ApplicationRunner {
    
        @Autowired
        Single single;
    
        @Autowired
        Proto proto;
    
        @Override
        public void run(ApplicationArguments args) throws Exception {
            System.out.println("proto");
            System.out.println(proto);
    
            System.out.println("single");
            System.out.println(single.getProto());
        }
    }
    
    

     

    위의 single과 proto는 싱글톤 스코프이기 때문에 값이 동일하다. (주소값)

     

    prototype scope

    : 매번 새로운 인스턴스를 생성하여 사용하는 Scope

    @Component
    public class Single {
        @Autowired
        Proto proto;
    
        public Proto getProto() {
            return proto;
        }
    }
    
    @Component @Scope(value = "prototype", proxyMode = ScopedProxyMode.TARGET_CLASS)
    public class Proto {
    }
    
    @Component
    public class AppRunner implements ApplicationRunner {
    
        @Autowired
        ApplicationContext ctx;
    
        @Override
        public void run(ApplicationArguments args) throws Exception {
            System.out.println("proto");
            System.out.println(ctx.getBean(Proto.class));
    
            System.out.println("single");
            System.out.println(ctx.getBean(Proto.class));
    
            System.out.println("proto by single");
            System.out.println(ctx.getBean(Single.class).getProto());
            System.out.println(ctx.getBean(Single.class).getProto());
            System.out.println(ctx.getBean(Single.class).getProto());
        }
    }
    
    

     

    위와 같이 @Scope("prototype")를 명시하면 매번 새로운 인스터스를 생성한다.

    또한, Singleton타입의 빈이 prototype의 빈을 참조할 때에 매번 새로운 인스턴스를 생성하고 싶으면, proxyMode를 위와 같이 설정하면 된다.

     

    TIP.

    Singleton 객체를 사용할 때 주의점

    1. Property 공유

    - 멀티 쓰레드 환경에서 여러 쓰레드가 Property 를 공유할 수 있기 때문에 값의 동기화가 되지 않을 수 있다.

    - Thread-safe한 방법으로 코딩이 필요함.

     

     

     

Designed by Tistory.