[Spring] 싱글톤

골드곽
|2022. 7. 13. 23:57
반응형

싱글톤이란

객체의 인스턴스가 오직 하나만 생성되어 사용하는것

public class Singleton {

    private static Singleton instance = new Singleton();
    
    private Singleton() {} // 생성자는 외부에서 생성못하게 private 지정
    
    public static Singleton getInstance() {
        return instance;
    }
    
}

위 코드는 싱글톤이 유지되는 인스턴스이다.

장점

  • 무분별한 객체 인스턴스를 생성하지 않아도 된다.
    • 메모리 측면에서 굉장히 효율적
    • 이미 만들어진것을 사용하다보니 사용속도에서도 이점
  • 클래스 인스턴스이기때문에 데이터 공유하기에 쉽다.

 

싱글톤 주의점

싱글톤 사용하여 공유필드를 사용하면, 문제가 생긴다.

1. StatefulService.java
private int price;

public void order(String name, int price){
    System.out.println("name = " + name + ", price = " + price);
    this.price = price;
}

public int getPrice(){
    return price;
}

2. StatefulServiceTest.java
@Test
 void statefulServiceSingleton(){
    ApplicationContext ac = new AnnotationConfigApplicationContext(TestConfig.class);
    StatefulService statefulService1 = ac.getBean("statefulService", StatefulService.class);
    StatefulService statefulService2 = ac.getBean("statefulService", StatefulService.class);

    //A사용자 1만원 주문
    statefulService1.order("userA", 10000);
    //B사용자 2만원 주문
    statefulService2.order("userB", 20000);

    int price = statefulService1.getPrice();
    //결과는 뒤에 주문한 20000이 나오게된다.
    System.out.println(price);
}

 

위에서 아래로 변경된 공유하는 필드가 없는 무상태로 만들어야한다.

 

1. StatefulService.java
public int order(String name, int price){
    return price
}

2. StatefulServiceTest.java
@Test
 void statefulServiceSingleton(){
    ApplicationContext ac = new AnnotationConfigApplicationContext(TestConfig.class);
    StatefulService statefulService1 = ac.getBean("statefulService", StatefulService.class);
    StatefulService statefulService2 = ac.getBean("statefulService", StatefulService.class);

    //A사용자 1만원 주문
    int userAPrice = statefulService1.order("userA", 10000);
    //B사용자 2만원 주문
    int userBPrice = statefulService2.order("userB", 20000);

    //결과는 A사용자가 주문한 금액을 그대로 return 받기 때문에 공유되지 않아 10000이 나온다.
    System.out.println(userAPrice);
}
반응형

'공부 > 과거 자료' 카테고리의 다른 글

[Java] 클래스메서드, 인스턴스메서드  (0) 2022.07.14
[Spring] 의존관계 자동 주입  (0) 2022.07.14
[Spring] ComponentScan  (0) 2022.07.14
[Spring] @Configuration, @Bean, Application  (0) 2022.07.13
[Spring] DI 란  (0) 2022.07.13