싱글톤 패턴이란
특정 클래스의 인스턴스가 단 1개만 생성되는 것을 보장하는 디자인 패턴이다.
생성자가 여러 번 호출되더라도 인스턴스를 새로 생성하지 않고 최초로 생성되었던 인스턴스를 반환한다.
언제 사용하는가
- 프로그램 내에서 해당 클래스의 객체가 하나만 존재해야 할 때
- 프로그램 내에서 해당 객체를 공유하여 사용해야 할 때
예시로는 DB Connection Pool 같은 객체가 있을 때 한 번만 연결한 후 한 번만 끊는 것이 있다.
어떻게 사용하는가
let Singleton = (function () {
let instance = null;
function SingletonClass(data = 'Init Data') {
if (instance) {
return instance;
}
this.data = data;
instance = this;
}
SingletonClass.prototype.getData = function () {
return this.data;
}
SingletonClass.prototype.setData = function (data) {
this.data = data;
}
return SingletonClass;
})();
export default Singleton;
Singleton을 통해서만 인스턴스를 생성하거나 접근할 수 있다. 실질적으로 실행되는 함수는 SingletonClass이지만, SingletonClass 함수가 내부에 캡슐화되어 있기 때문에 외부에서 직접 접근할 수 없다.
기본적인 함수 표현식이 (function(){...})() 이렇게 생겨서 헷갈리긴 하지만
function(){...} 부분이 리턴하고 있는 것은 위 코드에서 SingletonClass이다.
그래서 (function(){...}) 이 부분이 SingletonClass가 되므로 실제 동작은 SingletonClass()이다.
Singleton 객체를 처음 생성하면 파라미터로 주어진 data를 설정하고, 인스턴스를 이 객체로 설정한다. 인스턴스가 이미 있는 경우에는 원래의 인스턴스를 반환한다.
const { Singleton } = require('./singleton');
const singleton1 = new Singleton('first data');
const singleton2 = new Singleton('second data');
console.log(singleton2.getData()); // output: 'first data'
console.log(singleton1 === singleton2); // output: true
singleton1이라는 변수에 새로운 Singleton이라는 객체를 담을 때는 Singleton 객체를 처음 생성하는 것이기 때문에 instance를 새로 만들고, data를 'first data'로 설정한다.
singleton2라는 변수에 새로운 Singleton 객체를 담으려고 해도 아까 만들어둔 instance가 있기 때문에 그 instance를 반환한다.
그래서 singleton1에 담긴 객체와 singleton2의 객체가 일치한다. 콘솔에 찍어보면 data는 singleton1 변수 만들 때 설정했던 데이터가 출력되고, singleton1과 singleton2를 삼항연산자로 비교해 보면 동일한 객체이기 때문에 true가 출력되는 것을 확인할 수 있다.
장단점
장점
유일한 인스턴스
싱글톤 패턴이 적용된 클래스의 인스턴스는 프로그램 전역에서 단 하나만 있기 때문에 객체의 일관된 상태를 유지하고, 전역에서 접근할 수 있도록 해준다.
메모리 절약
생성자를 여러 번 호출해도 새로운 인스턴스가 생기지 않기 때문에 메모리 점유/해제에 대한 오버헤드를 줄일 수 있다.
단점
결합도 증가
전역에서 접근할 수 있기 때문에 해당 인스턴스에 의존하는 경우 결합도가 증가할 수 있다.
테스트 복잡성
인스턴스를 공유하고 있기 때문에 단위 테스트를 할 때 문제가 될 수 있다.
멀티스레드 환경에서의 문제
멀티스레드 환경에서 동기화 처리를 하지 않으면 인스턴스가 두 개 생성되는 경우가 발생할 수도 있다.
'데브코스' 카테고리의 다른 글
[13주차 - DAY5] 오픈 소스(4) (0) | 2024.05.24 |
---|---|
[13주차 - DAY4] 오픈 소스(3) (0) | 2024.05.23 |
[13주차 - DAY3] 오픈 소스(2) (0) | 2024.05.22 |
[13주차 - DAY2] 오픈 소스 (0) | 2024.05.21 |
[13주차 - DAY1] 게시판 만들기(4) & 배포 (0) | 2024.05.20 |