스프링은 기본적으로 별다른 설정을 하지 않으면 내부에서 생성하는 빈 오브젝트를 모두 싱글톤으로 만든다. 여기서 싱글톤이라는 것은 디자인 패턴에서 나오는 싱글톤 패턴과 비슷한 개념이지만, 그 구현 방법은 확연히 다르니 염두에 두고 공부하자.
애플리케이션 컨텍스트는 IoC 컨테이너이면서 동시에 싱글톤을 저장하고 관리하는 싱글톤 레지스트리이다.
싱글톤(Singleton) 패턴이란, 객체의 인스턴스가 오직 1개만 생성되는 패턴을 의미
즉, 애플리케이션 안에 제한된 수, 대게 한 개의 오브젝트만 만들어서 사용하는 방식
스프링은 대부분 서버환경에서 사용되기 때문에, 서버 부하 등의 문제로 인해 싱글톤으로 동작하게 구현되어있다. 자바의 기본적인 싱글톤 패턴의 구현 방식은 여러가지 단점이 있기 때문에, 스프링은 직접 싱글톤 형태의 오브젝트를 만들고, 관리하는 기능을 제공하는데 그것이 바로 싱글톤 레지스트리이다.
테스트를 해보면, 오브젝트에서 특정 빈을 여러번 호출하여 각각 다른 변수에 대입해 요청하더라도, 매번 동일한 오브젝트를 출력하는 것을 확인할 수 있다!
스프링 컨테이너는 싱글톤을 생성하고, 관리하고, 공급하는 싱글톤 관리 컨테이너라고 볼 수 있다. 평범한 자바 클래스를 싱글톤으로 활용하게 해준다. 스프링이 빈을 싱글톤으로 만드는 것은 결국 오브젝트의 생성 방법을 제어하는 IoC 컨테이너로서의 역할이다.
싱글톤은 멀티스레드 환경이라면 여러 스레드가 동시에 접근해서 사용할 수 있기 때문에 상태 정보 관리에 주의를 기울여야 한다. 그래서 기본적으로 싱글톤 오브젝트는 상태정보를 내부에 갖고 있지 않은 무상태 방식으로 만들어져야 한다.
👉 싱글톤은 기본적으로 인스턴스 필드의 값을 변경하고 유지하는 상태유지방식으로 만들지 않는다!
📝 참고문헌 : 토비의 스프링 3.1