빈 스코프(Bean Scope)

귀찮Lee·2022년 6월 18일
0

Spring

목록 보기
7/30

◎ 빈 스코프(Bean Scope)

  • bean definition을 만들 때 해당 bean definition에 의해 정의된 클래스의 실제 인스턴스를 만들기 위한 레시피를 만드는데, 그 중에 빈이 존재할 수 있는 범위를 의미.

  • 빈 스코프(Bean Scope) 특징

    • 특정 bean 정의에서 생성된 개체에 연결할 다양한 의존성 및 구성 값뿐만 아니라 특정 bean 정의에서 생성된 개체의 범위도 제어 가능
    • Spring Framework는 6개의 범위를 지원하며, 그 중 4개는 ApplicationContext를 사용하는 경우에만 사용할 수 있다.
    • bean은 여러 범위 중 하나에 배치되도록 정의할 수 있다. (기본값 : singleton)
    • 구성을 통해 생성하는 개체의 범위를 선택할 수 있기 때문에 강력하고 유연함
    • 사용자 정의 범위를 생성할 수도 있다.
  • 빈 스코프 종류

    ScopeDescreption
    singleton(Default) 각 Spring 컨테이너에 대한 단일 객체 인스턴스에 대한 단일 bean definition의 범위를 지정
    prototype스프링 컨테이너는 프로토타입 빈의 생성과 의존관계 주입까지만 관여하고 더는 관리하지 않는 매우 짧은 범위의 스코프
    request웹 요청이 들어오고 나갈때 까지 유지되는 스코프
    session웹 세션이 생성되고 종료될 때 까지 유지되는 스코프
    application웹의 서블릿 컨텍스와 같은 범위로 유지되는 스코프
    websocket단일 bean definition 범위를 WebSocket의 라이프사이클까지 확장, Spring ApplicationContext의 컨텍스트에서만 유효

◎ 싱글톤(singleton) 스코프

  • 싱글톤(singleton) 스코프

    • 클래스의 인스턴스가 딱 1개만 생성되는 것을 보장하는 디자인 패턴
  • 싱글톤 스코프 특징

    • 스프링 컨테이너의 시작과 함께 생성되어서 스프링 컨테이너가 종료될 때 까지 유지
    • 싱글톤 빈의 하나의 공유 인스턴스만 관리
      • private 생성자를 사용해 외부에서 임의로 new를 사용하지 못하도록 막아야 한다.
    • 해당 bean definition와 일치하는 ID 또는 ID를 가진 빈에 대한 모든 요청은 스프링 컨테이너에서 해당 특정 빈 인스턴스를 반환
    • 스프링 컨테이너 종료시 소멸 메서드도 자동으로 실행
  • 간단한 구조 예제

    public class SingletonService {
    
      // static 영역에 객체를 딱 1개만 생성
      private static final SingletonService instance = new SingletonService();
    
      // 인스턴스가 필요할 시, public static 메서드를 통해서만 조회할 수 있음
      public static SingletonService getInstance(){
          return instance;
      }
    
      // new 키워드로 객체 생성을 제한함
      private SingletonService(){}
    }
  • 싱글톤 패턴의 문제점

    • 싱글톤 패턴을 구현하는 코드 자체가 많음
    • 의존관계상 클라이언트가 구체 클래스에 의존
    • 지정해서 가져오기 때문에 테스트하기 어려움
    • private 생성자를 사용하여 자식 클래스를 만들기 어렵기 때문에 유연성이 떨어짐
    • 속성 공유
      • 멀티쓰레드 환경에서 싱글톤 객체의 속성은 여러 쓰레드에 의해 바뀔 수 있습니다.
      • 가급적 읽기만 가능해야 합니다.
    • Application 초기 구동 시 인스턴스 생성
      • 싱글톤 빈은 기본적으로 애플리케이션 구동 시 생성되므로 싱글톤 빈이 많을 수록 구동 시간이 증가할 수 있습니다.
  • 싱글톤 컨테이너 (스프링 컨테이너)

    • 스프링 컨테이너는 싱글톤 컨테이너 역할
    • 싱글톤 객체로 생성하고 관리하는 기능을 싱글톤 레지스트리
    • 스프링 컨테이너의 위 기능 덕분에 싱글턴 패턴의 모든 단점을 해결하며 객체를 싱글톤으로 유지할 수 있다.
  • 싱글톤 방식의 주의점

    • 여러 클라이언트가 하나의 객체 인스턴스를 공유하기 때문에 싱글톤 객체는 무상태로 설계해야 한다.
      • 특정값 변경 X, 읽기만 가능해랴함
      • 스프링 빈의 공유 값을 설정하면, 장애가 발생할 수 밖에 없다.
profile
배운 것은 기록하자! / 오류 지적은 언제나 환영!

0개의 댓글