Singleton Pattern

JavaScript ๊ธฐ์ค€์œผ๋กœ ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค.

์šฉ์–ด

  • ์ธ์Šคํ„ด์Šค(Instance): ์–ด๋–ค ์ƒ์„ฑ์ž๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ์ƒ์„ฑ๋œ ์ƒˆ๋กœ์šด ๊ฐ์ฒด (mdn)

    • ์ƒ์„ฑ์ž๊ฐ€ ์ฟ ํ‚ค๋ฅผ ์ฐ์–ด๋‚ผ ์ˆ˜ ์žˆ๋Š” ์ฟ ํ‚ค ํ‹€์ด๋ผ๋ฉด, ์ธ์Šคํ„ด์Šค๋Š” ์ฟ ํ‚ค ํ‹€์—์„œ ์ฐ์–ด๋‚ธ ์ฟ ํ‚ค์ด๋‹ค.

  • ์ธ์Šคํ„ด์Šคํ™”(Instantiation): ์ƒ์„ฑ์ž๋กœ๋ถ€ํ„ฐ ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๊ฒƒ

  • ๊ฐ์ฒด ๋ฆฌํ„ฐ๋Ÿด(Object literal): ์ค‘๊ด„ํ˜ธ({})๋ฅผ ์‚ฌ์šฉํ•ด ๊ฐ์ฒด๋ฅผ ์ดˆ๊ธฐํ™”ํ•˜๋Š” ๋ฐฉ์‹ (mdn)

์˜๋ฏธ์™€ ํŠน์„ฑ

ํด๋ž˜์Šค์˜ ์ธ์Šคํ„ด์Šคํ™”๋ฅผ ๋‹จ์ผ ์ธ์Šคํ„ด์Šค๋กœ ์ œํ•œํ•˜๋Š” ํŒจํ„ด์ด๋‹ค.

์‹ฑ๊ธ€ํ†ค ํŒจํ„ด์€ ์•„๋ž˜์™€ ๊ฐ™์€ ํŠน์„ฑ์„ ๊ฐ–๋Š”๋‹ค.

  • ๋‹จ์ผ ์ธ์Šคํ„ด์Šค๊ฐ€ ๋ณด์žฅ๋œ๋‹ค.

  • ํ•ด๋‹น ์ธ์Šคํ„ด์Šค์— ์‰ฝ๊ฒŒ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋‹ค.

๊ตฌํ˜„ ์˜ˆ์‹œ

์‹ฑ๊ธ€ํ†ค ํŒจํ„ด์œผ๋กœ ์ปค์Šคํ…€ Logger ๊ตฌํ˜„ํ•˜๊ธฐ

let instance;
let logCounter = 0;

class Logger {
  constructor() {
    if (instance) {
      throw new Error("์ค‘๋ณต์œผ๋กœ ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ฑํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.");
    }
    instance = this;
  }

  getInstance() {
    return this;
  }

  success(message) {
    ++logCounter;
    console.log(`SUCCESS(${logCounter}): ${message}`);
  }

  error(message) {
    ++logCounter;
    console.log(`ERROR(${logCounter}): ${message}`);
  }
}

const logger = Object.freeze(new Logger()); // logger ๊ฐ์ฒด์˜ ์ˆ˜์ •์„ ๋ฐฉ์ง€ํ•œ๋‹ค.

๋‹จ์ผ ์ธ์Šคํ„ด์Šค๊ฐ€ ๋ณด์žฅ๋˜๊ธฐ ๋•Œ๋ฌธ์— success, error ๋ฉ”์„œ๋“œ๊ฐ€ ์–ด๋””์—์„œ ํ˜ธ์ถœ๋˜๋”๋ผ๋„ logCounter ๊ฐ’์ด ๊ณต์œ ๋œ๋‹ค.

๊ฐ์ฒด ๋ฆฌํ„ฐ๋Ÿด๋กœ ๊ตฌํ˜„ํ•˜๊ธฐ

let logCounter = 0;

const logger = {
  success(message) {
    ++logCounter;
    console.log(`SUCCESS(${logCounter}): ${message}`);
  },
  error(message) {
    ++logCounter;
    console.log(`ERROR(${logCounter}): ${message}`);
  },
};

Object.freeze(logger);

์žฅ์ 

  • ๋‹จ์ผ ์ธ์Šคํ„ด์Šค๋ฅผ ๊ฐ•์ œํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋งค๋ฒˆ ์ƒˆ๋กœ์šด ์ธ์Šคํ„ด์Šค๋ฅผ ์ดˆ๊ธฐํ™”ํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค ๋ฉ”๋ชจ๋ฆฌ ๊ณต๊ฐ„์ด ์ ˆ์•ฝ๋œ๋‹ค.

๋‹จ์ 

  • ๋‹จ์œ„ ํ…Œ์ŠคํŠธ๊ฐ€ ์–ด๋ ต๋‹ค.

    • ํ…Œ์ŠคํŠธ๋งˆ๋‹ค ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ฑํ•  ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์— ํ•˜๋‚˜์˜ ์ธ์Šคํ„ด์Šค๋กœ ๋ชจ๋“  ํ…Œ์ŠคํŠธ๊ฐ€ ์ด๋ฃจ์–ด์ ธ์•ผ ํ•œ๋‹ค. ์ฆ‰, ๋ชจ๋“  ํ…Œ์ŠคํŠธ๋“ค์€ ์ด์ „ ํ…Œ์ŠคํŠธ์—์„œ ์ƒ์„ฑ ๋˜๋Š” ์ˆ˜์ •ํ•œ ์ธ์Šคํ„ด์Šค๋ฅผ ์ˆ˜์ •ํ•ด์•ผ ํ•˜๊ณ , ์ด๋ ‡๊ฒŒ ํ™˜๊ฒฝ์— ๊ฐ•ํ•˜๊ฒŒ ๊ฒฐํ•ฉ๋œ ํ…Œ์ŠคํŠธ๋Š” ์‹คํ–‰ ์ˆœ์„œ ๋“ฑ์— ๋”ฐ๋ผ ์˜ˆ๊ธฐ์น˜ ๋ชปํ•œ ๋™์ž‘์„ ํ•  ๊ฐ€๋Šฅ์„ฑ์ด ๋†’๋‹ค.

  • ๋‹จ์ผ ์ฑ…์ž„ ์›์น™์— ์œ„๋ฐฐ๋œ๋‹ค.

    • ๋‹จ์ผ ์ธ์Šคํ„ด์Šค๋ฅผ ๋ณด์žฅํ•˜๋ฉฐ, ์ธ์Šคํ„ด์Šค์— ๋Œ€ํ•ด ์ „์—ญ ์ ‘๊ทผ์„ ์ œ๊ณตํ•˜๋Š” ๋‘ ๊ธฐ๋Šฅ์„ ๋™์‹œ์— ํ•˜๊ธฐ ๋•Œ๋ฌธ์—, ๋‹จ์ผ ์ฑ…์ž„ ์›์น™์— ์œ„๋ฐฐ๋œ๋‹ค.

  • ์ „์—ญ์ ์œผ๋กœ ์ ‘๊ทผ ๊ฐ€๋Šฅํ•˜๋‹ค.

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

์ฐธ๊ณ  ์ž๋ฃŒ

Last updated