@Component
public class StatelessService {
public int calculate(int value) {
return value * 10;
}
}
@Component
public class StatefulService {
private int price; // 상태를 유지하는 필드
public void order(String name, int price) {
this.price = price; // 문제가 되는 부분
}
public int getPrice() {
return price;
}
}
// 테스트 코드
@Test
void statefulServiceSingleton() {
ApplicationContext ac = new AnnotationConfigApplicationContext(AppConfig.class);
StatefulService service1 = ac.getBean(StatefulService.class);
StatefulService service2 = ac.getBean(StatefulService.class);
// ThreadA: 사용자 A가 10000원 주문
service1.order("userA", 10000);
// ThreadB: 사용자 B가 20000원 주문
service2.order("userB", 20000);
// 사용자 A가 주문 금액 조회
int price = service1.getPrice(); // 예상: 10000, 실제: 20000
assertEquals(20000, price);
}
@Configuration
public class AppConfig {
@Bean
public MyService myService() {
return new MyService();
}
@Bean
public MyRepository myRepository() {
return new MyRepository();
}
}
@Component
public class MyService {
private final MyRepository myRepository;
@Autowired
public MyService(MyRepository myRepository) {
this.myRepository = myRepository;
}
}