본문 바로가기

Design Pattern

1. 디자인 패턴 정의와 싱글톤 패턴

1. 디자인 패턴 정의 Design Pattern

디자인 패턴이란 프로그램 설계시 발생한 문제를 객체 간 상호 관계 등을 통해 해결할 수 있도록 ‘규약’의 형태로 만들어 둔 것

규약을 만들어서 모듈화를 함.

라이브러리나 프레임워크의 뼈대가 됨.

2. 라이브러리 정의 Library

공통으로 사용될 수 있는 특정한 기능들을 모듈화 한 것.

폴더명/파일명 등에 대한 규칙은 없고 프레임워크에 비해 자유도가 높음.

소프트웨어 개발시 프로그래밍이 사용하는 비휘발성 자원이 모임으로 특정 기능을 모아둔 코드 및 함수의 집합으로

코드 작성 시 활용 가능한 도구들을 의미.

3. 프레임워크 Framework

공통으로 사용될 수 있는 특정한 기능을 모듈화 했다는 것은 라이브러리와 동일하지만,

프레임워크는 프로그래밍 규칙이 정해져있음.

라이브러리보다 규칙이 엄격하고 일반적으로 파일명과 폴더명에 대한 규칙이 존재함.

사전적 정의 - 프로그래밍에서 특정 운영 체제를 위한 응용 프로그램 표준 구조를 구현하는 클래스와 라이브러리 모음.

기능 구현에 집중하여 개발할 수 있도록 일정한 형태와 필요한 기능을 갖추고 있는 골격, 뼈대를 의미.

애플리케이션 개발 시 필수적인 코드, 알고리즘, DB 연동과 같은 기능들을 위해 어느 정도의 구조(뼈대)를 제공하며,

이 구조를 기반으로 유저는 애플리케이션을 개발.

프레임워크와 라이브러리의 차이점

프레임워크와 라이브러리의 차이점은 "제어의 흐름 권한이 어디에 있는가"이다.

라이브러리를 사용할 때 사용자는 애플리세이켠 코드의 흐름을 직접 제어해야 함.
개발 시 필요한 기능이 있을 경우 능동적으로 라이브러리를 호출하여 사용하거나 기존에 구성된 함수나 코드를 가져다 써야 함.
반면 프레임워크는 애플리케이션 코드가 프레임워크에 의해 사용됨.
애플리케이션 코드는 프레임워크가 짜 놓은 틀에서 상대적으로 수동적으로 동작하기에
제어의 흐름은 프레임워크가 가지고 있다고 표현할 수도 있음.

4. 싱글톤 패턴 Singleton Pattern

Singleton Pattern은 하나의 클래스에 오직 하나의 인스턴스만 가지는 패턴.
하나의 클래스를 기반으로 여러 개의 개별적인 인스턴스를 만들 수 있지지만 그렇게 하지 않고
클래스에서 하나의 인스턴스만 만들어, 이 단일 인스턴스 기반으로 로직을 만드는데 활용됨.
하나의 인스턴스를 여러 모듈이 공유.
데이터베이스 연결 모듈에 많이 사용됨

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

}

싱글톤으로 정의된 클래스는 단일 인스턴스로 a라는 객체, b라는 객체 사용.
(Node JS 등은 보통 객체들이 인스턴스 공유 안 함. 한 페이지 내에 두 개 이상의 동일 동작을 하는 UI의 경우 두개 클래스를 만드는 것이 아니라 하나의 클래스를 만든 후 두 개의 인스턴스를 만들어서 사용.)

왜 하나의 인스턴스를 공유하는 것일까?

장점

하나의 인스턴스를 기반으로 해당 인스턴스를 다른 모듈들이 공유하여 사용하기 때문에 인스턴스 생성 비용 감소.
따라서 "인스턴스 생성에 비용이 많이 드는" I/O 바운드 작업에 많이 사용.

I/O 바운드적인 작업 : 네트워크 연결, 데이터베이스 연결, 디스크 연결 등 은 I/O bound의 일종. 사전적으로는 프로세스가 진행되는 속도가 I/O 하위 시스템의 속도에 의해 제한됨을 의미. 파일의 column 수 계산과 같이 디스크에서 데이터 처리하는 작업은 I/O 바인딩이 될 수 있다. 따라서 시간이 조금 필요한 작업들이다. (예시 0.1초)

Connect -> Query
예를 들어
JS로 만든 서버와 몽고디비가 통신할 때 쓰는 Mongoose 라이브러리와 Mysql이 싱글톤 패턴이 적용되어 있음.
Mysql과 같은 경우에는 pool이라는 인스턴스를 모듈들이 공유함.
pool이라는 인스턴스에서 connection을 한 번만 진행하고 pool 인스턴스를 기반으로 모듈 A에서 쿼리를 보내고 모듈 B에서 쿼리를 보냄.

-> 클래스와 객체 인스턴스에 대한 설명은 자바 기준으로 설명

  • 클래스 : 객체를 만들어 내기 위한 설계도 혹은 틀. 서로 연관성이 있는 변수와 메서드의 집합. 붕어빵 틀로 많이 비유됨.
  • 객체 : 소프트웨어 세계에 구현할 대상. 클래스에 선언된 모양 그대로 생성된 실체. 붕어빵으로 비유됨. 객체는 모든 인스턴스를 대표하는 포괄적 의미를 가짐. OOP의 관점에서 클래스의 타입으로 선언되었을 때 '객체'라고 부름
  • 인스턴스 : 설계도를 바탕으로 소프트웨어 세계에 구현된 구체적인 실체. 즉, 객체를 소프트웨어에 실체화한 대상을 '인스턴스'라고 부름. 실체화된 인스턴스는 메모리에 할당됨. 인스턴스는 객체에 포함된다고 볼 수 있음. OOP의 관점에서 객체가 메모리에 할당되어 실제 사용될 때 '인스턴스'라고 부름. 객체는 클래스의 인스턴스이고 객체 간 링크는 클래스 간의 연관 관계의 인스턴스. 실행 프로세스는 플로그램의 인스턴스. 인스턴스는 어떤 원본(추상화되어있는 개념)으로부터 '생성된 복제본'을 의미

자바에서 구현된 Singleton Pattern

이미지 출처 : 인프런 큰돌님의 CS지식의 정석 | CS면접 디자인 패턴 네트워크 운영체제 데이터베이스 자료구조 개발자 면접 강의
[https://www.inflearn.com/course/%EA%B0%9C%EB%B0%9C%EC%9E%90-%EB%A9%B4%EC%A0%91-cs-%ED%8A%B9%EA%B0%95/dashboard]

단점

의존성이 높아짐.
TDD(Test Driven Development)를 할 때 걸림돌이 됨.
TDD를 할 때 단위 테스트를 주로 하는데, 단위 테스트는 테스트가 서로 독립적이어야 하고 테스트를 어떤 순서로든 실행 가능해야 함.
하지만 싱글톤 패턴은 미리 생성된 하나의 인스턴스를 기반으로 구현하는 패턴이므로 각 테스트마다 '독립적인' 인스턴스를 만들기 어려움.

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

모카(JS 계열 테스트 라이브러리)

Reference

https://cocoon1787.tistory.com/745

https://www.inflearn.com/course/%EA%B0%9C%EB%B0%9C%EC%9E%90-%EB%A9%B4%EC%A0%91-cs-%ED%8A%B9%EA%B0%95/dashboard
https://www.castingn.com/sourcing/kkultip_detail/110
https://velog.io/@brian_kim/node.js-%ED%81%B4%EB%9E%98%EC%8A%A4-%EC%9D%B8%EC%8A%A4%ED%84%B4%EC%8A%A4-%EA%B0%9D%EC%B2%B4-%ED%94%84%EB%A1%9C%ED%8D%BC%ED%8B%B0-%EB%A9%94%EC%84%9C%EB%93%9C%EC%9D%98-%EA%B0%9C%EB%85%90
https://gmlwjd9405.github.io/2018/09/17/class-object-instance.html

'Design Pattern' 카테고리의 다른 글

6. 프록시 패턴  (0) 2022.10.24
5. 옵저버 패턴 Observer Pattern  (0) 2022.10.20
4. 전략패턴 Strategy Pattern  (0) 2022.10.20
3. 팩토리패턴 Factory Pattern  (0) 2022.10.20
2. 의존성 주입  (0) 2022.10.19