어플리케이션 컨텍스트 = IoC 컨테이너 = 싱글톤 레지스트리
스프링은 기본적으로 별다른 설정을 하지 않으면 내부에서 생성하는 빈 오브젝트를 모두 싱글톤으로 만듭니다. 이때의 싱글톤은 디자인 패턴의 싱글톤과 개념은 비슷하지만 구현 방법은 다릅니다.
스프링은 엔터프라이즈 시스템을 위한 고안된 기술이기 때문에 서버 환경에서 사용될 때 그 가치가 있습니다. 서버는 초당 수십에서 수백 번의 요청을 받게 되는데, 이때마다 새로 객체를 생성하면 아무리 GC의 성능이 좋아졌다고 해도 이 부하를 감당하기 힘들 것입니다. 따라서 한 개의 객체만을 만들어 사용하는 싱글톤을 기본을 설정하게 된 것입니다.
이는 서블릿에서도 마찬가지입니다. 서블릿은 자바 엔터프라이즈 기술의 가장 기본이 되는 서비스 객체라고 할 수 있습니다. 서블릿은 대부분 멀티스레드 환경에서 싱글톤으로 동작하길 요구합니다. 서블릿 클래스당 하나의 객체만 만들어두고, 사용자의 요청을 담당하는 여러 스레드에서 하나의 오브젝트를 공유해 동시에 사용합니다.
자바의 싱글톤 구현 방식에는 여러가지 한계점이 있기 때문입니다.
- private 생성자를 갖고 있기 때문에 상속할 수 없다.
- 테스트 시 모킹이 힘들다.
- 서버환경에서는 싱글톤이 하나만 만들어지는 것을 보장하지 못한다.
- 싱글톤의 사용은 전역 상태를 만들 수 있기 때문에 바람직하지 못하다.
스프링은 직접 싱글톤 형태의 오브젝트를 만들고 관리하는 기능을 제공하는데, 이를 싱글톤 레지스트리(Singleton Registry)라고 합니다. 싱글톤 레지스트리는 static 메서드와 private 생성자를 사용해야하는 비정상적인 클래스가 아니라 평범한 자바 클래스를 싱글톤으로 활용하게 해준다는 장점을 가집니다.
스프링에서 빈이 생성되고, 존재하고, 적용되는 범위를 빈 스코프(scope)라고 합니다. 기본 스코프는 싱글톤이며, 추가적으로 프로토타입(prototype), 요청(request), 세션(session)이 있습니다.
- prototype: 컨테이너에 빈을 요청할 때마다 매번 새로운 객체를 생성한다.
- request: 웹을 통해 새로운 HTTP 요청이 생길때마다 새로운 객체를 생성한다.
- session: 웹의 세션과 스코프가 유사하다.
- 토비의 스프링 3.1 Vol.1