πŸš€ λͺ¨λ“  κ°œλ°œμžκ°€ λ§ˆμŠ€ν„°ν•΄μ•Ό ν•  10κ°€μ§€ javascript νŒ¨ν„΄

Β·4 min readΒ·7Β·
πŸš€ λͺ¨λ“  κ°œλ°œμžκ°€ λ§ˆμŠ€ν„°ν•΄μ•Ό ν•  10κ°€μ§€ JavaScript νŒ¨ν„΄

πŸš€ λͺ¨λ“  κ°œλ°œμžκ°€ λ§ˆμŠ€ν„°ν•΄μ•Ό ν•  10κ°€μ§€ JavaScript νŒ¨ν„΄

더 μŠ€λ§ˆνŠΈν•˜κ³  κΉ¨λ—ν•˜λ©° ν™•μž₯ κ°€λŠ₯ν•œ μ½”λ“œλ₯Ό μœ„ν•œ κ²€μ¦λœ JavaScript λ””μžμΈ νŒ¨ν„΄


πŸ“– λ“€μ–΄κ°€λ©°

JavaScriptλŠ” λ‹¨μˆœν•œ λΈŒλΌμš°μ € μŠ€ν¬λ¦½νŒ… μ–Έμ–΄μ—μ„œ ν˜„λŒ€ μ›Ή 개발의 ν•΅μ‹¬μœΌλ‘œ λ°œμ „ν–ˆμŠ΅λ‹ˆλ‹€. Node.js, React, Vue와 같은 ν”„λ ˆμž„μ›Œν¬λ‘œ κ΅¬λ™λ˜λŠ” ν’€μŠ€νƒ μ• ν”Œλ¦¬μΌ€μ΄μ…˜κΉŒμ§€, JavaScriptλŠ” μ–΄λ””μ—λ‚˜ μžˆμŠ΅λ‹ˆλ‹€. ν•˜μ§€λ§Œ 아무리 κ³ κΈ‰ 도ꡬλ₯Ό μ‚¬μš©ν•˜λ”λΌλ„ μ½”λ“œ ꡬ쑰가 μ™•μž…λ‹ˆλ‹€.

혼자 ν”„λ‘œμ νŠΈλ₯Ό μ§„ν–‰ν•˜λ“ , ν™•μž₯ κ°€λŠ₯ν•œ μ›Ή μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ—μ„œ νŒ€κ³Ό ν˜‘μ—…ν•˜λ“ , κ²€μ¦λœ νŒ¨ν„΄μœΌλ‘œ μ½”λ“œλ₯Ό κ΅¬μ‘°ν™”ν•˜λŠ” 방법을 μ•„λŠ” 것은 선택이 μ•„λ‹ˆλΌ ν•„μˆ˜μž…λ‹ˆλ‹€. μ΄λŸ¬ν•œ νŒ¨ν„΄λ“€μ€ λ‹¨μˆœν•œ 학문적 κ°œλ…μ΄ μ•„λ‹ˆλΌ 버그λ₯Ό 쀄이고, μž¬μ‚¬μš©μ„±μ„ 높이며, μ½”λ“œλ² μ΄μŠ€λ₯Ό ν™•μž₯ν•˜κΈ° μ‰½κ²Œ λ§Œλ“œλŠ” μ‹€μ œ μ½”λ”© 문제의 ν•΄κ²°μ±…μž…λ‹ˆλ‹€.


πŸ”§ 10κ°€μ§€ ν•„μˆ˜ JavaScript νŒ¨ν„΄

1. λͺ¨λ“ˆ νŒ¨ν„΄ (Module Pattern)

λͺ¨λ“ˆ νŒ¨ν„΄μ€ μ½”λ“œλ₯Ό 독립적이고 μΊ‘μŠν™”λœ λ‹¨μœ„λ‘œ κ΅¬μ„±ν•˜λŠ” 데 도움을 μ€λ‹ˆλ‹€. μ „μ—­ μƒνƒœ 관리가 ν˜Όλž€μŠ€λŸ¬μ›Œμ§€λŠ” λŒ€κ·œλͺ¨ μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ—μ„œ 특히 μœ μš©ν•©λ‹ˆλ‹€.

const Counter = (function() {
  let count = 0;

  return {
    increment: () => ++count,
    getCount: () => count,
  };
})();

ν•„μš”ν•œ κ²ƒλ§Œ λ…ΈμΆœμ‹œν‚΄μœΌλ‘œμ¨(increment, getCount) λ‚΄λΆ€ λ³€μˆ˜ countλŠ” λΉ„κ³΅κ°œλ‘œ μœ μ§€λ©λ‹ˆλ‹€. λ•νŠΈ ν…Œμ΄ν”„ λŒ€μ‹  레고 λΈ”λ‘μœΌλ‘œ μ‘°λ¦½ν•˜λŠ” κ²ƒμ²˜λŸΌ 더 κΉ¨λ—ν•˜κ³  μ•ˆμ „ν•˜λ©° μž¬μ‚¬μš© κ°€λŠ₯ν•©λ‹ˆλ‹€.


2. 곡개 λͺ¨λ“ˆ νŒ¨ν„΄ (Revealing Module Pattern)

λͺ¨λ“ˆ νŒ¨ν„΄μ˜ μ§„ν™”λœ λ²„μ „μœΌλ‘œ, λΉ„κ³΅κ°œ λΆ€λΆ„κ³Ό 곡개 뢀뢄을 더 λͺ…ν™•ν•˜κ²Œ λΆ„λ¦¬ν•©λ‹ˆλ‹€.

const User = (function() {
  let name = 'Guest';

  function setName(newName) {
    name = newName;
  }

  function getName() {
    return name;
  }

  return {
    setName,
    getName,
  };
})();

이 νŒ¨ν„΄μ€ 가독성과 μ˜λ„λ₯Ό ν–₯μƒμ‹œν‚΅λ‹ˆλ‹€. μ–΄λ–€ λ©”μ„œλ“œκ°€ λ…ΈμΆœλ˜λŠ”μ§€ μ¦‰μ‹œ μ•Œ 수 μžˆμŠ΅λ‹ˆλ‹€.


3. νŒ©ν† λ¦¬ νŒ¨ν„΄ (Factory Pattern)

νŒ©ν† λ¦¬ νŒ¨ν„΄μ€ μΈμŠ€ν„΄μŠ€ν™”λ˜λŠ” μ •ν™•ν•œ 클래슀/νƒ€μž…μ„ μ•Œ ν•„μš” 없이 객체λ₯Ό μƒμ„±ν•©λ‹ˆλ‹€.

function CarFactory(type) {
  const carTypes = {
    sedan: () => ({ type: 'Sedan', wheels: 4 }),
    truck: () => ({ type: 'Truck', wheels: 6 }),
  };

  return carTypes[type]?.() || { type: 'Unknown' };
}

이 접근법을 톡해 메인 μ½”λ“œλ² μ΄μŠ€λ₯Ό if/elseλ‚˜ switch 문으둜 μ–΄μ§€λŸ½νžˆμ§€ μ•Šκ³ λ„ 객체 생성 λ‘œμ§μ„ ν™•μž₯ν•  수 μžˆμŠ΅λ‹ˆλ‹€.


4. μ˜΅μ €λ²„ νŒ¨ν„΄ (Observer Pattern)

React μƒνƒœ 관리, 이벀트 μ‹œμŠ€ν…œ, pub/sub μ•„ν‚€ν…μ²˜μ—μ„œ 많이 μ‚¬μš©λ˜λŠ” μ˜΅μ €λ²„ νŒ¨ν„΄μ€ μ½”λ“œμ˜ ν•œ 뢀뢄이 λ‹€λ₯Έ 곳의 변화에 λ°˜μ‘ν•  수 있게 ν•©λ‹ˆλ‹€.

class EventObserver {
  constructor() {
    this.observers = [];
  }

  subscribe(fn) {
    this.observers.push(fn);
  }

  notify(data) {
    this.observers.forEach((fn) => fn(data));
  }
}

이 νŒ¨ν„΄μ€ λΆ„λ¦¬λœ 톡신을 μ§€μ›ν•˜μ—¬ λ³΅μž‘ν•œ UI와 λͺ¨λ“ˆμ‹ λ‘œμ§μ„ κ΄€λ¦¬ν•˜κΈ° μ‰½κ²Œ λ§Œλ“­λ‹ˆλ‹€.


5. 싱글톀 νŒ¨ν„΄ (Singleton Pattern)

λ°μ΄ν„°λ² μ΄μŠ€ μ—°κ²°μ΄λ‚˜ μ „μ—­ μƒνƒœ κ΄€λ¦¬μžμ²˜λŸΌ μ•± μ „μ²΄μ—μ„œ νŠΉμ • 객체의 μΈμŠ€ν„΄μŠ€κ°€ ν•˜λ‚˜λ§Œ ν•„μš”ν•  λ•Œ 싱글톀 νŒ¨ν„΄μ΄ κ΅¬μΆœν•΄μ€λ‹ˆλ‹€.

const AppState = (function() {
  let instance;

  function createInstance() {
    return { user: null, theme: 'light' };
  }

  return {
    getInstance: function() {
      if (!instance) instance = createInstance();
      return instance;
    },
  };
})();


6. μ „λž΅ νŒ¨ν„΄ (Strategy Pattern)

μ „λž΅ νŒ¨ν„΄μ€ μ•Œκ³ λ¦¬μ¦˜ νŒ¨λ°€λ¦¬λ₯Ό μ •μ˜ν•˜κ³  λŸ°νƒ€μž„μ— ν•˜λ‚˜λ₯Ό 선택할 수 있게 ν•©λ‹ˆλ‹€.

const strategies = {
  email: (data) => `Sending email to ${data}`,
  sms: (data) => `Sending SMS to ${data}`,
};

function sendMessage(strategy, data) {
  return strategies[strategy]?.(data) || 'Invalid strategy';
}


7. ν”„λ‘œν† νƒ€μž… νŒ¨ν„΄ (Prototype Pattern)

JavaScript 상속 λͺ¨λΈμ˜ ν•΅μ‹¬μ—λŠ” ν”„λ‘œν† νƒ€μž… νŒ¨ν„΄μ΄ μžˆμŠ΅λ‹ˆλ‹€.

function Animal(name) {
  this.name = name;
}

Animal.prototype.speak = function() {
  return `${this.name} makes a noise.`;
};

μ΄λŠ” μƒμ„±μž ν•¨μˆ˜μ™€ ES6 클래슀의 κΈ°λ³Έ κ°œλ…μž…λ‹ˆλ‹€.


8. λͺ…λ Ή νŒ¨ν„΄ (Command Pattern)

λͺ…λ Ή νŒ¨ν„΄μ€ μš”μ²­μ„ 객체둜 λž˜ν•‘ν•˜μ—¬ μ‹€ν–‰ μ·¨μ†Œ, λ‘œκΉ…, μ§€μ—°λœ μ‹€ν–‰ 같은 κΈ°λŠ₯을 κ°€λŠ₯ν•˜κ²Œ ν•©λ‹ˆλ‹€.

function Command(action, value) {
  return {
    execute: () => action(value),
  };
}

const printCommand = Command(console.log, 'Hello, Command!');
printCommand.execute(); // Hello, Command!


9. λ°μ½”λ ˆμ΄ν„° νŒ¨ν„΄ (Decorator Pattern)

λ°μ½”λ ˆμ΄ν„° νŒ¨ν„΄μ€ 원본 μ½”λ“œλ₯Ό μˆ˜μ •ν•˜μ§€ μ•Šκ³  λ™μ μœΌλ‘œ μƒˆλ‘œμš΄ λ™μž‘μ„ 객체에 μΆ”κ°€ν•©λ‹ˆλ‹€.

function addTimestamp(fn) {
  return function(...args) {
    console.log('Time:', new Date().toISOString());
    return fn(...args);
  };
}

const greet = (name) => `Hello, ${name}`;
const timedGreet = addTimestamp(greet);


10. μ±…μž„ 연쇄 νŒ¨ν„΄ (Chain of Responsibility Pattern)

이 νŒ¨ν„΄μ€ μš”μ²­μ„ ν•Έλ“€λŸ¬ 체인을 따라 전달할 수 있게 ν•©λ‹ˆλ‹€. ν•œ ν•Έλ“€λŸ¬κ°€ μš”μ²­μ„ μ²˜λ¦¬ν•  수 μ—†μœΌλ©΄ λ‹€μŒ ν•Έλ“€λŸ¬λ‘œ μ „λ‹¬ν•©λ‹ˆλ‹€.

function AuthHandler(next) {
  return (req) => {
    if (!req.user) return 'Auth failed';
    return next(req);
  };
}

function DataHandler(req) {
  return `Welcome ${req.user}`;
}

const handleRequest = AuthHandler(DataHandler);
console.log(handleRequest({ user: 'Nick' }));

Express.jsμ—μ„œ μ‚¬μš©λ˜λŠ” 미듀웨어 νŒŒμ΄ν”„λΌμΈ ꡬ좕에 맀우 μœ μš©ν•©λ‹ˆλ‹€.


🎯 마무리

JavaScriptλ₯Ό λ§ˆμŠ€ν„°ν•˜λŠ” 것은 λ‹¨μˆœνžˆ 문법을 λ°°μš°λŠ” 것이 μ•„λ‹™λ‹ˆλ‹€. μœ μ§€λ³΄μˆ˜ κ°€λŠ₯ν•˜κ³  κΉ¨λ—ν•˜λ©° ν‘œν˜„λ ₯ μžˆλŠ” λ°©μ‹μœΌλ‘œ μ½”λ“œλ₯Ό κ΅¬μ‘°ν™”ν•˜κ³  ν™•μž₯ν•˜λŠ” 방법을 λ°°μš°λŠ” κ²ƒμž…λ‹ˆλ‹€.

이 10κ°€μ§€ νŒ¨ν„΄μ€ νŠΈλ Œλ“œλ‚˜ μœ ν–‰μ΄ μ•„λ‹™λ‹ˆλ‹€. μž‘μ€ μ‚¬μ΄λ“œ ν”„λ‘œμ νŠΈλΆ€ν„° 본격적인 SaaS μ œν’ˆκΉŒμ§€ λͺ¨λ“  ν”„λ‘œμ νŠΈμ—μ„œ μž‘λ™ν•˜λŠ” μ˜μ›ν•œ κ°œλ…μž…λ‹ˆλ‹€.

κ°€μž₯ μ΅œκ·Όμ— μ‚¬μš©ν•œ νŒ¨ν„΄μ€ 무엇이고, λ‹€μŒμ— μ‹œλ„ν•΄λ³Ό νŒ¨ν„΄μ€ λ¬΄μ—‡μΈκ°€μš”?


πŸ“š 좜처

// tags