작성
·
323
0
싱글톤 방식의 문제점 코드에서,
@Test
void statefulServiceSingleton() {
AnnotationConfigApplicationContext ac = new AnnotationConfigApplicationContext(TestConfig.class);
StatefulService statefulService1 = ac.getBean("statefulService", StatefulService.class);
StatefulService statefulService2 = ac.getBean("statefulService", StatefulService.class);
// 스레드 A: A 사용자가 10000원 주문
statefulService1.order("userA", 10000);
// 스레드 B: B 사용자가 20000원 주문
statefulService2.order("userB", 20000);
// ThreadA: A 사용자 주문 금액 조회
int price = statefulService1.getPrice();
//ThreadA: 사용자A는 10000원을 기대했지만, 기대와 다르게 20000원 출력
System.out.println("price = " + price);
assertThat(statefulService1.getPrice()).isEqualTo(20000);
}
다음과 같이 statefulService1, statefulService2 로 StatefulService의 참조 변수를 2개 선언해주는데 이렇게 선언해주신 이유가 뭔가요?
다른 스레드라도 어차피 같은 참조를 호출하게 되지 않나요..? 단순히 스레드의 개념을 보여주시기 위해 Service 참조변수를 여러개 선언하신 건가요?
답변 1
5
싱글톤 객체가 상태를 가지는 경우 발생할 수 있는 문제점을 보여주시기 위해 두 개의 인스턴스로 보여주신 겁니다! statefulService1
과 2
는 서로 다른 클라이언트가 요청을 하여 생성되었고, 동일한 참조값이기 때문에 statefulService1
이 StatefulService
의 price
필드 값을 변경하였을 때, 전혀 상관이 없는 다른 클라이언트인 statefulService2
도 price
의 값을 변경 또는 접근하는 경우, statefulService1
이 price
값을 변경했기 때문에 영향을 받게 되는 문제가 발생할 수 있다는 것을 알려주시기 위함이라고 이해했습니다~
지찬우님 좋은 답변 감사합니다^^