강의 및 책 내용 정리/스프링 핵심원리 기본편

스프링 핵심 원리 기본편 - 싱글톤 패턴

소나무나무 2021. 6. 10. 22:22

Recall

싱글톤패턴이란?

 

private

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

싱글톤 패턴의 단점 6가지

 

 

 

 

 

 

싱글톤 컨테이너란?

 

 

 

 

 

 

Notes

  • 싱글톤 패턴
    • 클래스의 인스턴스가 1개만 생성되는 것을 보장하는 디자인패턴
    • 객체 인스턴스가 2개 이상 생성되지 못하도록 막아야함
      • private 생성자를 사용해서 외부에서 new로 생성 제한
      public class SingletonService {
      	//1. static 영역에 객체를 딱 1개만 생성해둔다.
      	private static final SingletonService instance = new SingletonService();
      	//2. public으로 열어서 객체 인스터스가 필요하면 이 static 메서드를 통해서만 조회하도록 허용한
      	다.
      	public static SingletonService getInstance() {
      		return instance;
      	}
      	//3. 생성자를 private으로 선언해서 외부에서 new 키워드를 사용한 객체 생성을 못하게 막는다.
      	private SingletonService() {
      	}
      }
      • 싱글톤 패턴 호출 시
      @Test
      @DisplayName("싱글톤 패턴을 적용한 객체 사용")
      public void singletonServiceTest() {
      	//private으로 생성자를 막아두었다. 컴파일 오류가 발생한다.
      	//new SingletonService();
      	//1. 조회: 호출할 때 마다 같은 객체를 반환
      	SingletonService singletonService1 = SingletonService.getInstance();
      	//2. 조회: 호출할 때 마다 같은 객체를 반환
      	SingletonService singletonService2 = SingletonService.getInstance();
      	//참조값이 같은 것을 확인
      	System.out.println("singletonService1 = " + singletonService1);
      	System.out.println("singletonService2 = " + singletonService2);
      	// singletonService1 == singletonService2
      	assertThat(singletonService1).isSameAs(singletonService2);
      	singletonService1.logic();
      }
  • 싱글톤 패턴 단점
    • 싱글톤 패턴을 구현하는 코드 자체가 많이 들어간다.
    • 의존관계상 클라이언트가 구체 클래스에 의존한다 ⇒ DIP 위반, OCP 위반
    • 테스트하기 어렵다.
    • 내부 속성을 변경하거나 초기화 하기 힘들다.
    • 자식 클래스를 만들기 어렵다.
    • DI를 적용하기 어렵기 때문에 유연성이 떨어진다.
  • 싱글톤 컨테이너
    • 싱글톤 패턴의 문제점을 해결하면서, 객체 인스턴스를 싱글톤으로 관리한다.
    • 스프링 컨테이너는 싱글톤 컨테이너 역할을 한다. 이렇게 싱글톤 객체를 생성하고 관리하는 기능을 싱글톤 레지스트리라고 한다.
    • 싱글톤 패턴을 위한 지저분한 코드가 들어가지 않아도 된다.
    • DIP, OCP, 테스트, private 생성자로 부터 자유롭게 싱글톤을 사용할 수 있다.