[JavaScript] 싱글톤
JavaScript2021.08.06
이번주에 처음 듣는 단어가 나왔다.. 싱글톤?
그게 대체 무엇일까?
(분명 예전에 배웠는데 제대로 안들었겠지 🤪)

다들...

장난은 그만하고.. 정리를 해보자!
🤔 싱글톤?
싱글톤이란?
애플리케이션이 시작될 때 어떤 클래스가 최초 한번만 메모리를 할당하고(Static)
그 메모리에 인스턴스를 만들어 사용하는 디자인패턴.
- 싱글톤 패턴은 전체 시스템에서 하나의 인스턴스만 존재하도록 보장하는 객체 생성패턴
(동일 클래스로 new 를 해도 인스턴스 하나만 존재한다는 것) - 생성자가 여러 차례 호출되더라도 실제로 생성되는 객체는 하나고 최초 생성 이후에
호출된 생성자는 최초에 생성한 객체를 반환한다. - 싱글톤 패턴은 단 하나의 인스턴스를 생성해 사용하는 디자인 패턴
- 인스턴스가 필요 할 때 똑같은 인스턴스를 만들어 내는 것이 아니라,
동일(기존) 인스턴스를 사용하게 함
- 인스턴스가 필요 할 때 똑같은 인스턴스를 만들어 내는 것이 아니라,
이 패턴을 쓰는 이유?
- 고정된 메모리 영역을 얻으면서 한번의
new로 인스턴스를 사용하기 때문에 메모리 낭비를 방지할 수 있음 - 싱글톤으로 만들어진 클래스의 인스턴스는 전역 인스턴스이기 때문에
다른 클래스의 인스턴스들이 데이터를 공유하기 쉬움. - DBCP(DataBase Connection Pool)처럼 공통된 객체를 여러개 생성해서 사용해야하는 상황에서 많이 사용.
- DBCP 정의 - 데이터베이스와 애플리케이션을 효율적으로 연결하는 커넥션 풀 라이브러리
- 쓰레드풀, 캐시, 대화상자, 사용자 설정, 레지스트리 설정, 로그 기록 객체 등
인스턴스가 절대적으로 한 개만 존재하는 것을 보증하고 싶을 경우 사용
두 번째 이용시부터는 객체 로딩시간이 현저히 줄어듬!!
이 패턴의 문제점
- 싱글톤 인스턴스가 너무 많은 일을 하거나 많은 데이터를 공유시킨다면?
다른 클래스의 인스턴스들 간에 결합도가 높아져서 **"개방-폐쇄 원칙"**을 위배하게 된다.
(객체 지향 설계 원칙에 어긋남) - 멀티쓰레드 환경에서 동기화 처리 안하면 인스턴스가 두 개 생성될수도..?
(자바에서만 그럴려나..? 자바스크립트는 어떻게 될까?)
예시 코드 끄적끄적 🤪
-
closure활용하여 생성const Singleton = (function () { let instance; // 비공개 변수 // 비공개 메서드 (init) function init() { return { // public 메서드 getRanoBabo: function () { return `RANO IS 1000 JAE`; }, // public 속성 name: 'RANO SINGLETON', }; } // public 메서드인 sharedInstance 를 정의한 객체 // 이 메서드를 통해 비공개된 메서드와 변수에 접근 가능 (closure) return { sharedInstance: function () { if (!instance) { instance = init(); } return instance; }, }; })(); module.exports = Singleton; // ====== const a = Singleton.sharedInstance(); const b = Singleton.sharedInstance(); console.log(a === b); // true console.log(a.getRanoBabo()); -
ES7
class Singleton { static #instance; constructor() { if (Singleton.#instance) return Singleton.#instance; this.name = 'RANO SINGLETON ES7'; Singleton.#instance = this; } static sharedInstance = () => { if (Singleton.#instance) return Singleton.#instance; return new Singleton(); }; getRanoBabo = () => `RANO IS 1000 JAE`; } export default Singleton; // ====== const a = Singleton.sharedInstance(); const b = Singleton.sharedInstance(); console.log(a === b); // true console.log(a.getRanoBabo());- 역시 난.. class 문법이 편해..
