1. 싱글톤 패턴이란? Zustand 는 싱글톤 패턴?
싱글톤 패턴(Singleton Pattern)은 소프트웨어 디자인 패턴 중 하나로, 하나의 클래스에서 단 하나의 인스턴스만 생성되도록 보장하는 패턴입니다. 즉, 애플리케이션 전체에서 특정 클래스의 객체가 오직 하나만 존재하고, 어디서든 이 객체에 접근할 수 있는 전역적인 접근점을 제공합니다.
정의:
싱글톤 패턴은 클래스의 인스턴스를 하나로 제한하고, 해당 인스턴스가 전역적으로 사용될 수 있도록 하는 디자인 패턴입니다.
동작 방식:
• 클래스 내에 하나의 인스턴스만을 생성하며, 외부에서 해당 인스턴스를 직접 생성할 수 없도록 생성자를 private으로 설정합니다.
• 클래스가 처음 호출되면 내부적으로 인스턴스를 생성하고, 이후부터는 동일한 인스턴스를 반환하여 사용합니다.
특징:
- 전역적 접근성: 특정 클래스의 인스턴스를 여러 곳에서 접근할 수 있도록 보장하지만, 그 인스턴스는 하나만 존재합니다.
- 자원 관리 효율성: 한 번 생성된 인스턴스를 재사용하므로, 메모리나 리소스를 효율적으로 사용할 수 있습니다.
- 상태 공유: 애플리케이션 내에서 동일한 인스턴스에 접근하기 때문에, 상태를 쉽게 공유하고 관리할 수 있습니다.
Zustand와의 연관성:
Zustand에서의 상태 관리는 싱글톤 패턴과 유사하게 동작합니다. Zustand는 애플리케이션 내에서 단일 상태 스토어를 생성하고, 이 스토어는 어디서든 접근할 수 있습니다. 즉, 모든 컴포넌트가 동일한 상태 스토어에 접근하여 상태를 공유하는 방식이므로 싱글톤 패턴의 특성을 따릅니다.
예시 코드:
const useStore = create((set) => ({
count: 0,
increment: () => set((state) => ({ count: state.count + 1 })),
}));
// 여기서 useStore는 Zustand의 상태 스토어로, 애플리케이션 전역에서 단일한 상태를 유지합니다._
// 즉, 이 스토어는 싱글톤처럼 하나의 인스턴스만 존재하며, 이를 전역적으로 참조하여 상태를 관리합니다._
결론적으로, 싱글톤 패턴은 자원 관리나 상태 공유가 중요한 경우에 유용하며, Zustand에서 상태를 단일 스토어로 관리하는 방식도 싱글톤 패턴의 개념을 따르는 예시입니다. 이 패턴을 통해 상태 관리가 간단해지고, 애플리케이션의 여러 컴포넌트에서 동일한 상태를 공유할 수 있다는 장점이 있습니다.
2. 코드 예시
싱글톤 패턴에서 클래스 내에 하나의 인스턴스만 생성한다는 말은, 해당 클래스가 인스턴스를 여러 번 생성하지 않고, 최초에 한 번만 생성된 인스턴스를 애플리케이션 전체에서 재사용한다는 의미입니다.
이를 이해하기 위해 간단한 싱글톤 패턴을 코드로 설명해보겠습니다.
싱글톤 패턴 예시 (JavaScript):
class Singleton {
// 클래스 내부에 인스턴스를 저장할 정적(static) 변수 선언
static instance = null;
// 생성자는 private처럼 동작하기 위해 외부에서 직접 호출하지 못하도록 제한
constructor() {
if (Singleton.instance) {
return Singleton.instance; // 이미 인스턴스가 있으면 그 인스턴스를 반환
}
// 최초 호출 시, 인스턴스를 저장하고 이를 반환
Singleton.instance = this;
}
// 클래스 메서드
someMethod() {
console.log("This is a method from the Singleton instance.");
}
}
// 첫 번째 인스턴스 생성
const singleton1 = new Singleton();
singleton1.someMethod(); // 출력: "This is a method from the Singleton instance."
// 두 번째 인스턴스 생성 시도
const singleton2 = new Singleton();
singleton2.someMethod(); // 출력: "This is a method from the Singleton instance."
// 두 객체가 동일한지 확인
console.log(singleton1 === singleton2); // 출력: true
코드 설명:
- Singleton.instance = null: 이 정적 변수는 클래스 레벨에서 하나의 인스턴스를 저장합니다. 즉, 클래스의 모든 인스턴스가 이 변수를 공유합니다.
- constructor: 생성자는 객체가 처음 생성될 때 호출됩니다. 하지만 여기서는 이미 인스턴스가 있는지 확인합니다. 만약 Singleton.instance가 null이 아니라면, 즉 이미 인스턴스가 생성되었다면 기존 인스턴스를 반환하여 새로운 인스턴스를 만들지 않게 됩니다.
- 최초 인스턴스 생성: 첫 번째로 new Singleton()을 호출하면 Singleton.instance가 아직 null이므로 새로운 인스턴스가 생성됩니다. 그리고 이 인스턴스는 Singleton.instance에 저장됩니다.
- 두 번째 인스턴스 생성 시도: 두 번째로 new Singleton()을 호출하면 이미 인스턴스가 존재하기 때문에 새로운 객체를 생성하지 않고, 기존에 생성된 인스턴스를 반환합니다.
- singleton1 === singleton2: 두 변수는 같은 인스턴스를 참조하고 있으므로, 동일한 객체라는 결과가 나옵니다.
요약:
• 하나의 인스턴스만 생성: Singleton 클래스는 애플리케이션 내에서 단 하나의 인스턴스만 존재합니다. 두 번째 호출 이후에는 새로운 인스턴스를 만들지 않고 기존의 인스턴스를 반환합니다.
• 전역적으로 사용 가능: 여러 곳에서 new Singleton()을 호출해도 항상 같은 인스턴스를 참조하게 됩니다.
이것이 싱글톤 패턴의 핵심입니다. Zustand 같은 상태 관리 라이브러리가 이 패턴을 활용하여 단일 상태 스토어를 생성하고, 이를 여러 컴포넌트에서 참조하여 상태를 공유할 수 있게 합니다.
'TIL' 카테고리의 다른 글
[241017 TIL] 디바운싱,쓰로틀링 Closure + HOC로 만들어보기 (0) | 2024.10.17 |
---|---|
[241016 TIL] stateful/less, OOP vs FP.. 등(GPT 질의) (4) | 2024.10.16 |
[241010 TIL] Parallel, Intercepting routes 사용법(모달) (0) | 2024.10.10 |
[241007 TIL] git credential 이상할때 (1) | 2024.10.06 |
[241006 TIL] supabase Redirect URLs (0) | 2024.10.06 |