[add] 싱글톤 패턴 [#21] #23
클래스의 인스턴스가 딱 1개만 생성되는 것을 보장하는 디자인 패턴이다.
한 자바 서버 안에서는 객체 인스턴스가 하나만 생성이 된다.
결론은 객체 인스턴스를 2개 이상 생성하지 못하도록 막아야 한다.
private 생성자를 사용해서 외부에서 임의로 new 키워드를 사용하지 못하도록 막아야 한다
SingletonService
public class SingletonService {
private static final SingletonService instance = new SingletonService();
}
public class SingletonService {
private static final SingletonService instance = new SingletonService();
}
자기 자신을 선언한다.
자기 자신을 내부의 private으로 하나 static으로 가지고 있다.
→ static 선언으로 class 레벨에 올라가기 때문에 하나만 존재하게 된다.
*참고하면 좋을 글 1 >> https://wikidocs.net/228
static 키워드를 붙이면 자바는 메모리 할당을 딱 한번만 하게 되어 메모리 사용에 이점이 있다.
만약 클래스의 값이 변경되지 않기를 바란다면 static 키워드 앞에 final이라는 키워드를 붙이면 된다.
*참고하면 좋을 글 2 >> Singleton vs Static class 차이점
⬇️ instance의 참조를 꺼낼 수 있는 코드로 조회할 때 쓰면 된다.
//2. public으로 열어서 객체 인스터스가 필요하면 이 static 메서드를 통해서만 조회하도록 허용한다
public static SingletonService getInstance() {
return instance;
}
//3. 생성자를 private으로 선언해서 외부에서 new 키워드를 사용한 객체 생성을 못하게 막는다
private SingletonService() {
}
⬇️ 실제 SingletonTest (외부) 에서 사용하려고 하면 하지 못한다고 뜬다.
하나의 인스턴스를 생성하려면, static을 이용하여 자기 자신을 인스턴스로 가지게 하고,
private 생성자를 이용하여 외부에서의 생성을 막는다.
출처 : [ study14. 싱글톤 컨테이너 ]
이제 이것을 가지고 test를 진행해본다
이 전에 작성한 SingletonTest 에 이어서 작성했다.
실행해보면 같은 객체의 인스턴스가 반환된 것을 볼 수 있다.
검증하기
assertThat(singletonService1).isSameAs(singletonService2);
* isSameAs와 isEqualTo 차이
same 이란 == 을 말한다. (객체 인스턴스가 같은지)
equal은 자바의 equals 비교를 말하는 것이다.
참고: 싱글톤 패턴을 구현하는 방법은 여러가지가 있다.
여기서는 객체를 미리 생성해두는 가장 단순하고 안전한 방법을 선택했다.
private static final SingletonService instance = new SingletonService();
싱글톤 패턴을 적용하면 고객의 요청이 올 때 마다 객체를 생성하는 것이 아니라,
이미 만들어진 객체를 공유해서 효율적으로 사용할 수 있다.
하지만 싱글톤 패턴은 다음과 같은 수 많은 문제점들을 가지고 있다.
싱글톤 패턴 문제점
싱글톤 패턴을 구현하는 코드 자체가 많이 들어간다. ➡️ SingletonService에 작성한 코드
의존관계상 클라이언트가 구체 클래스에 의존한다. → DIP를 위반한다.
➡️ 구체클래스.getInstance() 한 것을 불러와야 하기 때문에
* 객체를 생성하고 구성(Configuration)하는 영역으로 분리해서 AppConfig만 변경될 뿐
사용하는 부분에서는 AppConfig().memberRepository 를 하면 되는데 DIP 위반이라고 하는 이유?
→ AppConfig를 사용하면 괜찮은데, AppConfig 없이 사용하면 DIP를 위반하게 된다는 뜻
https://lu-delight.tistory.com/460
클라이언트가 구체 클래스에 의존해서 OCP 원칙을 위반할 가능성이 높다.
테스트하기 어렵다.
내부 속성을 변경하거나 초기화 하기 어렵다.
private 생성자로 자식 클래스를 만들기 어렵다.
결론적으로 유연성이 떨어진다. ( di를 적용하기 힘들다. )
안티패턴으로 불리기도 한다
'TIL' 카테고리의 다른 글
190일차(모험 99일차) - 싱글톤 방식의 주의점⭐ (0) | 2022.03.23 |
---|---|
189일차(모험 98일차) - 싱글톤 컨테이너 (0) | 2022.03.22 |
185일차(모험 94일차) - 다양한 설정 형식 지원 - 자바 코드, XML (0) | 2022.03.18 |
184일차(모험 93일차) - 정리 + BeanFactory와 ApplicationContext (0) | 2022.03.17 |
183일차(모험 92일차) - 스프링 빈 조회 - 상속 관계 (0) | 2022.03.16 |