전역적으로 사용할 수 있는 유일한 인스턴스를 생성하는 패턴
특정 인스턴스가 오직 하나만 존재하도록 보장하는 소프트웨어 설계패턴입니다.
전역 변수를 사용하지 않고도 해당 객체를 전역적으로 접근할 수 있게 되며 공유 자원에 대한 동지 접근을 제어할 수 있다.
싱글톤 패턴
생성자 이용 싱글톤 패턴 예시
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)을 통해 모듈 간의 결합을 조금 더 느슨하게 만들어 해결 할 수 있다.
- 메인 모듈에서 직접 하위 모듈에 대해 의존성을 주기보다 중간에 의존성 주입자가 이 부분을 가로채 메인 모듈이 ‘간접'적으로 의존성을 주입하여 메인에 대한 의존성을 떨어트리는 방식입니다. = 디커플링이 된다라고도 한다.
- [참고] 싱글톤 패턴 구현
- [참고] 자바스크립트 싱글톤 패턴 설명, 예시
- [참고] 싱글톤 패턴과 React
- [참고]
- [참고]
- [참고]
- [참고]
'Programming > Java Script' 카테고리의 다른 글
[추가 중 ] JS - addEventListner 종류 분석 정리 (0) | 2024.04.16 |
---|---|
Debounce 라이브러리 쓰지 않고 구현해보기 (0) | 2024.03.20 |
<작성 중 >[js] 슬픔 속에 작성하는 map/filter/forEach... (width 검색창 자동 완성 ) (0) | 2023.11.13 |
[js] 소수 찾기 방법 (width 프로그래머스) (0) | 2023.11.13 |
var , let , const 키워드 다 부셔버리기 ( + 깊은 복사, 얕은 복사 with javascript data type) (0) | 2023.11.01 |