Programming/Java Script

JS에서 싱글톤 패턴

감귤밭호지차 2024. 3. 25. 22:44
전역적으로 사용할 수 있는 유일한 인스턴스를 생성하는 패턴 

 

 

특정 인스턴스가 오직 하나만 존재하도록 보장하는 소프트웨어 설계패턴입니다. 

전역 변수를 사용하지 않고도 해당 객체를 전역적으로 접근할 수 있게 되며 공유 자원에 대한 동지 접근을 제어할 수 있다. 

 

 

싱글톤 패턴

 

 

 

생성자 이용 싱글톤 패턴 예시

let instance = null;

function Singleton( data = "Intial data " ) {
//기존 인스턴스가 존재할 시 기존 인스턴스 반환
	if(instance) { 
		return instance;
	};

	this.data = data;
	instance = this;
};

//Singleton 인스턴스가 생성될 때 해당 메소드에 접근 
//메소드 추가
Singleton.prototype.getData = function () {
	return this.data;
}

//메소드 추가
Singleton.prototype.setData = function (data) {
	this.data = data;
}

export default Sinigleton;

 

사용예시 :: 

import singleton from "경로";

const singleton = new Singleton("First data");

// getData를 이용해 데이터를 가져옵니다. 
console.log(singleton.getData());     // "First data"


// setData를 이용해 업데이트 합니다. 
singleton.setData("Update data");
console.log(singleton.getData());   // "Update data"


// 새로운 인스턴스를 생성하려고 시도합니다. 
const anotherSingleton = new Singleton("Another data");


//하지만 싱글톤 패턴에 의해 기존 생성된 인스턴스를 반환합니다. 
console.log(anotherSingleton === singleton); // true
console.log(anotherSingleton);     //  "Update data"

 

전역 변수를 사용하지 않고도 해당 객체를 전역적으로 접근할 수 있게 되며 공유 자원에 대한 동시 접근을 제어할 수 있습니다. 단일 인스턴스에서 모든 정보의 흐름을 중앙화 하여 관리할 수 있기 때문에 데이터베이스 연결이나 전역 상태 관리 등에서 유용하게 사용될 수 있습니다.

하나의 인스턴스를 만들어 놓고 이 인스턴스를 다른 모듈들이 공유하며 사용하기 때문에 인스턴스 생성에 대한 비용을 줄어들지만 하나의 인스턴스가 너무 많은 책임을 가지거나 의존성이 높아진다는 단점이 있습니다.

  • 클래스 간 결합도가 높아져 OCP [open close principle : 개방 폐쇄 원칙 ] 를 위반
  • 수정과 테스트가 어려워짐

하나의 클래스를 기반으로 여러 개의 개별적인 인스턴스를 만들 수 있기는 함

OCP : 확장에 대해서는 오픈 변경에 대해서는 폐쇄 - 기존의 코드를 변경하지 않으면서 기능을 추가할 수 있도록 설계되어야 한다는 의미

결합도가 높으면 의존하는 것에 변화가 있을 때 코드가 변경되므로 ocp 위반 한다는 것

 

 

 

 

싱글톤 사용의 장점과 단점 

싱글톤 패턴을 사용하면 메모리 낭비를 방지할 수 있다. 

 

사용자가 1초에 10번의 똑같은 요청을 보낼 때 매번 똑같은 객체를 생성하고 소멸시켜야 하는 메모리 낭비 문제가 발생한다.하지만 싱글톤 패턴 덕분에 최초 한번 new 객체를 생성하고 이 객체를 이후에도 사용하도록 공유 하면서 메모리 낭비 문제를 방지할 수 있게 된다. 

 

 

 

주요 단점

  • TDD 할 때 걸림돌이 된다. 단위 테스트를 주로 하는데 단위 테스트는 테스트가 서로 독립적이어야 하며 테스트를 어떤 순서로든 실행할 수 있어야 한다. 하지만 싱글톤 패턴은 미리 생성된 하나의 인스턴스를 기반으로 구현하는 패턴이기 때문에 ‘독립적인' 인스턴스를 만들기 어렵다.
  • 모듈간의 결합을 강하게 만들 수 있다는 단점(의존성 = 종속성)
    • 의존성 주입 (DI : Dependency Injection)을 통해 모듈 간의 결합을 조금 더 느슨하게 만들어 해결 할 수 있다.
    • 메인 모듈에서 직접 하위 모듈에 대해 의존성을 주기보다 중간에 의존성 주입자가 이 부분을 가로채 메인 모듈이 ‘간접'적으로 의존성을 주입하여 메인에 대한 의존성을 떨어트리는 방식입니다. = 디커플링이 된다라고도 한다.