싱글톤 패턴이란

조재일·2023년 4월 4일
0
post-thumbnail

싱글톤 패턴이란?

하나의 Class에 하나의 Instance만 가지는 패턴이다

Class와 Instance에 대하여

Class

객체를 정의하기 위한 자바스크립트 템플릿이다.
여러 개의 객체를 하나씩 정의하지 않기 위해 만든 여러 개의 객체를 찍는 도장 같은 것이다.

Instance

Class를 사용해서 생성된 객체를 의미한다
이렇게 생성된 Instance는 클래스에서 정의한 method와 변수를 가지고 있다.

이렇게 하나의 Class에서 두개의 Instance를 만들었다고 가정하다
여기에 있는 Instance 두개는 같은 Class에 나왔지만 다른 Instance이다.
그 이유를 알아보자

여기서 Instance를 만든다는 것은 Object를 만드는 것과 같기 때문이다.
자바스크립트에서는 변수를 직접 저장하지 않고, 객체를 가르키는 참조값을 저장하게 된다.
조금 더 쉽게 알아보자

여기서 various에 저장되어 있는 값은 객체의 실질적인 값이 아닌 메모리 어딘가에 저장되어 있는 값의 주소이다.
즉, 우리가 instance를 생성한다면, instance는 메모리 어딘가에 저장되고 그 메모리의 주소를 해당 변수에 저장해주는 것이다.

위에서 말한 것을 받아드린다면, 인스턴스를 여러개 생성하는 것은 자원낭비가 될 수 있다고 이해할 수 있다.

예를 들어서, 데이터 베이스에 연결을 하려고 한다면
데이터 베이스 같이 연결과정에서 많은 비용을 차지하는 것을 많이 만들어 둔다면 자원낭비가 굉장히 심할 것이다.
만약 Instance를 여러개 둔다면 다른 곳에서 데이터를 바꾼다면 각각의 Instance는 독립되었기 때문에 데이터 변경을 바로 인지하지 못해서 다른 곳에서 같은 부분의 데이터를 변경했다면 데이터 충돌이 일어날 수 있다.

싱글톤 패턴에 대하여

싱글톤 패턴을 사용한다면 다음과 같은 장점을 가질 수 있다
무거운 연결 과정을 한번만 하면되므로 비용을 더욱 절약할 수 있다.

데이터에 연결된 Instance는 한개이므로 데이터를 받은 Object들은 같은 데이터 값을 참조한다

하나의 Object의 데이터가 변경된다면, 다른 Object들도 알 수 있기 때문에 데이터 충돌이 일어나지 않고 일관성을 가질 수 있다.

싱글톤 패턴을 구현하는 법

class Singleton{
    constructor(){
        if(!Singleton.instance){
            Singleton.instance = this
        }
        return Singleton.instance
    }
    getInstance(){
        return this.instance
    }
}

const a = new Singleton()
const b = new Singleton()

생성자 함수에서 직접 Instance를 생성해준다.
Instance가 Class에 존재하지 않는다면, 만들어주고 있다면 있는 것을 그대로 사용한다.

문제점

싱글톤 패턴은 장점도 있지만 단점도 당연 존재한다

  1. 객체 간의 결합도가 높은 단점이 존재한다
    데이터의 결합도가 높은 것은 변경사항에 대해서 동시에 업데이트가 된다는 장점이 있지만, 연결하는 부분이 하나밖에 없는 Instance에 문제가 생긴다면 의존도가 높은 다른 Object들에게 문제가 될 수 있다.

  2. 멀티스레드 환경에서 안전하지 못하다
    멀티스레드 환경에서 race condition이 발생할때 lock같은 동기화 처리를 해줘야하는 데 동기화 처리 없이 멀티스레드에서 싱글톤 패턴을 진행한다면 객체가 일관성 없이 변경될 수 있다.

  3. 테스트가 어렵다
    테스트에서는 항상 객체를 모의 객체로 대체하지 않는다.
    실제로 데이터 베이스에 접근하는 경우 실제 데이터베이스에 영향을 줄 수 있다
    하지만, 연결되어있는 데이터 베이스 Instance는 한개이기 때문에 테스트 부분뿐만 아니라 다른 부분에서도 데이터를 도잇에 사용하는 경우 데이터 일관성에 문제가 생길 수 있다

우표 아이콘 제작자: Freepik - Flaticon
Object icons created by Freepik - Flaticon
Object icons created by Freepik - Flaticon
Memory icons created by Freepik - Flaticon
Database icons created by Freepik - Flaticon

profile
주니어 프론트엔드 개발자 입니다

0개의 댓글