1) 싱글톤 패턴의 주의할 점
•
싱글톤 패턴은 객체 인스턴스를 하나만 생성해서 공유하는 방식으로 클라이언트가 하나의 같은 객체 인스턴스를 공유하기 때문에 상태를 유지하게 설계해야 된다.
•
무상태(stateless)로 설계해야 된다.
•
스프링 빈의 필드에 공유 값을 설정하면 정말 큰 장애가 발생할 수 있다!!.
2) 객체 생성
Code
3) 빈을 등록 후 사용
Code
4) 문제 발생
•
하나의 객체의 공유 필드 안에 값을 세팅했기 때문에, 특정 클라이언트가 다른 클라이언트 값을 변경하는 문제가 발생한다.
•
사용자 A의 주문금액은 10,000인데 20,000이라는 결과가 나왔다.
•
때문에 공유 필드는 항상 조심해야 한다.! 스프링 빈은 항상 무상태(stateless)로 설계해야 한다.
5) StatefulService와 StatefulServiceTest 수정
Code : StatefulService
Code : StatefulServiceTest
스프링 빈을 무상태로 변경하였다.
결론
현재 위의 예시는 멀티 스레드를 사용하지 않아서, 복잡하지 않지만 실제로 많은 실무에서 싱글톤의 값을 변경함으로써 문제가 많이 발생한다고 한다. 이를 명심하고 무상태로 만들 수 있게 주의하자!