๋ฅ๋‹ค๋”์›Œ

 

์˜ค๋Š˜์€ ์‹ฑ๊ธ€ํ„ดํŒจํ„ด์— ๋Œ€ํ•ด ์•Œ์•„๋ณผ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

 

 

 

ํ”„๋ก ํŠธ์—”๋“œ์—์„œ ๋””์ž์ธ ํŒจํ„ด์ด๋ž€ ๋ฐ˜๋ณต์ ์œผ๋กœ ๋ฐœ์ƒํ•˜๋Š” ๋ฌธ์ œ๋ฅผ ํšจ๊ณผ์ ์œผ๋กœ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•œ "๊ฒ€์ฆ๋œ ์ฝ”๋“œ ๊ตฌ์กฐ๋‚˜ ์„ค๊ณ„ ๋ฐฉ์‹"์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.

 

์ฆ‰, ์–ด๋–ค ๊ธฐ๋Šฅ์ด๋‚˜ ๊ตฌ์กฐ๋ฅผ ๋งŒ๋“ค ๋•Œ ์ข€ ๋” ๋‚˜์€ ์„ค๊ณ„์™€ ์œ ์ง€๋ณด์ˆ˜๋ฅผ ์œ„ํ•ด ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š”

"์ฝ”๋”ฉ ๋ฐฉ์‹์˜ ์ •์„"์ด๋ผ๊ณ  ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

๋ง๋กœ๋งŒ ๋“ค์–ด์„œ๋Š” ์–ด๋–ค ๊ฑธ ์˜๋ฏธํ•˜๋Š”์ง€ ์™€๋‹ฟ์ง€ ์•Š๊ธฐ๋„ ํ•ฉ๋‹ˆ๋‹ค.

 

์•„๋ž˜ ์„ค๋ช…๊ณผ ์˜ˆ์ œ ์ฝ”๋“œ๋ฅผ ๋ณด๋ฉฐ 1. ์‹ฑ๊ธ€ํ„ด ํŒจํ„ด์— ๋Œ€ํ•ด ์•Œ์•„๋ด…์‹œ๋‹ค.

 

ํ”„๋ก ํŠธ์—”๋“œ ๊ฐœ๋ฐœ ์‹ค๋ฌด์—์„œ๋Š” ์–ด๋–ป๊ฒŒ ์ ์šฉํ•˜๋ฉด ์ข‹์„์ง€๋„ ๊ฐ™์ด ์•Œ์•„๋ณด๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

 

 

์‹ฑ๊ธ€ํ„ด ํŒจํ„ด (Singleton Pattern)

์‹ฑ๊ธ€ํ„ด ํŒจํ„ด์€ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ๋‹จ ํ•˜๋‚˜์˜ ์ธ์Šคํ„ด์Šค๋งŒ ์กด์žฌํ•˜๋„๋ก ๋ณด์žฅํ•˜๋Š” ์ƒ์„ฑ ํŒจํ„ด(Creational Pattern)์ž…๋‹ˆ๋‹ค.

์ฃผ๋กœ *ํ™˜๊ฒฝ ์„ค์ •, ์•ฑ์˜ ์ „์—ญ ์ƒํƒœ, ๊ณต์šฉ ๋ฆฌ์†Œ์Šค ๋“ฑ์„ ํ•œ ๊ณณ์—์„œ ๊ด€๋ฆฌํ•ด์•ผ ํ•  ๋•Œ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.

 

์—ฌ๊ธฐ์„œ ์ž ๊น! ์™œ ํ™˜๊ฒฝ์„ค์ •, ์•ฑ ์ „์—ญ, ๊ณต์šฉ๋ฆฌ์†Œ์Šค์— ์‚ฌ์šฉํ• ๊นŒ?

1. ์ผ๊ด€๋œ ์ƒํƒœ ๊ด€๋ฆฌ
์˜ˆ: ๋กœ๊ทธ์ธ ์ƒํƒœ, ์‚ฌ์šฉ์ž ์„ค์ •, ํ…Œ๋งˆ, ์–ธ์–ด ๋“ฑ์ด๋Ÿฐ ์ •๋ณด๋Š” ์•ฑ ์ „์ฒด์—์„œ ์ผ๊ด€๋˜๊ฒŒ ์œ ์ง€๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
์—ฌ๋Ÿฌ ์ปดํฌ๋„ŒํŠธ์—์„œ ๋™์ผํ•œ ์ •๋ณด๊ฐ€ ํ•„์š”ํ•œ๋ฐ,๊ฐ๊ฐ์˜ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์ด ์ •๋ณด๋ฅผ ๋”ฐ๋กœ ๊ด€๋ฆฌํ•˜๋ฉด ๋ฐ์ดํ„ฐ ๋ถˆ์ผ์น˜, ๋ฒ„๊ทธ ๋ฐœ์ƒ ๊ฐ€๋Šฅ์„ฑ์ด ํฝ๋‹ˆ๋‹ค.
๐Ÿ“Œ Singleton ํŒจํ„ด์œผ๋กœ ํ•˜๋‚˜์˜ ์ „์—ญ ์ธ์Šคํ„ด์Šค์—์„œ ๊ด€๋ฆฌํ•˜๋ฉด ํ•ญ์ƒ ๋™์ผํ•œ ์ƒํƒœ๋ฅผ ์ฐธ์กฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

2. ๋ถˆํ•„์š”ํ•œ ์ค‘๋ณต ์ œ๊ฑฐ
๊ณต์šฉ ๋ฆฌ์†Œ์Šค (์˜ˆ: API ์ธ์Šคํ„ด์Šค, DB ์ปค๋„ฅ์…˜, WebSocket ์—ฐ๊ฒฐ ๋“ฑ)๋Š”ํ•˜๋‚˜๋งŒ ์žˆ์œผ๋ฉด ๋˜๋Š”๋ฐ ์—ฌ๋Ÿฌ ๊ฐœ ๋งŒ๋“ค๋ฉด
๋ฉ”๋ชจ๋ฆฌ ๋‚ญ๋น„์„ฑ๋Šฅ ์ €ํ•˜๋ถˆํ•„์š”ํ•œ ๋„คํŠธ์›Œํฌ ํŠธ๋ž˜ํ”ฝ ์œ ๋ฐœ ๊ฐ€๋Šฅ์„ฑ
๐Ÿ“Œ ์ด๋Ÿฐ ๊ฒฝ์šฐ์—๋„ ํ•˜๋‚˜์˜ ์ธ์Šคํ„ด์Šค๋งŒ ์ƒ์„ฑ๋˜๋„๋ก ์ œํ•œํ•˜๋Š” Singleton ํŒจํ„ด์ด ํšจ๊ณผ์ ์ž…๋‹ˆ๋‹ค.

3. ์ค‘์•™ ์ง‘์ค‘์‹ ๊ด€๋ฆฌ → ์œ ์ง€๋ณด์ˆ˜ ํŽธ๋ฆฌ
ํ™˜๊ฒฝ ์„ค์ •, ๊ณตํ†ต ๋กœ์ง, ์ „์—ญ ์ƒํƒœ ๋“ฑ์„ ์—ฌ๊ธฐ์ €๊ธฐ ํฉ๋ฟŒ๋ ค๋‘๋ฉด…
๋‚˜์ค‘์— ์ˆ˜์ •ํ•˜๋ ค๋ฉด ๋ชจ๋“  ํŒŒ์ผ์„ ์ฐพ์•„๋‹ค๋…€์•ผ ํ•จ์‹ค์ˆ˜๋กœ ๋‹ค๋ฅธ ๊ณณ์—์„œ ์„ค์ •์„ ๋ฎ์–ด์“ธ ์ˆ˜ ์žˆ์Œ
๐Ÿ“Œ ์ „์—ญ์—์„œ ์ ‘๊ทผ ๊ฐ€๋Šฅํ•œ ๋‹จ ํ•˜๋‚˜์˜ ์ธ์Šคํ„ด์Šค๋กœ ํ†ต์ œํ•˜๋ฉด,์ค‘์•™์—์„œ ์‰ฝ๊ฒŒ ๊ด€๋ฆฌํ•˜๊ณ  ์ˆ˜์ • ์‚ฌํ•ญ๋„ ํ•œ ๊ตฐ๋ฐ๋งŒ ๋ณ€๊ฒฝํ•˜๋ฉด ๋์ž…๋‹ˆ๋‹ค.

4. ํด๋ผ์ด์–ธํŠธ๊ฐ€ ๋Š˜์–ด๋‚˜๋„ ๋™์ผํ•œ ์ธ์Šคํ„ด์Šค๋ฅผ ๊ณต์œ 
ํ”„๋ก ํŠธ์—”๋“œ ์•ฑ์—์„œ๋Š” ์‚ฌ์šฉ์ž ์ƒํ˜ธ์ž‘์šฉ์— ๋”ฐ๋ผ ์—ฌ๋Ÿฌ ์ปดํฌ๋„ŒํŠธ, ํŽ˜์ด์ง€๊ฐ€ ๋™์‹œ์— ์ƒ๊ธฐ๊ณ  ์‚ฌ๋ผ์ง‘๋‹ˆ๋‹ค.
์ด๋•Œ๋„ ๋งค๋ฒˆ ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒˆ๋กœ ์ƒ์„ฑํ•˜์ง€ ์•Š๊ณ ํ•˜๋‚˜์˜ ๊ณ ์ •๋œ ์ธ์Šคํ„ด์Šค๋ฅผ ๊ณ„์† ์žฌ์‚ฌ์šฉํ•˜๋ฉด
๐Ÿ‘‰ ์„ฑ๋Šฅ์ƒ ์ด์  + ์ฝ”๋“œ ๊ฐ„ ์—ฐ๊ฒฐ์„ฑ ์œ ์ง€

 

 

๊ทธ๋Ÿผ ๋‹ค์‹œ ๋ณธ๋ก ์œผ๋กœ ๋Œ์•„์™€์„œ!

 

 

์‹ฑ๊ธ€ํ„ด ํŒจํ„ด์˜ ํ•ต์‹ฌ ๊ฐœ๋…์€

1. ์ธ์Šคํ„ด์Šค๋Š” ๋‹จ ํ•˜๋‚˜๋งŒ ์ƒ์„ฑ๋œ๋‹ค.
2. ์™ธ๋ถ€์—์„œ ์ง์ ‘ ์ƒ์„ฑ์ž๋ฅผ ํ˜ธ์ถœํ•  ์ˆ˜ ์—†๋‹ค.
3. ํ•ญ์ƒ ๋™์ผํ•œ ์ธ์Šคํ„ด์Šค๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ์ •์ (static) ๋ฉ”์„œ๋“œ๋ฅผ ์ œ๊ณตํ•œ๋‹ค.

 

 

์ผ๋‹จ ์ฝ”๋“œ๋ถ€ํ„ฐ ๋ณด๋ฉด์„œ ์ดํ•ดํ•ด๋ณผ๊ฒŒ์š”.

 

์•„๋ž˜ ์ฝ”๋“œ๋Š” ์‹ฑ๊ธ€ํ„ดํŒจํ„ด์˜ Javascript ์˜ˆ์ œ ์ฝ”๋“œ์ž…๋‹ˆ๋‹ค.

class Singleton {
  constructor() {
    if (Singleton.instance) {
      return console.warn(
        'Warning: Singleton class already instantiated'
      );
    }
    Singleton.instance = this;
    this.version = Date.now();
    this.config = 'test';
  }

  static getInstance() {
    if (!this.instance) {
      this.instance = new Singleton();
    }
    return this.instance;
  }
}

 

๊ตฌ์กฐ ์„ค๋ช…

  • ์ƒ์„ฑ์ž(private or ์ œํ•œ์  ์ ‘๊ทผ)
    • ์ธ์Šคํ„ด์Šค๋ฅผ ์™ธ๋ถ€์—์„œ ์ƒˆ๋กœ ๋งŒ๋“ค์ง€ ๋ชปํ•˜๋„๋ก ๋ง‰์Šต๋‹ˆ๋‹ค.
  • ์ •์  ํ”„๋กœํผํ‹ฐ(static instance)
    • ์ธ์Šคํ„ด์Šค๋ฅผ ๋ฉ”๋ชจ๋ฆฌ์— ํ•œ ๋ฒˆ๋งŒ ์ƒ์„ฑํ•˜๊ณ  ์žฌ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
  • ์ •์  ๋ฉ”์„œ๋“œ(static getInstance)
    • ์ธ์Šคํ„ด์Šค๋ฅผ ์™ธ๋ถ€์—์„œ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ค๋‹ˆ๋‹ค. ์ƒˆ๋กœ์šด ์ธ์Šคํ„ด์Šค๋ฅผ ๋งŒ๋“ค์ง€ ์•Š๊ณ  ๊ธฐ์กด ์ธ์Šคํ„ด์Šค๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค

 

๊ทธ๋Ÿผ ์œ„ ์ž‘์„ฑ๋œ ์ฝ”๋“œ๋ฅผ ํ˜ธ์ถœํ•ด๋ณผ๊นŒ์š”?

const s1 = new Singleton();
const s2 = new Singleton();

 

์ด๋ ‡๊ฒŒ ํ˜ธ์ถœํ•˜๋ฉด ์–ด๋–ป๊ฒŒ ๋ ๊นŒ์š”?

 

๊ฒฐ๊ณผ๋Š”..

const s1 = new Singleton(); // ์ •์ƒ ์ƒ์„ฑ
const s2 = new Singleton(); // ๊ฒฝ๊ณ  ๋ฐœ์ƒ

 

Singleton { version: 1754567722799, config: 'test' }
Warning: Singleton class already instantiated
Singleton {}

 

์ฒซ๋ฒˆ์งธ ๊ฒฐ๊ณผ์—๋Š” Singleton์˜ instance๊ฐ€ ๋‚˜์™”์ง€๋งŒ, ๋‘๋ฒˆ์งธ ๊ฒฐ๊ณผ๋Š” Warning์„ ๋ฑ‰์œผ๋ฉฐ,

์ธ์Šคํ„ด์Šค๋ฅผ ์ฐพ์ง€ ๋ชปํ•˜๋Š” ๊ฒƒ์„ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

๊ทธ ์ด์œ ๋Š”

โŒ constructor๋ฅผ ์ง์ ‘ ํ˜ธ์ถœํ•˜๋ฉด ์‹ฑ๊ธ€ํ„ด์˜ ๊ทœ์น™์ด ๊นจ์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด ์˜ˆ์ œ์—์„œ๋Š” ๊ฒฝ๊ณ ๋งŒ ๋„์šฐ์ง€๋งŒ, ์‹ค์ œ๋กœ๋Š” constructor๋ฅผ private ๋˜๋Š” protected๋กœ ๋งŒ๋“ค์–ด ์™„์ „ํžˆ ์ฐจ๋‹จํ•˜๋Š” ๊ฒƒ์ด ๋” ์•ˆ์ „ํ•ฉ๋‹ˆ๋‹ค. (TypeScript ๋“ฑ์—์„œ๋Š” private constructor ์‚ฌ์šฉ ๊ฐ€๋Šฅ)

 

๊ทธ๋Ÿผ ์ด์ œ ์ œ๋Œ€๋กœ ํ˜ธ์ถœ์„ ํ•ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

 

const s1 = Singleton.getInstance();
const s2 = Singleton.getInstance();

console.log(s1); // Singleton { version: ..., config: 'test' }
console.log(s2); // Singleton { version: ..., config: 'test' }
console.log(s1 === s2); // true

 

์œ„ ์ฝ”๋“œ์ฒ˜๋Ÿผ s1๊ณผ s2์˜ ๊ฒฐ๊ณผ๊ฐ’์ด ๊ฐ™์œผ๋ฉฐ, ๋™๋“ฑ๋น„๊ต๋ฅผ ํ•ด๋„ true๊ฐ’์ด ๋‚˜์˜ค๋ฉฐ ๋™์ผํ•œ ์ธ์Šคํ„ด์Šค๋ฅผ

๋ฐ˜ํ™˜ํ•˜๋Š” ๊ฒƒ์„ ์•Œ ์ˆ˜ ์žˆ๋„ค์š”!

* ํ•ญ์ƒ getInstance()๋ฅผ ํ†ตํ•ด ๋™์ผํ•œ ์ธ์Šคํ„ด์Šค์— ์ ‘๊ทผํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

 

 

๋ณด์™„ ์‚ฌํ•ญ

1. ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์—์„œ ์ƒ์„ฑ์ž ์ฐจ๋‹จํ•˜๋ ค๋ฉด?

  • ์™„๋ฒฝํžˆ ์ฐจ๋‹จ์€ ๋ถˆ๊ฐ€๋Šฅํ•˜์ง€๋งŒ, ๊ด€๋ก€์ ์œผ๋กœ ์ง์ ‘ ํ˜ธ์ถœ์„ ๊ธˆ์ง€ํ•˜๋Š” ๊ตฌ์กฐ๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • TypeScript์—์„œ๋Š” private constructor๋ฅผ ํ™œ์šฉํ•˜์—ฌ ๋ช…ํ™•ํ•˜๊ฒŒ ์ œ์–ดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์•„๋ž˜๋Š” ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ ์˜ˆ์ œ ์ฝ”๋“œ์ž…๋‹ˆ๋‹ค.
class Singleton {
  private static instance: Singleton;

  private constructor() {
    // ์™ธ๋ถ€์—์„œ new Singleton()์„ ์ ˆ๋Œ€ ๋ชป ์”€
  }

  static getInstance(): Singleton {
    if (!Singleton.instance) {
      Singleton.instance = new Singleton();
    }
    return Singleton.instance;
  }
}

 

 

  • private constructor: ์™ธ๋ถ€์—์„œ new Singleton() ์ง์ ‘ ํ˜ธ์ถœ ๋ถˆ๊ฐ€
  • Java, C# ๋“ฑ ํด๋ž˜์Šค ๊ธฐ๋ฐ˜ ์–ธ์–ด์˜ ์‹ฑ๊ธ€ํ„ด๊ณผ ๊ฑฐ์˜ ์œ ์‚ฌํ•œ ๋ฐฉ์‹์œผ๋กœ ์•ˆ์ „ํ•˜๊ฒŒ ๊ตฌํ˜„ ๊ฐ€๋Šฅ

 

2. ๋ฉ€ํ‹ฐ์Šค๋ ˆ๋“œ ํ™˜๊ฒฝ์ด๋ผ๋ฉด?

  • Java, C++ ๊ฐ™์€ ์–ธ์–ด์—์„œ๋Š” ๋™๊ธฐํ™”(Synchronized)๋ฅผ ๊ณ ๋ คํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
  • JS๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ ์‹ฑ๊ธ€ ์Šค๋ ˆ๋“œ์ด์ง€๋งŒ, WebWorker๋‚˜ Node.js์—์„œ ๋ฉ€ํ‹ฐ ํ”„๋กœ์„ธ์Šค๋ฅผ ์“ธ ๊ฒฝ์šฐ ์ฃผ์˜๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.
  • -> ๋ฉ€ํ‹ฐ์Šค๋ ˆ๋“œ์—์„œ๋Š” ์—ฌ๋Ÿฌ ์“ฐ๋ ˆ๋“œ๊ฐ€ ๋™์‹œ์— getInstance()๋ฅผ ํ˜ธ์ถœํ•  ์ˆ˜ ์žˆ๊ณ  ๋‘ ๊ฐœ ์ด์ƒ์˜ ์ธ์Šคํ„ด์Šค๊ฐ€ ์ƒ์„ฑ๋  ๊ฐ€๋Šฅ์„ฑ์ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.
  • Java, C++ ๋“ฑ ๋ฉ€ํ‹ฐ์Šค๋ ˆ๋“œ ์–ธ์–ด์—์„  ๋™๊ธฐํ™”(Synchronization) ํ•„์š”
public class Singleton {
  private static Singleton instance;

  public static synchronized Singleton getInstance() {
    if (instance == null) {
      instance = new Singleton();
    }
    return instance;
  }
}

 

  • synchronized: ํ•œ ๋ฒˆ์— ํ•˜๋‚˜์˜ ์Šค๋ ˆ๋“œ๋งŒ ์ ‘๊ทผ ํ—ˆ์šฉ
  • Double-checked locking ๋“ฑ์˜ ์ตœ์ ํ™”๋„ ์‚ฌ์šฉํ•จ

 

๊ทธ๋Ÿผ ์‹ฑ๊ธ€ํ„ดํŒจํ„ด์€ ์—ฌ๊ธฐ๊นŒ์ง€ ์•Œ์•„๋ณด๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค!

 

์ฐธ๊ณ ์˜์ƒ: Youtube ์ฝ”๋”ฉ๋ฌธ

 

+ Recent posts