06 싱글톤

p70(좌측이미지) - src/test/java/spring/basic/design/Singleton

public class Singleton {
    private static final Singleton instance = new Singleton();

    public static Singleton getInstance() {
        return instance;
    }

    private Singleton() {

    }
}

p70(우측이미지), p71, p74 - src/test/java/spring/basic/design/SingletonTest

public class SingletonTest {

    static class SingletonCautionService {

        private int amount;

        public void order(int amount) {
            this.amount = amount;
        }

        public int getOrder() {
            return amount;
        }
    }

    @Configuration
    static class CautionConfiguration {
        @Bean
        public SingletonCautionService singletonCautionService() {
            return new SingletonCautionService();
        }
    }

    @Test
    @DisplayName("싱글톤 객체 테스트")
    void singelton() {
        Singleton instance = Singleton.getInstance();
        Singleton instance2 = Singleton.getInstance();

        Assertions.assertThat(instance).isSameAs(instance2);
    }

    @Test
    @DisplayName("스프링 컨테이너 싱글톤 테스트")
    void containerSingleton() {
        AnnotationConfigApplicationContext ac = new AnnotationConfigApplicationContext(AppConfig.class);
        UserService userService = ac.getBean("userService", UserService.class);
        UserService userService1 = ac.getBean("userService", UserService.class);

        Assertions.assertThat(userService).isSameAs(userService1);
    }

    @Test
    @DisplayName("싱글톤 문제점, 멤버변수 공유에 대한 테스트")
    void cautionSingleton() {
        ApplicationContext ac = new AnnotationConfigApplicationContext(CautionConfiguration.class);
        SingletonCautionService sc = ac.getBean("singletonCautionService", SingletonCautionService.class);
        SingletonCautionService sc2 = ac.getBean("singletonCautionService", SingletonCautionService.class);

        sc.order(1000);
        sc2.order(2000);

        Assertions.assertThat(sc.getOrder()).isEqualTo(1000);
        Assertions.assertThat(sc2.getOrder()).isEqualTo(2000);
    }
}

Last updated