[cs 스터디] 1-1. 디자인 패턴 - 싱글톤 패턴

YooJeeun·2024년 12월 26일

cs 스터디

목록 보기
1/65

디자인 패턴

디자인 패턴이 머냐ㅇㅇ 프로그램 설계할 때 발생했던 문제점들을 객체 간 상호 관계 등을 이용하여 해결할 수 있도록 하나의 '규약' 형태로 만들어 놓은 것을 의미한다

싱글톤 패턴(singleton pattern)

하나의 클래스에 오직 하나의 인스턴스만 가지는 패턴

보통 데이터베이스 연결 모듈에 많이 사용
하나의 인스턴스를 만들어 놓고 해당 인스턴스를 다른 모듈들이 공유하며 사용
장점: 인스턴스를 생성할 때 드는 비용이 줄어듦
단점: 의존성이 높아짐

싱글톤 미사용

const connection1 = createConnection(URL); // 새 연결 생성
const connection2 = createConnection(URL); // 또 다른 새 연결 생성

싱글톤 사용

const connection1 = new DB(URL); // 연결 생성
const connection2 = new DB(URL); // 같은 연결 사용

자바스크립트의 싱글톤 패턴

자바스크립트에서는 리터럴({}) 또는 new Object로 객체를 생성하게 되면 다른 어떤 객체와도 같지 않기 때문에 이 자체만으로 싱글톤 패턴을 구현할 수 있다.

다른 인스턴스
const obj = {
    a: 27
}
const obj2 = {
    a: 27
}
console.log(obj === obj2)
// false
같은 인스턴스
class Singleton {
    constructor() {
        if (!Singleton.instance) {
            Singleton.instance = this
        }
        return Singleton.instance
    }
    getInstance() {
        return this.instance
    }
}
const a = new Singleton()
const b = new Singleton() 
console.log(a === b) // true

싱글톤 패턴의 단점

  1. 싱글톤 패턴은 TDD(Test Driven Development)를 할 때 걸림돌이 된다. TDD를 할 때 단위 테스트를 주로 하는데, 단위 테스트는 테스트가 서로 독립적이어야 하며 테스트를 어떤 순서로든 실행할 수 있어야 한다. 하지만 싱글톤 패턴은 미리 생성된 하나의 인스턴스를 기반으로 구현하는 패턴이므로 각 테스트마다 '독립적인' 인스턴스를 만들기가 어렵다.

이게 먼말이냐면...
TDD와 단위 테스트의 원칙
단위 테스트의 핵심
테스트 독립성: 각 테스트는 다른 테스트와 독립적으로 실행되어야 한다.
하나의 테스트가 실패하거나 변경되어도 다른 테스트에 영향을 미쳐서는 안된다.
재현 가능성: 테스트는 항상 동일한 환경에서 실행되어야 하며, 실행 순서나 외부 상태에 의존하지 않아야 한다.

근데 싱글톤 패턴은 애플리케이션 전체에서 하나의 인스턴스만 유지하는 패턴이다~ 이로 인해 여러 곳에서 동일한 객체를 공유하게 되므로 한 테스트에서 싱글톤 객체의 상태가 변경되면 이후의 테스트에서도 이 변경 사항이 유지가 된다.
이로 인해 테스트가 상호 의존적이 되어, 테스트의 독립성이 깨진다... 이말...

  1. 또한, 싱글톤 패턴은 사용하기가 쉽고 실용적이지만 모듈 간 결합을 강하게 만들 수 있다는 단점이 있다. 이때 의존성 주입(DI, Dependency Injection)을 통해 모듈 간의 결합을 조금 더 느슨하게 만들어 해결할 수 있다.

    참고로 의존성이란 종속성이라고도 하며 A가 B에 의존성이 있다는 것은 B의 변경 사항에 대해 A 또한 변해야 한다는 것을 의미

메인 모듈이 직접 다른 하위 모듈에 대한 의존성을 주기보다는 중간에 의존성 주입자가 이 부분을 가로채 메인 모듈이 '간접'적으로 의존성을 주입하는 방식
이를 통해 메인 모듈(상위 모듈)은 하위 모듈에 대한 의존성이 떨어지게 된다. 이를 '디커플링이 된다' 라고한다.

profile
제니벨로그

0개의 댓글