스프링은 기본적으로 별다른 설정을 하지 않으면 내부에서 생성하는 빈 오브젝트를 모두 싱글톤으로 만든다.
스프링은 대규모 엔터프라이즈 서버환경에서 많이 이용.
매번 클라이언트에서 요청이 올 때마다 각 로직을 담당하는 오브젝트를 새로 만들어서 사용한다면, 아무리 GC의 성능이 좋아졌어도 부하가 걸리면 서버가 감당하기 힘들다.
: 어떤 클래스를 애플리케이션 내에서 제한된 인스턴스 개수, 주로 하나만 존재하도록 강제하는 패턴. 이렇게 하나만 만들어지는 클래스의 오브젝트는 애플리케이션 내에서 전역적으로 접근이 가능하다. 단일 오브젝트만 존재해야 하고, 이를 어플리케이션의 여러 곳에서 공유하는 경우에 주로 사용한다.
자바의 기본적인 싱글톤 패턴의 구현 방식은 여러 가지 단점이 있기 때문에,
스프링은 직접 싱글톤 형태의 오브젝트를 만들고 관리하는 기능을 제공한다.
=> 싱글톤 레지스트리
스프링 컨테이너는 싱글톤을 생성, 관리, 공급하는 싱글톤 관리 컨테이너이기도 하다.
싱글톤은 멀티스레드 환경이라면 여러 스레드가 동시에 접근해서 사용할 수 있다.
-> 상태 관리에 주의를 기울여야 한다.
싱글톤이 멀티스레드 환경에서 서비스 형태의 오브젝트로 사용되는 경우에
상태정보를 내부에 가지고 있지 않은 무상태(stateless)방식으로 만들어져야 한다.
다중 사용자의 요청을 한꺼번에 처리하는 스레드들이 동시에 싱글톤 오브젝트의 인스턴스 변수를 수정하는 것은 매우 위험.
저장할 공간이 하나뿐이라 서로 값을 덮어쓰고 자신이 저장하지 않은 값을 읽어올 수 있기 때문!
-> 각 요청에 대한 정보나 리소스로부터 생성한 정보는 파라미터, 로컬 변수, 리턴 값 등을 이용한다. 메서드 안에서 생성되는 지역 변수는 매번 새로운 값을 저장할 독립적인 공간이 만들어지기 때문에 싱글톤이라 해도 여러 스레드가 변수의 값 덮어쓸 일 없다.
토비의 스프링