보통 우리가 new
명령어로 객체를 생성하면 계속 다른 객체가 생성되지만 싱글턴 패턴을 적용한 클래스는 생성자가 여러번 호출되더라도 정작 생성되는 객체는 단 하나이고, 최초 생성 이후에 호출된 생성자는 최초의 생성자가 생성한 객체를 리턴한다.
이러한 싱글턴 패턴은 불필요한 객체의 생성을 막아 메모리 누수를 방지한다.
공통된 오브젝트를 사용해야 하는 상황에서 특정한 하나의 오브젝트만 사용하게 해준다.
이러한 싱글턴 패턴의 문제점은 아래와 같다.
스프링에서는 싱글턴의 정의를 느슨하게해서 스프링 IoC 컨테이너 하나당 하나의 객체를 가지는 것을 싱글턴이라고 한다.
스프링에서는 컨테이너 내에서 특정 클래스에 대해 @Bean
이 정의되면 스프링 IoC 컨테이너는 기본적으로 그 클래스에 대해서 딱 한 개의 인스턴스를 만든다.
해당 인스턴스는 설정 정보에 의해서 관리되고 bean이 호출될 때마다 스프링은 생성된 공유 인스턴스를 리턴해준다.
인스턴스의 생성 시점은 스프링 컨테이너에 따라서 달라지는데, 빈 팩토리는 최초 호출시점에서 인스턴스를 생성하고 (lazy loading), 애플리케이션 컨텍스트는 미리 모든 공유 인스턴스들을 초기화해 두었다가 호출될 때 리턴해준다.
예를 들어 @Autowired
어노테이션을 사용해서 여러 객체가 주입받은 것을 확인해보면, 모두 동일한 id를 갖고 있는 것을 확인할 수 있다.
만약 객체를 주입할 때 새로운 객체로 받고 싶다면 @Scope
어노테이션을 사용해서 protoType
으로 지정해주면 된다.
@Scope(value="prototype")