빈 스코프 - 싱글톤 스코프
포스트
취소

빈 스코프 - 싱글톤 스코프

싱글톤 스코프의 특징

  • 스코프를 명시적으로 지정하지 않으면 설정되는 기본 스코프
  • 빈 스코프를 싱글톤으로 사용하면 빈을 각각의 다른 객체로 생성해도 같은 것을 가리키게 된다.
  • 싱글톤 빈은 스프링 컨테이너에서 한 번 생성된다.
  • 스프링 컨테이너가 사라질 때 빈도 사라진다.
  • ApplicationContext 초기 구동시 인스턴스 생성된다.
  • 생성된 인스턴스는 single beans cache에 저장된다.
  • 해당 빈에 대한 요청과 참조가 있으면 캐시된 객체를 반환한다.

싱글톤 스코프의 사용 방법

  • 스코프의 기본 값이 싱글톤이기 때문에 생략해도 상관없다.
    • xml을 통한 사용방법
      • <bean id=”test” scope=”singleton”></bean>
    • 어노테이션을 통한 사용방법
      • @Scope(“singleton”)

싱글톤 패턴

  • 클래스의 인스턴스가 1개만 생성되도록 하는 디자인 패턴
  • private 생성자를 사용해서 외부에서 임의로 new 키워드를 사용하지 못하도록 막아야 한다

싱글톤 패턴의 문제점

  • 싱글톤 패턴을 구현하는 코드 자체가 많이 들어간다.
  • 의존관계상 클라이언트가 구체 클래스에 의존한다. DIP를 위반한다.
  • 클라이언트가 구체 클래스에 의존해서 OCP 원칙을 위반할 가능성이 높다.
  • 테스트하기 어렵다.
  • 내부 속성을 변경하거나 초기화 하기 어렵다.
  • private 생성자로 자식 클래스를 만들기 어렵다.
  • 결론적으로 유연성이 떨어진다.
  • 안티패턴으로 불리기도 한다.

싱글톤 컨테이너

  • 스프링 컨테이너는 기본적으로 객체 인스턴스를 싱글톤으로 관리한다.
  • 스프링 컨테이너는 기본적으로 빈 스코프가 싱글톤이기 때문에 객체를 하나만 생성해서 관리한다.
  • 스프링 컨테이너는 싱글턴 패턴의 모든 단점을 해결하면서 객체를 싱글톤으로 유지할 수 있다.
  • 싱글톤 패턴을 위한 코드를 간결해질 수 있게 해준다.
  • DIP, OCP, 테스트, private 생성자로 부터 자유롭게 싱글톤을 사용할 수 있다.
  • 싱글톤 레지스트리 : 싱글톤 객체를 생성하고 관리하는 기능

싱글톤 방식의 주의점

  • 객체 인스턴스를 하나만 생성해서 공유하는 싱글톤 방식은 여러 클라이언트가 하나의 같은 객체 인스턴스를 공유하기 때문에 싱글톤 객체는 상태를 유지하게 설계하면 안된다.
  • 특정 클라이언트에 의존적인 필드가 존재하면 안된다.
  • 특정 클라이언트가 값을 변경할 수 있는 필드가 존재하면 안된다.
  • 가급적 읽기만 가능해야 한다.
  • 필드 대신에 자바에서 공유되지 않는, 지역변수, 파라미터, ThreadLocal 등을 사용해야 한다.
  • 스프링 빈의 필드에 공유 값을 설정하면 정말 큰 장애가 발생할 수 있다. (예시 : 개인 정보)

싱글톤 방식을 위한 @Configuration 어노테이션

  • @Bean 어노테이션만 사용해도 스프링 빈으로 등록되지만, 싱글톤을 보장하지 않는다.
이 기사는 저작권자의 CC BY 4.0 라이센스를 따릅니다.