소프트웨어 디자인 패턴에서 싱글턴 패턴을 따르는 클래스는, 생성자가 여러 차례 호출되더라도 실제로 생성되는 객체는 하나이고 최초 생성 이후에 호출된 생성자는 최초의 생성자가 생성한 객체를 리턴한다.
만약 우리가 만들었던 DI 컨테이너인 요청을 할 때마다 새로운 객체를 생성한다. 요청이 엄청나게 많은 트래픽 사이트에서는 계속 객체를 생성하게 되면 메모리 낭비가 심하기 때문이다.
영한님
: 싱글턴 패턴을 구현하는 방법은 여러가지가 있다. 이 방법은 객체를 미리 생성해두는 가장 단순하고 안전한 방법이다. 싱글턴 패턴을 이미 만들어진 객체를 공유해서 효율적으로 사용할 수 있다.
- 싱글턴 패턴을 구현하는 코드 자체가 많다.
- 의존관계상 클라이언트가 구체 클래스에 의존한다.
- 테스트하기 어렵다.
- 내부 속성을 변경하거나 초기화 하기 어렵다.
- private 생성자로 자식 클래스를 만들기 어렵다.
- 싱글톤 컨테이너
- 스프링에서 위에 단점들을 모두 해결해준다.
즉, 싱글턴 패턴을 사용하게 되면 유연성
이 떨어지게 된다는 것이다.
스프링 컨테이너
는 싱글턴 패턴을 적용하지 않아도 객체 인스턴스를 싱글톤으로 관리한다. 이러한 기능 덕분에 싱글톤 패턴의 모든 단점을 해결하고 객체를 싱글톤으로 유지할 수 있다.
싱글톤 패턴이든, 스프링에서 객체 인스턴스를 하나만 생성해서 공유하는 상황에서 객체 인스턴스를 공유하기 때문에 객체 상태를 유지(stateful)하게 설계하면 안된다.
1. price는 공유되는 필드이기 때문에 특정 클라이언트가 값을 변경한다.
2. 실무에서 이런 경우를 종종 보는데, 이로인해 정말 해결하기 어려운 큰 문제들이 터진다.(몇년에 한번씩 꼭 만난다.)