λ³Έλ¬Έ λ°”λ‘œκ°€κΈ°
Javascript

🐢 μ’‹μ€μ½”λ“œ λ‚˜μœμ½”λ“œ 4μž₯ 였λ₯˜

by frontChoi 2026. 8. 5.
λ°˜μ‘ν˜•

πŸͺ‚ λ³΅κ΅¬ κ°€λŠ₯ν•œ 였λ₯˜

  • μ‚¬μš©μžκ°€ 잘λͺ»λœ μ–‘μ‹μœΌλ‘œ μž…λ ₯ν•˜λŠ” 경우, μ‚¬μš©μžμ—κ²Œ μ•ˆλ‚΄λ₯Ό 톡해 볡ꡬ κ°€λŠ₯
    • μ „ν™”λ²ˆν˜Έ 양식을 μ§€ν‚€μ§€ μ•ŠλŠ” 경우
  • λ„€νŠΈμ›Œν¬ μ—λŸ¬λ‚˜λŠ” 경우 μ‚¬μš©μžμ—κ²Œ μž μ‹œ ν›„ μ΄μš©κ°€λŠ₯ν•˜λ„λ‘ μ•ˆλ‚΄ κ°€λŠ₯

🎿 λ³΅κ΅¬ν•  수 μ—†λŠ” 였λ₯˜

  • μ—”μ§€λ‹ˆμ–΄μ˜ μ‹€μˆ˜λ‘œ μΈν•œ 것
  • μ½”λ“œμ™€ ν•¨κ»˜ μΆ”κ°€λ˜μ–΄μ•Ό ν•˜λŠ” λ¦¬μ†ŒμŠ€
    • ν”„λ‘œμ νŠΈ ν™˜κ²½ λ³€μˆ˜ , κΈ°λ³Έ μ„€μ •κ°’λ“€
      • DB정보 λ“±λ“±
  • μ–΄λ–€ μ½”λ“œκ°€ λ‹€λ₯Έμ½”λ“œλ₯Ό 잘λͺ» ν˜ΈμΆœν•˜λŠ” 경우
    • 인수λ₯Ό 잘λͺ» ν˜ΈμΆœν•œλ‹€λ˜μ§€

πŸ—½ μ‹ μ†ν•˜κ²Œ μ‹€νŒ¨ν•˜κΈ°/μš”λž€ν•˜κ²Œ μ‹€νŒ¨ν•˜κΈ°

κ°œλ… 의미

μ‹ μ†ν•˜κ²Œ μ‹€νŒ¨ κ°€λŠ₯ν•œ λ¬Έμ œκ°€ λ°œμƒν•œ μ‹œμ λΆ€ν„° 였λ₯˜λ₯Ό λ‚˜νƒ€λ‚΄λŠ” 것
μš”λž€ν•˜κ²Œ μ‹€νŒ¨ μ‹€νŒ¨λ₯Ό μˆ¨κΈ°μ§€ μ•Šκ³  μ•Œλ¦¬λŠ”κ²ƒ

μ‹ μ†ν•˜κ²Œ μ‹€νŒ¨ν•˜κΈ° μ˜ˆμ‹œ

  • 잘λͺ»λœ 인자λ₯Ό λ„£κ±°λ‚˜ ν•  경우
// λ¬Έμ œκ°€ 생긴μͺ½μ—μ„œ λΆ€ν„° 였λ₯˜λ₯Ό λ‚˜νƒ€λ‚Έλ‹€
function prepareUrl(url) {
  if (!url) throw new Error("URL이 μ‘΄μž¬ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€");

  console.log("setting url");
}

function playMusic() {
  prepareUrl();
}

playMusic();

μš”λž€ν•˜κ²Œ μ‹€νŒ¨ν•˜κΈ° μ˜ˆμ‹œ

// throwλ₯Ό 톡해 ν•¨μˆ˜λ₯Ό ν˜ΈμΆœν•˜λŠ”κ³³μ—μ„œ μΈμ§€ν•˜λ„λ‘ ν•œλ‹€
function prepareUrl(url) {
  if (!url) throw new Error("URL이 μ‘΄μž¬ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€");

  console.log("setting url");
}

function playMusic() {
  prepareUrl();
}

playMusic();

πŸ›Ό μ˜€λ₯˜ 전달 방법

λͺ…μ‹œμ  방법

μ½”λ“œμ— 였λ₯˜κ°€ μžˆμŒμ„ 인지할 수 밖에 ν•˜λŠ”κ²ƒ

  • κ²€μ‚¬μ˜ˆμ™Έ: JSμ—μ„œλŠ” κ°•μ œλ‘œ κ²€μ‚¬μ˜ˆμ™Έ μ²˜λ¦¬ν•˜λŠ”κ²ƒμ΄ μ‘΄μž¬ν•˜μ§€ μ•ŠλŠ”λ‹€.
  • 널값을 μ΄μš©ν•œ 였λ₯˜ 전달: 널값을 λ°˜ν™˜ν•˜λŠ” 방식이며, 였λ₯˜κ°€ λ°œμƒν•œ 이유 λŒ€ν•œ 정보λ₯Ό μ œκ³΅ν•˜μ§€ μ•ŠλŠ”λ‹€
/**
 * @param {Object} value - 넓이λ₯Ό 계산할 객체
 * @param {number} value.width - μ§μ‚¬κ°ν˜•μ˜ λ„ˆλΉ„
 * @param {number} value.height - μ§μ‚¬κ°ν˜•μ˜ 높이
 * @returns {undefined|number}
 */
function getArea(value) {
  // 였λ₯˜κ°€ λ°œμƒν•˜λ©΄ 값이 μ—†λŠ”κ±΄μ§€ μ„€λͺ…이 μ—†λ‹€.
  // 주석에 λ‹€λŠ” 방식도 μžˆκ² μ§€λ§Œ, μ •ν™•ν•˜μ§€ μ•Šμ„ κ°€λŠ₯성이 λ†’λ‹€
  if (!value) return;

  return value.width * value.height;
}

// 널값에 λŒ€ν•œ 였λ₯˜ 처리
function displayArea() {
  const result = getArea({
    width: 2,
    height: 3,
  });

  if (!result) {
    console.error("displayArea error result is undefined");
  } else {
    console.log("success displayArea : " + result);
  }
}
displayArea();

  • 리절트 λ°˜ν™˜ μœ ν˜•: λ„κ°’λ°˜ν™˜μ€ μ–΄λ–€ 였λ₯˜μΈμ§€ 감지가 λΆˆκ°€λŠ₯ν•˜λ‹€λŠ” 단점이 μžˆλ‹€. κ·Έλ¦¬ν•˜μ—¬ Resultμœ ν˜•μ„ μ‚¬μš©ν•˜λ©΄ 였λ₯˜μ— λŒ€ν•œ 정보도 같이 전달이 κ°€λŠ₯ν•˜λ‹€. λ‹€λ§Œ μ—λŸ¬κ°€ μ‘΄μž¬ν•˜λŠ”μ§€(hasError) ν™•μΈν•˜κ³ , μ—†μœΌλ©΄ getValueλ₯Ό 톡해 ν™•μΈν•΄μ•Όν•œλ‹€. 이것을 인지λͺ»ν•˜λ©΄ , μˆœμ„œμ— 였λ₯˜κ°€ μ‘΄μž¬ν•œλ‹€
class Result {
  #value;
  #error;

  constructor(value, error) {
    this.#value = value;
    this.#error = error;
  }

  static ofValue(value) {
    return new Result(value, null);
  }

  static ofError(error) {
    return new Result(null, error);
  }

  hasError() {
    return this.#error;
  }

  getValue() {
    return this.#value;
  }

  getError() {
    return this.#error;
  }
}

function getName(name) {
  if (!name) {
    return Result.ofError(new Error("name is empty"));
  }

  return Result.ofValue(name);
}

function displayName() {
  const result = getName("홍길동");

  if (result.hasError()) {
    console.error(result.getError());
  } else {
    console.log("my name is " + result.getValue());
  }
}

displayName();

  • 아웃컴 λ°˜ν™˜ μœ ν˜•: ResultλŠ” μž‘μ—…μ— λŒ€ν•œ μˆ˜ν–‰κ²°κ³ΌλΌκ³  ν•œλ‹€λ©΄, 아웃컴은 μˆ˜ν–‰μ— λŒ€ν•œ 성곡여뢀에 λŒ€ν•œκ²ƒμ„ μ•Œλ¦¬λŠ”κ²ƒμ— 가깝닀
class Mission {
  #missionId;

  constructor(missionId) {
    this.#missionId = missionId;
  }

  isOpen() {
    if (this.#missionId === "FOOTBALL") return false;
    else return true;
  }

  participate() {
    // λ―Έμ…˜ μˆ˜ν–‰λ‘œμ§..
  }
}

/**
 * @param {Mission} mission
 * @returns {Boolean} // λΆˆλ¦°μ— 따라 성곡여뢀λ₯Ό λ¦¬ν„΄ν•œλ‹€
 */
function participateMission(mission) {
  if (mission.isOpen()) {
    mission.participate();
    return true; // λ―Έμ…˜ μ°Έμ—¬κ°€λŠ₯ν•˜λ©΄ True
  }

  return false; // λ―Έμ…˜ μ°Έμ—¬ λΆˆκ°€λŠ₯ν•˜λ©΄ False
}

const result = participateMission(new Mission("BASEBALL"));
console.log(result);

μ•”μ‹œμ  방법

πŸ’‘μ½”λ“œλ₯Ό ν˜ΈμΆœν•˜λŠ” μͺ½μ—μ„œ μ•Œλ¦¬μ§€λ§Œ, κ·Έ 였λ₯˜λ₯Ό μ‹ κ²½μ“°μ§€ μ•Šμ•„λ„ λœλ‹€

  • 비검사 μ˜ˆμ™Έ: μ½”λ“œλ₯Ό ν˜ΈμΆœν•˜λŠ” μͺ½μ—μ„œ 인지 λͺ»ν•  κ°€λŠ₯성이 λ†’λ‹€
class NegativeNumberException extends Error { // 비검사 μ˜ˆμ™Έ μœ ν˜•μž„μ„ λ‚˜νƒ€λ‚΄λŠ” 클래슀
  #erroneousNumber;

  constructor(erroneousNumber) {
    super(`μŒμˆ˜λŠ” ν—ˆμš©λ˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€: ${erroneousNumber}`);
    this.name = "NegativeNumberException";
    this.#erroneousNumber = erroneousNumber;
  }

  getErroneousNumber() {
    return this.#erroneousNumber;
  }
}

function getSquareRoot(value) {
  if (value < 0) {
    // 였λ₯˜μ— λŒ€ν•΄ 비검사 μ˜ˆμ™Έ λ°œμƒ
    throw new NegativeNumberException(value);
  }

  return Math.sqrt(value);
}

function displaySquareRoot() {
  value = -1;

  try {
    getSquareRoot(value);
  } catch (error) {
    // 비검사 μ˜ˆμ™Έ 처리
    console.error("[displaySquareRoot error] ", error);
  }
}

displaySquareRoot();

  • ν”„λ‘œλ―ΈμŠ€ λ˜λŠ” Future : Promiseν˜•νƒœλ‘œ 였λ₯˜λ₯Ό λ°˜ν™˜ν•  수 μžˆλ‹€. λ‹€λ§Œ ν˜ΈμΆœν•˜λŠ”μͺ½μ—μ„œλŠ” Promise μ‹€νŒ¨μ— λŒ€ν•œ 세뢀적인 λ‚΄μš©μ„ μ•Œμ•„μ•Ό ν•œλ‹€
/**
 *
 * @param {String} message
 * @returns {Promise<String>}
 */
function sendMessage(message) {
  return new Promise((resolve, reject) => {
    if (!message || !message.trim()) {
      reject(new Error("전달할 λ©”μ„Έμ§€κ°€ μ—†μŠ΅λ‹ˆλ‹€"));
    }

    resolve("λ©”μ„Έμ§€ 전솑에 μ„±κ³΅ν•˜μ˜€μŠ΅λ‹ˆλ‹€");
  });
}

sendMessage()
  .then(() => {
    console.log("success send message");
  })
  .catch((err) => {
    console.error(`[sendMessage error] : ${err}`);
  });
  • 맀직값 λ°˜ν™˜: κ°’μ˜ 의미λ₯Ό μ•ŒκΈ° μœ„ν•΄μ„œλŠ” λ¬Έμ„œλ₯Ό 읽어야 ν•˜λ―€λ‘œ, μ•”μ‹œμ  전달 기법이닀.
function getSquareRoot(value) {
  if (value < 0) {
    return -1; // 맀직값 λ°˜ν™˜ λ‹€λ§Œ, μ–΄λ–€ 였λ₯˜μΈμ§€λŠ” ν™•μΈν•˜κΈ° μ–΄λ ΅λ‹€
  }

  return Math.sqrt(value);
}
λ°˜μ‘ν˜•

λŒ“κΈ€