싱글톤 스코프의 특징
- 스코프를 명시적으로 지정하지 않으면 설정되는 기본 스코프
- 빈 스코프를 싱글톤으로 사용하면 빈을 각각의 다른 객체로 생성해도 같은 것을 가리키게 된다.
- 싱글톤 빈은 스프링 컨테이너에서 한 번 생성된다.
- 스프링 컨테이너가 사라질 때 빈도 사라진다.
- ApplicationContext 초기 구동시 인스턴스 생성된다.
- 생성된 인스턴스는 single beans cache에 저장된다.
- 해당 빈에 대한 요청과 참조가 있으면 캐시된 객체를 반환한다.
싱글톤 스코프의 사용 방법
- 스코프의 기본 값이 싱글톤이기 때문에 생략해도 상관없다.
- xml을 통한 사용방법
- <bean id=”test” scope=”singleton”></bean>
- 어노테이션을 통한 사용방법
- @Scope(“singleton”)
- xml을 통한 사용방법
싱글톤 패턴
- 클래스의 인스턴스가 1개만 생성되도록 하는 디자인 패턴
- private 생성자를 사용해서 외부에서 임의로 new 키워드를 사용하지 못하도록 막아야 한다
싱글톤 패턴의 문제점
- 싱글톤 패턴을 구현하는 코드 자체가 많이 들어간다.
- 의존관계상 클라이언트가 구체 클래스에 의존한다. DIP를 위반한다.
- 클라이언트가 구체 클래스에 의존해서 OCP 원칙을 위반할 가능성이 높다.
- 테스트하기 어렵다.
- 내부 속성을 변경하거나 초기화 하기 어렵다.
- private 생성자로 자식 클래스를 만들기 어렵다.
- 결론적으로 유연성이 떨어진다.
- 안티패턴으로 불리기도 한다.
싱글톤 컨테이너
- 스프링 컨테이너는 기본적으로 객체 인스턴스를 싱글톤으로 관리한다.
- 스프링 컨테이너는 기본적으로 빈 스코프가 싱글톤이기 때문에 객체를 하나만 생성해서 관리한다.
- 스프링 컨테이너는 싱글턴 패턴의 모든 단점을 해결하면서 객체를 싱글톤으로 유지할 수 있다.
- 싱글톤 패턴을 위한 코드를 간결해질 수 있게 해준다.
- DIP, OCP, 테스트, private 생성자로 부터 자유롭게 싱글톤을 사용할 수 있다.
- 싱글톤 레지스트리 : 싱글톤 객체를 생성하고 관리하는 기능
싱글톤 방식의 주의점
- 객체 인스턴스를 하나만 생성해서 공유하는 싱글톤 방식은 여러 클라이언트가 하나의 같은 객체 인스턴스를 공유하기 때문에 싱글톤 객체는 상태를 유지하게 설계하면 안된다.
- 특정 클라이언트에 의존적인 필드가 존재하면 안된다.
- 특정 클라이언트가 값을 변경할 수 있는 필드가 존재하면 안된다.
- 가급적 읽기만 가능해야 한다.
- 필드 대신에 자바에서 공유되지 않는, 지역변수, 파라미터, ThreadLocal 등을 사용해야 한다.
- 스프링 빈의 필드에 공유 값을 설정하면 정말 큰 장애가 발생할 수 있다. (예시 : 개인 정보)
싱글톤 방식을 위한 @Configuration 어노테이션
- @Bean 어노테이션만 사용해도 스프링 빈으로 등록되지만, 싱글톤을 보장하지 않는다.