[디자인패턴] 싱글턴 패턴 - Singleton pattern과 전역상태관리
요약
장점
1. 싱글턴 패턴을 사용 하는 이유는 인스턴스를 단 1개로 가져가는 점 때문에 사용하는 것이다.
2. 메모리 측면에서 유리하다. 고정 메모리 영역을 사용한다. 추후 객체 접근 시, 메모리 낭비 최소화 가능하다. (즉, 무지성 인스턴스화로 사용하지 않는 메모리 할당 요소가 없다.)
3. 다른 클래스 간 데이터 공유가 굉장히 쉽다. (그러나 여러 클래스에서 동시에 접근하면, 동시성 문제가 발생한다. 이점을 유의해서 설계해야 함. -> 리액트도 이래서 State값을 useEffect 같은 것들을 처리할 때, batch로 순서대로 처리한다)
단점
1. 구현 코드 자체가 많이 필요하다.
2. 테스트 하기 어렵다. 같은 인스턴스를 사용하기 때문에, 매번 초기화해야 하는 상황이 발생할 수 있다.
3. 클래스 의존성으로 new키워드로 내부에서 인스턴스화 하는 것은 SOLID 원칙 위반이다. (DIP 위반. OCP 원칙도 위반일 수 있다.)
3.1. 자식 클래스 생성 불가, 내부 상태 변경 어려움. (method를 일일이 사전에 만들어두어야 함.)
class OnlyOne {
private static instance: OnlyOne;
public name: string;
// new 클래스 구문 사용 제한을 목적으로
// constructor() 함수 앞에 private 접근 제어자 추가
private constructor(name: string) {
this.name = name;
}
// 오직 getInstance() 스태틱 메서드를 통해서만
// 단 하나의 객체를 생성할 수 있습니다.
public static getInstance() {
if (!OnlyOne.instance) {
OnlyOne.instance = new OnlyOne("싱글턴 객체");
}
return OnlyOne.instance;
}
}
let case1 = OnlyOne.getInstance();
let case2 = OnlyOne.getInstance();
console.log("isEqual", case1 === case2); // isEqual true
1. TS로 구현한 싱글톤 패턴 (O)
private 접근 제어자를 사용해 constructor() 앞에 붙이면 new 키워드를 통해 인스턴스를 생성하지 못하도록 제한할 수 있다.
대신 공개된 스태틱 메서드 getInstance()를 통해 오직 한 번만 인스턴스를 생성할 수 있다. => 그렇기 때문에 매번 같은 값이 호출되는 것이다.
2. JS로 구현한 싱글톤 패턴
var OnlyOne = (function () {
function OnlyOne(name) {
this.name = name;
}
OnlyOne.getInstance = function () {
if (!OnlyOne.instance) {
OnlyOne.instance = new OnlyOne('싱글턴 객체');
}
return OnlyOne.instance;
};
return OnlyOne;
}());
let instanceA = OnlyOne.getInstance(); // 정상 작동
let instanceB = OnlyOne.getInstance(); // 정상 작동
console.log("isEqual", instanceA === instanceB) // isEqual true
TS로 작성하나, JS로 작성하나...큰차이는 없다. 다만 TS와 같이 class 형태로 작성하는 것을 좀 더 추천한다. 좀 더 classic 하니깡..
위와 같은 함수형 형태를 보완하기 위해서 아래와 같이 객체형태로 작성해서 사용할 수도 있다.
let count = 0;
const counter = {
getCount() { return count; },
increment() { return ++count; },
decrement() { return --count; },
};
Object.freeze(counter);
export { counter };
이렇게 하면 import해서 전역스코프 형태로 사용하는 것이 가능해진다.
뭔가 떠오르지 않나?
.
.
싱글톤 -> 전역상태관리
정답은 전역상태관리다. 전역상태관리가 결국 싱글톤 패턴의 이점을 편리하게 사용하기 위해서 나온 것이라고 보면 된다.
Redux, Recoil, zustand 같은 것들이 전부, 싱글톤 패턴 + @ (추가 Method 역할을 하는 middleware) 의 역할을 하는 것이다.
참고 :
https://yamoo9.gitbook.io/typescript/classes/singleton#singleton-pattern
싱글턴 - TypeScript Guidebook
private 접근 제어자를 사용해 constructor() 앞에 붙이면 new 키워드를 통해 인스턴스를 생성하지 못하도록 제한할 수 있습니다. 대신 공개된 스태틱 메서드 getInstance()를 통해 오직 한 번만 인스턴스
yamoo9.gitbook.io
https://tecoble.techcourse.co.kr/post/2020-11-07-singleton/
싱글톤(Singleton) 패턴이란?
이번 글에서는 디자인 패턴의 종류 중 하나인 싱글톤 패턴에 대해 알아보자. 싱글톤 패턴이 무엇인지, 패턴 구현 시 주의할 점은 무엇인지에 대해 알아보는 것만으로도 많은 도움이 될 것이라
tecoble.techcourse.co.kr