Spring 컨테이너는 Configuration에서 빈을 등록하면, 해당 빈을 가지고 공유한다.
떄문에 싱글톤을 구현하기 위해 추가의 코드(static, getInstance)를 작성할 필요가 없다.
실제로 getBean()을 통해 테스트를 해도, 같은 빈이 호출되는 것을 알 수 있다.
물론 객체를 생성할 때마다 빈을 생성하는 방식도 가능하다 (후에 빈 스코프에서 학습예정)
앞서서 Spring 컨테이너는 기본적으로 싱글톤을 따른다.
싱글톤 방식은 여러 클라이언트가 하나의 객체 인스턴스를 사용한다는 것이다.
이때 주의 해야 할 점은 싱글톤 객체가 stateful하지 않고 stateless해야 한다는 것이다.
객체 내부의 price 변수가 있고, 이를 변경하는 메소드가 있다면
userA가 price 변수를 200원으로 바꾸고, 가격을 조회하고자 한다. 하지만 그 사이에 다른 스레드에서 userB가 price변수를 500원으로 바꾼다.
-> 그렇다면 userA에게는 200원이 아닌 500원의 가격이 조회될 것이다. (실제였다면 500원이 결제되거나)
이렇듯 싱글톤 객체가 stateful하다면 이 오류를 찾는데에도 시간이 오래 걸린다. 항상 주의해야 하는 부분!
만약, stateless하게 짜고 싶다면 order 당시에 바로 price를 리턴해서 공유되지 않는 변수를 사용하여 해결할 수 있다.