티스토리 뷰

< 용어 정리 > 

  • 클래스 :  설계도의 개념이다. 동작을 어떻게 처리 할 것인지가 서술 되어 있다.  (예: 붕어빵 틀)
  • 인스턴스 : 클래스를 실제로 사용하기 위해서는 "new 클래스명()" 을 통해 인스턴스화 시키면 된다. 인스턴스화 된 객체는 실제 코드에서 쓰이게 된다. (예: 만들어진 붕어빵) 
  • TDD (Test Driven Development) : 테스트 주도 개발. 단위테스트 (주로 클래스 단위) 를 실행하고 통과되는 코드를 추가하는 단계를 반복하여 구현하는 것을 말한다.

싱글톤 패턴이란 하나의 클래스에 오직 하나의 인스턴스만 가지는 패턴이다.  붕어빵틀을 가지고 하나의 붕어빵만 만들어서 여러사람이 공유하며 먹는다는 개념으로 생각해보자.

 

당연히 그렇게 하면 비용이 적게 들어간다. 이 말은 메모리를 덜 차지한다는 뜻이다. 또한 다음 붕어빵이 구워질때까지 기다리지 않아도 된다. 속도가 빠른것이다. 하지만 한 사람이 이미 꼬리를 먹으면 다른 사람은 꼬리를 먹을 수가 없다. 이건 바로 의존성이 높아진다는 뜻이 된다. 

 

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

class Singleton {
	constructor() {
    if (!Singleton.instance) {
      Singleton.instance = this;
    }
    return Singleton.instance;
  }   
}
const a = new Singleton();
const b = new Singleton();

console.log(a === b); // true

 

위와 같은 방법을 사용하면 몇번을 new 를 하여도 인스턴스는 단하나만 가진다.

 

< 데이터베이스 연결 모듈 >

const URL = "mongodb://localhost:11111//hahaha";
const createConnection = url => ({"url": url});
class DB {
  constructor(url) {
    if (!DB.instance) {
      DB.instance = createConnection(url);
    }
    return DB.instance;
  }
  connect() {
    return this.instance;
  }
}
const a = new DB(URL);
const b = new DB(URL);

console.log(a === b); // true

 

위와 같은 방법으로 싱글톤 패턴을 사용하여 DB 연결 인스턴스를 생성할 수  있다.

 

더보기

-왜 싱글톤 패턴은 DB연결모듈에 많이 쓰일까?

위에서 거론한 비용이 적게 든다는 장점이나 속도가 빠르다는 장점을 제외 하고라도, 왜 굳이 DB 연결에 많이 쓰이는 걸까?

 

1. 메모리와 속도면에서 매번 새로운 연결을 하는 것보다 하나의 연결을 공유하는 것이 크게 장점으로 작용한다.

2. 하나의 연결을 이용함으로써 데이터의 일관성을 유지하기 용이해진다. 

3. 여러곳에서 동시에 DB연결을 생성하는 것을 방지할 수 있다.

4. 멀티 스레드 환경에서 동시에 여러 스레드가 DB연결에 접근하는 것을 방지한다.

스레드(thread)란? 프로그램 실행단위이다. 하나의 프로그램안에는 여러개의 스레드가 존재할 수 있다.

 

< 싱글톤 패턴의 단점 >

  1. TDD를 할때 걸림돌이 된다. 하나의 인스턴스를 기반으로 구현하는 패턴이므로 독립적인 인스턴스로 테스트를 진행하기가 어렵다.
  2. 모듈간에 서로 의존을 많이 하게 되어 결합을 강하게 만든다. 해결책으로는 의존성주입을 통해 결합을 조금 더 느슨하게 만들 수 있다.

 

< 의존성 주입 >

 

싱글톤 패턴의 단점을 보완할 수 있는 의존성 주입에 대해 알아보자.

 

더보기

- 의존성이란? 

두 모듈 혹은 그 이상의 모듈이 서로 연결되어 있는 것을 말한다. 클래스(모듈) A 가 클래스 B를 이용하여 작성되어 있으면, 이때 클래스 A는 B에 의존한다고 한다. 이런 경우에 A는 B 없이 작동할 수 없고, B가 변하면 그것이 A에 영향을 끼친다. 

 

 

의존성주입이란 객체를 생성하여 외부에서 넣어주는 것을 말한다. 외부에서 넣어준다는 것은 런타임시 의존관계를 결정한다는 의미이다.

의존성 주입

앞의 그림처럼 의존성 주입 객체를 통해 메인모듈이 각 모듈에 간접적으로 의존성을 주입하게 된다. 이를 '디커플링이 된다'라고도 표현한다.

의존성 주입에는 여러 장점이 존재하는데, 모듈들을 쉽게 교체할 수 있는 구조가 되어 테스팅하기 쉽고 마이그레이션하기도 수월해진다. 또한,  애플리케이션 의존성 방향이 일관되고, 애플리케이션을 쉽게 추론할 수 있으며, 모듈 간의 관계들이 조금 더 명확해 진다.

 

의존성 주입의 단점에는 모듈들이 더욱더 분리되므로 복잡성이 증가될수 있고, 런타임이 약간 길어질 수 있다.

 

의존성 주입은 "상의 모듈은 하위 모듈에서 어떠한 것도 가져오지 않아야 한다. 또한 둘 다 구체 클래스가 아니라 추상화된 클래스에 의존해야 하며, 이때 추상화는 세부 사항에 의존하지 말아야 한다." 라는 원칙을 지켜주면서 만들어야 한다.

 

 

 

공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/07   »
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31
글 보관함