๊ธฐ๋Šฅ ์ด๋™๋ฆฌํŒฉํ„ฐ๋ง

[ Programming > Refactoring ]

[๋ฆฌํŒฉํ„ฐ๋ง] ๊ธฐ๋Šฅ ์ด๋™

ย Carrot Yoon
ย 2025-08-26
ย 11

[๋ฆฌํŒฉํ„ฐ๋ง] ๊ธฐ๋Šฅ ์ด๋™

์ง€๊ธˆ ๊นŒ์ง€๋Š” ํ”„๋กœ๊ทธ๋žจ ์š”์†Œ๋ฅผ ์ƒ์„ฑ ํ˜น์€ ์ œ๊ฑฐํ•˜๊ฑฐ๋‚˜ ์ด๋ฆ„์„ ๋ณ€๊ฒฝํ•˜๋Š” ๋ฆฌํŒฉํ„ฐ๋ง์„ ํ–ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๋ฆฌํŒฉํ„ฐ๋ง ์ €์ž๋Š” ์—ฌ๊ธฐ์— ๋”ํ•ด ์š”์†Œ๋ฅผ ๋‹ค๋ฅธ ์ปจํ…์ŠคํŠธ (ํด๋ž˜์Šค ๋˜๋Š” ๋ชจ๋“ˆ)๋กœ ์˜ฎ๊ธฐ๋Š” ์ผ๋„ ์ค‘์š”ํ•œ ์ถ•์ด๋ผ ํ•œ๋‹ค. ๊ทธ๋ž˜์„œ "๊ธฐ๋Šฅ ์ด๋™" ๊ธ€์—์„œ๋Š” ํ•จ์ˆ˜ ์˜ฎ๊ธฐ๊ธฐ, ํ•„๋“œ ์˜ฎ๊ธฐ๊ธฐ์™€ ๊ฐ™์€ ๋ฆฌํŒฉํ„ฐ๋ง ๋ฐฉ๋ฒ•์„ ์†Œ๊ฐœํ•˜๋ ค๊ณ  ํ•œ๋‹ค.

1. ๊ธฐ๋Šฅ ์ด๋™ ๋ฆฌํŒฉํ„ฐ๋ง ๋ฐฉ๋ฒ•

1.1 ํ•จ์ˆ˜ ์˜ฎ๊ธฐ๊ธฐ

์†Œํ”„ํŠธ์›จ์–ด ํ•ต์‹ฌ์˜ ์„ค๊ณ„๋Š” ๋ชจ๋“ˆ์„ฑ์ด๋‹ค. ๋ชจ๋“ˆ์„ฑ์€ ํ”„๋กœ๊ทธ๋žจ์„ ์ˆ˜์ •ํ•  ๋•Œ ํ•ด๋‹น ๊ธฐ๋Šฅ์˜ ์ž‘์€ ์ผ๋ถ€๋งŒ ์ดํ•ดํ•ด๋„ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•ด์ฃผ๋Š” ๋Šฅ๋ ฅ์ด๋‹ค.

๋ฆฌํŒฉํ„ฐ๋ง ์ €์ž์— ๋”ฐ๋ฅด๋ฉด ๋ชจ๋“ˆ์„ฑ์„ ๋†’์ด๋Š” ๋ฐฉ๋ฒ•์€ "์„œ๋กœ ์—ฐ๊ด€๋œ ์š”์†Œ๋“ค์„ ํ•จ๊ป˜ ๋ฌถ๊ณ , ์š”์†Œ ์‚ฌ์ด์˜ ์—ฐ๊ฒฐ ๊ด€๊ณ„๋ฅผ ์‰ก๊ธฐ ์ฐพ๊ณ  ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋„๋ก ๋งŒ๋“ค๊ธฐ"์ด๋‹ค. ๊ทธ๋ฆฌ๊ณ  ํ”„๋กœ๊ทธ๋žจ์„ ์–ผ๋งˆ๋‚˜ ์ดํ•ดํ–ˆ๋А๋ƒ์— ๋”ฐ๋ผ์„œ ๋ชจ๋“ˆ์„ฑ์„ ๋” ์ž˜ ๋†’์ผ ๊ฐ€๋Šฅ์„ฑ์ด ์ฆ๊ฐ€ํ•˜๋ฉฐ ์š”์†Œ๋“ค์„ ์ด๋ฆฌ ์ €๋ฆฌ ์˜ฎ๊ฒจ์•ผํ•  ์ˆ˜ ๋„ ์žˆ๋‹ค.

ํ•จ์ˆ˜ ์˜ฎ๊ธฐ๋Š” Case

  • ์–ด๋–ค ํ•จ์ˆ˜๊ฐ€ ์†ํ•œ ๋ชจ๋“ˆ A์˜ ์š”์†Œ๋“ค๋ณด๋‹ค ๋ชจ๋“ˆ B์˜ ์š”์†Œ๋“ค์„ ๋” ๋งŽ์ด ์ฐธ์กฐํ•œ๋‹ค๋ฉด, ์ด ํ•จ์ˆ˜๋ฅผ ๋ชจ๋“ˆ B๋กœ ์˜ฎ๊ธฐ๋ฉด ์ด ์†Œํ”„ํŠธ์›จ์–ด๋Š” ๋ชจ๋“ˆ B์˜ ์„ธ๋ถ€์‚ฌํ•ญ์— ๋œ ์˜์กดํ•˜๊ฒŒ ๋œ๋‹ค. (์บก์Аํ™”๊ฐ€ ๊ฐœ์„ ๋œ๋‹ค.)

  • ๋„์šฐ๋ฏธ ์—ญํ• ๋กœ ์ •์˜๋œ ํ•จ์ˆ˜ ์ค‘ ๋…๋ฆฝ์ ์œผ๋กœ ๊ณ ์œ ํ•œ ๊ฐ€์น˜๊ฐ€ ์žˆ๋Š” ๊ฒƒ์€ ์ ‘๊ทผํ•˜๊ธฐ ๋” ์‰ฌ์šด ์žฅ์†Œ๋กœ ์˜ฎ๊ธด๋‹ค. (๋˜๋Š” ๋‹ค์Œ ์—…๋ฐ์ดํŠธ ๋•Œ ๋ฐ”๋€Œ๋ฆฌ๋ผ ์˜ˆ์ƒ๋˜๋Š” ์œ„์น˜์— ๋”ฐ๋ผ์„œ ์˜ฎ๊ธด๋‹ค.)

์‚ฌ์‹ค ํ•จ์ˆ˜๋ฅผ ์˜ฎ๊ธธ์ง€ ๋ง์ง€๋ฅผ ์ •ํ•˜๊ธฐ๋Š” ์‰ฝ์ง€ ์•Š๋‹ค. ์ €์ž์— ๋”ฐ๋ฅด๋ฉด ๊ทธ๋Ÿด ๋• ๋Œ€์ƒ ํ•จ์ˆ˜์˜ ํ˜„์žฌ ์ปจํ…์ŠคํŠธ์™€ ํ›„๋ณด ์ปจํ…์ŠคํŠธ๋ฅผ ๋‘˜๋Ÿฌ๋ณด๋ฉด ๋„์›€์ด ๋œ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ํ•จ์ˆ˜ ์ด๋™ ๋ฟ๋งŒ์ด ์•„๋‹ˆ๋ผ ์—ฐ๊ด€๋œ ํ•จ์ˆ˜๋“ค์€ ํด๋ž˜์Šค ๋ฌถ๊ธฐ๋‚˜ ํด๋ž˜์Šค ์ถ”์ถœํ•˜๊ธฐ๋กœ ํ•ด๊ฒฐํ•˜๊ธฐ๋„ ํ•œ๋‹ค.
๊ทธ๋ฆฌ๊ณ  ํ•จ์ˆ˜์˜ ์ตœ์ ์˜ ์žฅ์†Œ๋ฅผ ์ฐพ๊ธฐ ์–ด๋ ค์šด ๊ฒฝ์šฐ์—๋Š” ํ•œ ์ปจํ…์ŠคํŠธ์— ๋‘๊ณ  ์ž‘์—…ํ•ด๋ณด๋Š” ๊ฒƒ๋„ ์ข‹๋‹ค. ๊ทธ๋Ÿฌ๋ฉด ์–ผ๋งˆ๋‚˜ ์ ํ•ฉํ•œ์ง€ ์ ์  ๊นจ๋‹ฌ์•„ ๊ฐ€๊ณ , ๊ทธ ํŒ๋‹จ์— ๋”ฐ๋ผ ์–ธ์ œ๋“  ์˜ฎ๊ธธ ์ˆ˜ ์žˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์ด์ œ ๊ทธ ์˜ˆ์‹œ๋ฅผ ์ฝ”๋“œ๋ฅผ ํ†ตํ•ด ์•Œ๋ณด๋„๋ก ํ•˜๊ฒ ๋‹ค.

// ์ค‘์ฒฉ ํ•จ์ˆ˜๋ฅผ ์ตœ์ƒ์œ„๋กœ ์˜ฎ๊ธฐ๊ธฐ// Before: calculateDistance ํ•จ์ˆ˜๊ฐ€ trackSummary ํ•จ์ˆ˜ ๋‚ด๋ถ€์— ์ค‘์ฒฉ์œผ๋กœ ์„ ์–ธ๋˜์–ด ์žˆ๋‹ค.// ๋ชฉํ‘œ: calculateDistance ํ•จ์ˆ˜๋ฅผ ์ตœ์ƒ์œ„๋กœ ์˜ฎ๊ฒจ ์ถ”์  ๊ฑฐ๋ฆฌ๋ฅผ ๋‹ค๋ฅธ ์ •๋ณด์™€ ๋…๋ฆฝ์ ์œผ๋กœ ๊ณ„์‚ฐํ•˜๊ณ  ์‹ถ๋‹ค.function trackSummary(points) {  const totalTime = calculateTime();  const totalDistance = calculateDistance();  const pace = totalTime / 60 / totalDistance;  return {    time: totalTime,    distance: totalDistance,    pace: pace  }  function calculateDistance() {        let result = 0;    for (const i = 1; i < points.length; i++) {      result += distance(points[i-1], points[i]);     }    return result;  }  function distance(p1, p2) { ... }   function radians(degrees) { ... }   function calculateTime() { ... } }// ๋ชฉํ‘œ ๋‹ฌ์„ฑ ํ›„function trackSummary(points) {    const totalTime = calculateTime();    const pace = totalTime / 60 / totalDistance(points);    return {        time: totalTime,        distance: totalDistance(points),        pace: pace    };}function totalDistance(points) { ... } // totalDistance๋‚ด๋ถ€์— distance์™€ radians๋ฅผ ์ค‘์ฒฉ ํ•จ์ˆ˜๋กœ ์„ ์–ธํ•  ์ˆ˜๋„ ์žˆ๋‹ค.function distance(p1, p2) { ... }function radians(degrees) { ... }function calculateTime() { ... }

์œ„ ์ฝ”๋“œ๋ฅผ ๋ณด๋ฉด ์ค‘์ฒฉํ•จ์ˆ˜๋“ค์„ ์ตœ์ƒ์œ„๋กœ ๋Œ์–ด์˜ฌ๋ ค ์ถ”์  ๊ฑฐ๋ฆฌ์— ๋Œ€ํ•œ ๊ณ„์‚ฐ์„ trackSummay ์ปจํ…์ŠคํŠธ์™€ ๋…๋ฆฝ์ ์œผ๋กœ ๋ถ„๋ฆฌํ–ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  totalDistance ํ•จ์ˆ˜์—์„œ distance์™€ radians ํ•จ์ˆ˜๊ฐ€ ์‚ฌ์šฉ๋˜๋Š”๋ฐ, ๊ฐ€์‹œ์„ฑ์„ ์ค„์ด๊ธฐ ์œ„ํ•ด totalDistance ๋‚ด๋ถ€์— ์ค‘์ฒฉ ํ•จ์ˆ˜๋กœ ์„ ์–ธํ•˜๋Š” ๊ฒƒ๋„ ๊ณ ๋ คํ•  ์ˆ˜ ์žˆ๋‹ค. ํ•˜์ง€๋งŒ ์ €์ž๋Š” ์ค‘์ฒฉ ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๋‹ค ๋ณด๋ฉด ์ˆจ๊ฒจ์ง„ ๋ฐ์ดํ„ฐ๋ผ๋ฆฌ ์ƒํ˜ธ ์˜์กดํ•˜๊ธฐ๊ฐ€ ์‰ฌ์šฐ๋‹ˆ ๋˜๋„๋ก ์‚ฌ์šฉํ•˜์ง€ ๋ง์ž๊ณ  ์ฃผ์žฅํ•œ๋‹ค.(๊ทธ๋ฆฌ๊ณ  ์–ธ์–ด์— ๋”ฐ๋ผ ์ค‘์ฒฉ ํ•จ์ˆ˜ ์„ ์–ธ์— ๋Œ€ํ•œ ํ•œ๊ณ„๊ฐ€ ์žˆ์–ด์„œ, ์–ธ์–ด์— ๋”ฐ๋ผ ๋ฐฉ๋ฒ•์ด ๋‹ฌ๋ผ์งˆ ์ˆ˜ ์žˆ๋‹ค.)

์ด๋ฒˆ์—๋Š” ์ตœ์ƒ์œ„ ์ปจํ…์ŠคํŠธ๋กœ ํ•จ์ˆ˜๋ฅผ ๋นผ๋Š” ๊ฒƒ์ด ์•„๋‹Œ ๋‹ค๋ฅธ ํด๋ž˜์Šค๋กœ ์˜ฎ๊ธฐ๋Š” ์˜ˆ์‹œ์ด๋‹ค.

// ๋‹ค๋ฅธ ํด๋ž˜์Šค๋กœ ์˜ฎ๊ธฐ๊ธฐ ์˜ˆ์‹œ// Before : Account์— ๊ณ„์ขŒ ์ข…๋ฅ˜์— ๋”ฐ๋ผ ์ด์ž ์ฑ…์ • ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด ๋‹ฌ๋ผ์ง€๋Š” ํ•จ์ˆ˜๊ฐ€ ์กด์žฌํ•œ๋‹ค.// ๋ชฉํ‘œ : ์ด์ž ์ฑ…์ • ์ฑ…์ž„์„ ๋ณ„๋„๋กœ ๋ถ„๋ฆฌํ•ด๋ณด์ž.class Account {    get bankCharge() {        let result = 4.5;        if (this._daysOverdrawn > 0) result += this.overdraftCharge;        return result;    }    get overdraftCharge() {         if(this.type.isPremium) {            const baseCharge = 10;            if(this.daysOverdrawn <= 7) {                return baseCharge;            } else {                return baseCharge + (this.daysOverdrawn - 7) * 0.85;            }        } else {            return this.daysOverdrawn * 1.75;        }    }}// After : AccountType ํด๋ž˜์Šค๋กœ ์ด๋™class Account {    get bankCharge() {        let result = 4.5;        if (this._daysOverdrawn > 0) result += this.type.overdraftCharge(this.daysOverdrawn);        return result;    }    // ์œ„์ž„ ๋ฉ”์„œ๋“œ๋กœ ๋งŒ๋“ค๊ฑฐ๋ฉด get overdraftCharge ๋ฉ”์†Œ๋“œ๋ฅผ ๋‘”๋‹ค.}class AccountType {    overdraftCharge(daysOverdrawn) { // daysOverdrawn์€ ๊ณ„์ขŒ๋ณ„๋กœ ๋‹ฌ๋ผ์ง€๋Š” ๋ฉ”์„œ๋“œ์ด๊ธฐ ๋•Œ๋ฌธ์— ๊ทธ๋Œ€๋กœ ๋‘”๋‹ค.    // ์‚ฌ์šฉํ•˜๋Š” ์ปจํ…์ŠคํŠธ๊ฐ€ ๋งŽ์œผ๋ฉด daysOverdrawn์ด ์•„๋‹ˆ๋ผ account๋ฅผ ํ†ต์งธ๋กœ ์‚ฌ์šฉํ•œ๋‹ค.        if(this.isPremium) {            const baseCharge = 10;            if(daysOverdrawn <= 7) {                return baseCharge;            } else {                return baseCharge + (daysOverdrawn - 7) * 0.85;            }        } else {            return daysOverdrawn * 1.75;        }    }}

1.2 ํ•„๋“œ ์˜ฎ๊ธฐ๊ธฐ

ํ”„๋กœ๊ทธ๋žจ์„ ์งœ๋‹ค๋ณด๋ฉด ์ฃผ์–ด์ง„ ๋ฌธ์ œ์— ์ ํ•ฉํ•˜์ง€ ์•Š์€ ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ๋ฅผ ํ™œ์šฉํ•˜์—ฌ ๋ฐ์ดํ„ฐ๋ฅผ ๋‹ค๋ฃจ๊ธฐ ์œ„ํ•œ ์ฝ”๋“œ๋กœ ๋ฒ”๋ฒ…์ด ๋˜๋Š” ๊ฒฝํ—˜์„ ํ•ด๋ณธ์  ์žˆ์„ ๊ฒƒ์ด๋‹ค. ๊ทธ๋ž˜์„œ ์ดํ•ดํ•˜๊ธฐ ์–ด๋ ค์šด ์ฝ”๋“œ๊ฐ€ ๋งŒ๋“ค์–ด์ง€๊ณ  ์–ด๋–ค ์ผ์„ ํ•˜๋Š”์ง€ ํŒŒ์•…ํ•˜๋Š”๋ฐ ๋ฐฉํ•ด๊ฐ€ ๋œ๋‹ค.

๊ทธ๋ž˜์„œ ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ๊ฐ€ ์ค‘์š”ํ•˜๊ณ  ๋ง‰์ƒ ์ ํ•ฉํ•œ ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ๋ฅผ ๋งŒ๋“ค์–ด ๋‚ด๊ณ ์ž ํ•  ๋•Œ ์–ด๋ ต๋‹ค. ์ ํ•ฉํ•œ ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ๋ฅผ ๋งŒ๋“ค๊ธฐ ์œ„ํ•ด์„œ๋Š” ๊ฒฝํ—˜๊ณผ ๋„๋ฉ”์ธ ์ฃผ๋„ ์„ค๊ณ„๊ฐ™์€ ๊ธฐ์ˆ ์ด ํ•„์š”ํ•˜๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๊ทธ๋Ÿฐ ๊ธฐ์ˆ ์„ ๊ฐ€์กŒ๋‹ค๊ณ  ํ•ด๋„ ์ˆ™๋ จ์ž๋“ค๋„ ํ”„๋กœ์ ํŠธ๋ฅผ ์ง„ํ–‰ํ• ์ˆ˜๋ก ๋ฌธ์ œ ๋„๋ฉ”์ธ๊ณผ ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ์— ๋Œ€ํ•ด ๋” ๋งŽ์ด ๋ฐฐ์šฐ๊ณ  ์ž˜๋ชป๋œ ๊ฒƒ์œผ๋กœ ํŒ๋ช…ํ•˜๊ณ  ์ˆ˜์ •ํ•˜๊ธฐ๋„ ํ•œ๋‹ค๊ณ  ํ•œ๋‹ค.

ํ•„๋“œ ์˜ฎ๊ธฐ๋Š” Case

  • ํ•จ์ˆ˜์— ์–ด๋–ค ๋ ˆ์ฝ”๋“œ๋ฅผ ๋„˜๊ธธ ๋•Œ๋งˆ๋‹ค ๋‹ค๋ฅธ ๋ ˆ์ฝ”๋“œ์˜ ํ•„๋“œ๋„ ํ•จ๊ป˜ ๋„’๊ธฐ๊ณ  ์žˆ๋Š” ๊ฒฝ์šฐ

  • ์–ด๋–ค ๋ ˆ์ฝ”๋“œ๋ฅผ ๋ณ€๊ฒฝํ•  ๋•Œ ๋‹ค๋ฅธ ๋ ˆ์ฝ”๋“œ์˜ ํ•„๋“œ๊นŒ์ง€ ๋ณ€๊ฒฝํ•ด์•ผํ•˜๋Š” ๊ฒฝ์šฐ

ํ•„๋“œ ์˜ฎ๊ธฐ๊ธฐ ๋ฆฌํŒฉํ„ฐ๋ง์€ ๋ณดํ†ต ๋” ํฐ ๋ณ€๊ฒฝ์˜ ์ผํ™˜์œผ๋กœ ์ˆ˜ํ–‰๋œ๋‹ค. ํ•˜๋‚˜์˜ ํ•„๋“œ๊ฐ€ ์˜ฎ๊ฒจ์ง€๋ฉด ๊ทธ ํ•„๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋งŽ์€ ์ฝ”๋“œ๊ฐ€ ์˜ฎ๊ฒจ์ง„ ์œ„์น˜์—์„œ ์‚ฌ์šฉํ•˜๋Š”๊ฒŒ ๋” ์ˆ˜์›”ํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ํ•˜์ง€๋งŒ ์˜ฎ๊ธฐ๋ ค๋Š” ๋ฐ์ดํ„ฐ๊ฐ€ ์“ฐ์ด๋Š” ํŒจํ„ด ๋•Œ๋ฌธ์— ๋‹น์žฅ ํ•„๋“œ๋ฅผ ์˜ฎ๊ธธ ์ˆ˜ ์—†๋Š” ๊ฒฝ์šฐ๊ฐ€ ์žˆ๋‹ค. ๊ทธ๋Ÿด ๋• ์‚ฌ์šฉ ํŒจํ„ด์„ ๋จผ์ € ๋ฆฌํŒฉํ„ฐ๋งํ•˜๊ณ  ํ•„๋“œ๋ฅผ ์˜ฎ๊ฒจ์•ผํ•œ๋‹ค.

์•„๋ž˜๊ฐ€ ๊ทธ ์ ์šฉ ์˜ˆ์‹œ๋‹ค.

// Before : Customer ํด๋ž˜์Šค์— discountRate์ด ์กด์žฌ.// ๋ชฉํ‘œ : ํ• ์ธ์œจ์„ ๋œปํ•˜๋Š” discountRate ํ•„๋“œ๋ฅผ Customer -> CustomerContract๋กœ ์˜ฎ๊ธฐ๊ธฐclass Customer {    constructor(name, discountRate) {        this._name = name;        this._discountRate = discountRate;        this._contract = new CustomerContract(dateToday());    }    get discountRate() {        return this._discountRate;    }    becomePreferred() {        this._discountRate += 0.03;        // + ๋‹ค๋ฅธ ์ผ๋“ค    }    applyDiscount(amount) {        return amount.subtract(amount.multiply(this._discountRate));    }    dateToday() {        return new Date();    }}class CustomerContract { // ๊ณ„์•ฝ ํด๋ž˜์Šค    constructor(startDate) {        this._startDate = startDate;    }}// After : discountRateํ•„๋“œ๋ฅผ CustomerContract๋กœ ์ด๋™์‹œํ‚จ๋‹ค.class Customer {  constructor(name, discountRate) {    this._name = name;    this._contract = new CustomerContract(this.dateToday());    this._setDiscountRate(discountRate); // contract ํด๋ž˜์Šค ํ˜ธ์ถœ ๋’ค ์‹คํ–‰  }  get discountRate() {    return this._contract.discountRate;  }  setDiscountRate(number) {    return this._contract.discountRate = number;  }  becomePreferred() {    this._contract.discountRate += 0.03;    // ๋“ฑ๋“ฑ  }  applyDiscount(amount) {    return amount.subtract(amount.multiply(this._contract.discountRate));  }  dateToday() {    return new Date();  }}class CustomerContract {    constructor(startDate, discountRate) {        this._startDate = startDate;        this._discountRate = discountRate;    }    get discountRate() {        return this._discountRate;    }    _setDiscountRate(aNumber) { // ์ ‘๊ทผ ์ œ์–ด ์บก์А, ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ๋ฉด ๊ตณ์ด aNumber๋กœ??        this._discountRate = aNumber;    }}

ํ•„๋“œ๋ฅผ ์˜ฎ๊ธฐ๋Š”๋ฐ ๊ทธ ํŠน์„ฑ์— ๋”ฐ๋ผ์„œ ์ ‘๊ทผ ์ œ์–ด์ž๋ฅผ ์ˆ˜์ •ํ•˜๋Š” ๋“ฑ ๋ ˆ์ฝ”๋“œ ํŠน์„ฑ์— ๋งž๊ฒŒ ์บก์Аํ™”๋ฅผ ์ ์ ˆํžˆ ํ•ด์•ผํ•œ๋‹ค.

๋‹ค์Œ์€ ๊ณต์œ  ๊ฐ์ฒด๋กœ ์ด๋™์‹œํ‚ค๋Š” ์˜ˆ์‹œ์ด๋‹ค. ์ฝ”๋“œ๋ณด๋‹ค๋Š” ๋ฆฌํŒฉํ„ฐ๋ง์—์„œ ์‹ ๊ฒฝ์จ์•ผํ•  ์ ์ด ๋ฌด์—‡์ธ์ง€ ์•Œ์•„๊ฐ€๋Š” ๊ฒƒ์ด ์ข‹์„ ๊ฒƒ ๊ฐ™๋‹ค.

// Before : Account์˜ ์ด์ž๊ฐ€ Account์— ๋”ฐ๋ผ ๋‹ค๋ฅด๋‹ค// ๋ชฉํ‘œ : AccountType์— ๋”ฐ๋ผ ์ด์ž๊ฐ€ ๋‹ค๋ฅด๊ฒŒ ๋ณ€๊ฒฝํ–ˆ์œผ๋ฉฐ DB๊นŒ์ง€ ์ผ์น˜ํ•˜๋Š”์ง€ ํ™•์ธํ•˜๊ธฐ.class Account {    constructor(number, type, interestRate) {        this._number = number;        this._type = type;        this._interestRate = interestRate;    }    get interestRate() {return this._interestRate;}}class AccountType {    constructor(name) {        this._name = name;    }}// After : AccountType์— ๋”ฐ๋ผ ์ด์ž๊ฐ€ ๊ฒฐ์ •๋˜๋ฉฐ, ๊ฒ‰๋ณด๊ธฐ ๋™์ž‘๋„ ์ผ์น˜ํ•˜๋Š”์ง€ ํ™•์ธํ•˜๋ฉฐ ๋งŒ๋“ค์–ด์•ผ ํ•จ.class Account {    constructor(number, type, interestRate) {        this._number = number;        this._type = type;    }    get interestRate() {return this._type.interestRate;}}class AccountType {    constructor(name, interestRate) {        this._name = name;        this._interestRate = interestRate;    }    get interestRate() {return this._interestRate;}}

์œ„ ์ฝ”๋“œ๋Š” DB์— ๋‹น์—ฐํžˆ ๊ฐ ๊ณ„์ขŒ๊ฐ€ ๊ณ„์ขŒ ์ข…๋ฅ˜์—๋”ฐ๋ผ ๊ฐ™์€ ์ด์ž์œจ์„ ๊ณต์œ ํ•œ๋‹ค๊ณ  ๊ฐ€์ •ํ•˜๊ณ  ๋งŒ๋“  ์ฝ”๋“œ์ด๋‹ค. ํ•˜์ง€๋งŒ ์ด์ „์—๋Š” ๊ณ„์ขŒ ๋ณ„๋กœ ์ด์ž์œจ์ด ๋‹ฌ๋ผ์กŒ๋Š”๋ฐ ์ƒˆ๋กญ๊ฒŒ ๊ณ„์ขŒ ์ข…๋ฅ˜๋ณ„๋กœ ์ด์ž์œจ์ด ๊ฐ™๊ฒŒ ์„ค์ •ํ•œ๋‹ค๋ฉด ์ˆ˜์ • ์ „๊ณผ ํ›„์˜ ๊ฒ‰๋ณด๊ธฐ ๋™์ž‘์ด ๊ฐ™์€์ง€ ํ™•์ธํ•ด์•ผํ•œ๋‹ค. ๊ทธ๋ž˜์„œ ์•„๋ž˜์™€ ๊ฐ™์€ ์ค‘๊ฐ„ ์ฝ”๋“œ๋ฅผ ์งœ๋Š”๊ฒŒ ๋„์›€์ด ๋  ์ˆ˜ ์žˆ๋‹ค.

class Account {    constructor(number, type, interestRate) {        this._number = number;        this._type = type;        assert(interestRate === this._type.interestRate); // ์šด์˜, ํ…Œ์ŠคํŠธ ์ค‘์— ์˜ค๋ฅ˜ ํ™•์ธํ•˜์—ฌ ๊ฒ‰๋ณด๊ธฐ ๋™์ž‘ ์ผ์น˜ ์—ฌ๋ถ€ ํ™•์ธ        this._interestRate = interestRate;    }    get interestRate() {return this._interestRate;}}

1.3 ๋ฌธ์žฅ์„ ํ•จ์ˆ˜๋กœ ์˜ฎ๊ธฐ๊ธฐ

์ค‘๋ณต ์ œ๊ฑฐ๋Š” ์ฝ”๋“œ๋ฅผ ๊ฑด๊ฐ•ํ•˜๊ฒŒ ๊ด€๋ฆฌํ•˜๋Š” ํšจ๊ณผ์ ์ธ ๋ฐฉ๋ฒ•์ด๋‹ค. ํŠน์ • ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ์ฝ”๋“œ๊ฐ€ ๋‚˜์˜ฌ ๋•Œ๋งˆ๋‹ค ๊ทธ ์•ž์ด๋‚˜ ๋’ค์—์„œ ๋˜‘๊ฐ™์€ ์ฝ”๋“œ๊ฐ€ ์ถ”๊ฐ€๋กœ ์‹คํ–‰๋˜๋Š” ๊ฒฝ์šฐ ๊ทธ ๋ฐ˜๋ณต๋˜๋Š” ๋ถ€๋ถ„์„ ํ”ผํ˜ธ์ถœ ํ•จ์ˆ˜๋กœ ํ•ฉ์น˜๋Š” ๊ฒƒ์ด ์ข‹๋‹ค. ๊ทธ๋Ÿฌ๋ฉด ๋‚˜์ค‘์— ์ˆ˜์ •ํ•  ์ผ์ด ์ƒ๊ฒผ์„ ๋•Œ ํ•œ ๊ณณ๋งŒ ์ˆ˜์ •ํ•˜๋ฉด ๋œ๋‹ค. ๋ฌผ๋ก  ๋ฐ˜๋Œ€๋กœ ์ฝ”๋“œ์˜ ๋™์ž‘์„ ์—ฌ๋Ÿฌ ๋ณ€ํ˜•๋“ค๋กœ ๋‚˜๋ˆ ์•ผ ํ•˜๋Š” ์ˆœ๊ฐ„์ด ์˜ค๋ฉด ๋ฌธ์žฅ์„ ํ˜ธ์ถœํ•œ ๊ณณ์œผ๋กœ ์˜ฎ๊ธฐ๋ฉด ๋œ๋‹ค.

๋ฌธ์žฅ๋“ค์„ ํ•จ์ˆ˜๋กœ ์˜ฎ๊ธฐ๋ ค๋ฉด ๊ทธ ๋ฌธ์žฅ๋“ค์ด ํ”ผํ˜ธ์ถœ ํ•จ์ˆ˜์˜ ์ผ๋ถ€๋ผ๋Š” ํ™•์‹ ์ด ์žˆ์–ด์•ผ ํ•œ๋‹ค.

๋ฌธ์žฅ์„ ํ•จ์ˆ˜๋กœ ์˜ฎ๊ธฐ๋Š” Case

  • ํ”ผํ˜ธ์ถœ ํ•จ์ˆ˜์™€ ํ•œ ๋ชธ์€ ์•„๋‹ˆ์ง€๋งŒ ์—ฌ์ „ํžˆ ํ•จ๊ป˜ ํ˜ธ์ถœ๋ผ์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ ํ•ด๋‹น ๋ฌธ์žฅ๊ณผ ํ”ผํ˜ธ์ถœ ํ•จ์ˆ˜๋ฅผ ํ†ต์งธ๋กœ ๋˜ํ•˜๋‚˜์˜ ํ•จ์ˆ˜๋กœ ์ถ”์ถœ

์•„๋ž˜๋Š” ๊ทธ ์˜ˆ์‹œ๋กœ ์‚ฌ์ง„ ๊ด€๋ จ ๋ฐ์ดํ„ฐ๋ฅผ HTML๋กœ ๋‚ด๋ณด๋‚ด๋Š” ์ฝ”๋“œ๋‹ค.

 // Before : "์ œ๋ชฉ"์€ ์‚ฌ์ง„ ์ •๋ณด์˜ ์ผ๋ถ€์ด๋ฉฐ emitPhotoData์™€ ํ•ญ์ƒ ํ•จ๊ป˜ ํ˜ธ์ถœ๋œ๋‹ค. // ๋ชฉํ‘œ : ์ œ๋ชฉ์„ ์ถœ๋ ฅํ•˜๋Š” ์ฝ”๋“œ๋ฅผ emitPhotoData๋กœ ์˜ฎ๊ฒจ ์ค‘๋ณต์„ ์ œ๊ฑฐํ•œ๋‹ค.function renderPerson(person) {  const result = [];  result.push(`<p>${person.name}</p>`);  result.push(renderPhoto(person.photo));  result.push(`<p>์ œ๋ชฉ: ${person.photo.title}</p>`);  result.push(emitPhotoData(person.photo));  return result.join("\n");}function photoDiv(aPhoto) {  return [    '<div>',     `<p>์ œ๋ชฉ: ${p.title}</p>`,    emitPhotoData(aPhoto),    '</div>'].join("\n");}function emitPhotoData(aPhoto) {  const result = [];  result.push(`<p>์œ„์น˜: ${aPhoto.location}</p>`);  result.push(`<p>๋‚ ์งœ: ${aPhoto.date.toDateString()}</p>`);  return result.join("\n");}// After : emitPhotoData์—์„œ ์ œ๋ชฉ์„ ํ•จ๊ป˜ ์ถœ๋ ฅํ•˜๊ฒŒ ๋ณ€๊ฒฝfunction renderPerson(person) {   const result = [];  result.push(`<p>${person.name}</p>`);  result.push(renderPhoto(person.photo));  result.push(emitPhotoData(person.photo));  return result.join("\n");}function photoDiv(aPhoto) {  return [    '<div>',     emitPhotoData(aPhoto),    '</div>'].join("\n");}function emitPhotoData(aPhoto) {  return [    `<p>์ œ๋ชฉ: ${aPhoto.title}</p>`    `<p>์œ„์น˜: ${aPhoto.location}</p>`    `<p>๋‚ ์งœ: ${aPhoto.date.toDateString()}</p>`  ].join("\n");}

1.4 ๋ฌธ์žฅ์„ ํ˜ธ์ถœํ•œ ๊ณณ์œผ๋กœ ์˜ฎ๊ธฐ๊ธฐ

ํ•จ์ˆ˜๋Š” ํ”„๋กœ๊ทธ๋ž˜๋จธ๊ฐ€ ์Œ“์•„ ์˜ฌ๋ฆฌ๋Š” ์ถ”์ƒํ™”์˜ ๊ธฐ๋ณธ ๋นŒ๋”ฉ ๋ธ”๋ก์ด๋‹ค. ๊ทธ๋Ÿฐ๋ฐ ์ถ”์ƒํ™”๋ผ๋Š” ๊ฒƒ์€ ๊ทธ ๊ฒฝ๊ณ„๋ฅผ ํ•ญ์ƒ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ๊ธ‹๊ธฐ๋Š” ํž˜๋“ค๋‹ค. ๊ทธ๋ž˜์„œ ์ฝ”๋“œ ๋ฒ ์ด์Šค์˜ ๊ธฐ๋Šฅ ๋ฒ”์œ„๊ฐ€ ๋‹ฌ๋ผ์ง€๋ฉด ์ถ”์ƒํ™”์˜ ๊ฒฝ๊ณ„๋„ ์›€์ง์ธ๋‹ค. ์ดˆ๊ธฐ์—๋Š” ์‘์ง‘๋„ ๋†’๊ณ  ๋‹จ์ผ ์ฑ…์ž„์„ ๊ฐ€์ง„ ํ•จ์ˆ˜๊ฐ€ ์–ด๋А์ƒˆ ๋‘˜ ์ด์ƒ์˜ ์ฑ…์ž„์„ ์ˆ˜ํ–‰ํ•˜๊ฒŒ ๋ฐ”๋€” ์ˆ˜๋„ ์žˆ๋‹ค.

๋ฌธ์žฅ์„ ํ˜ธ์ถœํ•œ ๊ณณ์œผ๋กœ ์˜ฎ๊ธฐ๋Š” Case

  • ์—ฌ๋Ÿฌ ๊ณณ์—์„œ ์‚ฌ์šฉ ํ•˜๋˜ ๊ธฐ๋Šฅ์ด ์ผ๋ถ€ ํ˜ธ์ถœ์ž๋“ค์—๊ฒŒ๋Š” ๋‹ค๋ฅด๊ฒŒ ๋™์ž‘ํ•ด์•ผํ•˜๋Š” ๊ฒฝ์šฐ

๊ทธ๋Ÿฐ๋ฐ ์œ„ ๋ณ€๊ฒฝ์ด ์ž‘์€ ๋ณ€๊ฒฝ์ด๋ผ๋ฉด ๊ทธ๋ƒฅ ๋ฌธ์žฅ์„ ํ˜ธ์ถœํ•œ ๊ณณ์œผ๋กœ ์˜ฎ๊ธฐ๋ฉด ๋์ด์ง€๋งŒ, ํ˜ธ์ถœ์ž์™€ ํ˜ธ์ถœ ๋Œ€์ƒ์˜ ๊ฒฝ๊ณ„๋ฅผ ์™„์ „ํžˆ ๋‹ค์‹œ ๊ทธ์–ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ๋„ ์ƒ๊ธธ ์ˆ˜ ์žˆ๋‹ค. ๊ทธ๋Ÿฌ๋ฉด ํ•จ์ˆ˜๋ฅผ ๋‹ค์‹œ ์ธ๋ผ์ธ์œผ๋กœ ๋งŒ๋“ค๊ณ  ์ ํ•ฉํ•œ ๊ฒฝ๊ณ„๋ฅผ ๊ทธ์–ด์•ผ ํ•œ๋‹ค.

์•„๋ž˜ ๊ทธ ์˜ˆ์‹œ๋กœ ์œ„์น˜ ์ •๋ณด๋ฅผ ๋‹ค๋ฅด๊ฒŒ ๋ Œ๋”๋ง ํ•˜๋„๋ก ๋งŒ๋“ค์–ด์•ผํ•˜๋Š” ๊ฒฝ์šฐ์ด๋‹ค.

// Before : photo์˜ location์ด ํ•ญ์ƒ ๊ฐ™๊ฒŒ ๋ Œ๋”๋ง ๋œ๋‹ค.// ๋ชฉํ‘œ : listRecentPhotos()๊ฐ€ ์œ„์น˜ ์ •๋ณด(location)์„ ๋‹ค๋ฅด๊ฒŒ ๋ Œ๋”๋งํ•ด์•ผ ํ•œ๋‹ค.function renderPerson(outStream, person) {  outStream.write(`<p>${person.name}</p>\n`);  renderPhoto(outStream, person.photo);  emitPhotoData(outStream, person.photo);}function listRecentPhotos(outStream, photos) {  photos    .filter((p) => p.date > recentDateCutoff())    .forEach((p) => {      outStream.write('<div>\n');      emitPhotoData(outStream, p);      outStream.write('</div>\n');    });}function emitPhotoData(outStream, photo) {  outStream.write(`<p>์ œ๋ชฉ: ${photo.title}</p>\n`);  outStream.write(`<p>๋‚ ์งœ: ${photo.date.toDateString()}</p>\n`);  outStream.write(`<p>์œ„์น˜: ${photo.location}</p>\n`);}// After : function renderPerson(outStream, person) {  outStream.write(`<p>${person.name}</p>\n`);  renderPhoto(outStream, person.photo);  emitPhotoData(outStream, person.photo);  outStream.write(`<p>์œ„์น˜: ${person.photo.location}</p>\n`) // ์œ„์น˜๊ฐ€ ๋ณ„๋„๋กœ ๋น ์ง}function listRecentPhotos(outStream, photos) {  photos    .filter((p) => p.date > recentDateCutoff())    .forEach((p) => {      outStream.write('<div>\n');      emitPhotoData(outStream, p);      outStream.write(`<p>์œ„์น˜: ${p.location}</p>\n`); // ์œ„์น˜๊ฐ€ ๋ณ„๋„๋กœ ๋น ์ง      outStream.write('</div>\n');    });}function emitPhotoData(outStream, photo) {  outStream.write(`<p>์ œ๋ชฉ: ${photo.title}</p>\n`);  outStream.write(`<p>๋‚ ์งœ: ${photo.date.toDateString()}</p>\n`);}

์œ„ ์˜ˆ์‹œ๋Š” ํ”ผํ˜ธ์ถœ์ž๊ฐ€ ๊ฐ„๋‹จํ•˜๊ณ  ํ˜ธ์ถœ์ž๊ฐ€ 2๊ฐœ ๋ฟ์ธ ์ƒํ™ฉ์ด๋‹ค. ํ•˜์ง€๋งŒ ๋งŒ์•ฝ ํ˜ธ์ถœ์ž๊ฐ€ ๋˜๊ฒŒ ๋งŽ๊ณ  ํ”ผํ˜ธ์ถœ์ž๊ฐ€ ๋ณต์žกํ•˜๋ฉด ๋‹จ๊ณ„ ๋ณ„๋กœ "์ƒˆ๋กœ์šด ํ”ผํ˜ธ์ถœ์ž์— ๋‚จ๊ธธ ์ฝ”๋“œ ์ถ”์ถœํ•˜๊ธฐ" - "๊ธฐ์กด ํ”ผํ˜ธ์ถœ ํ•จ์ˆ˜ ์ฝ”๋“œ ํ˜ธ์ถœ์ž์— ์ธ๋ผ์ธ ํ•˜๊ธฐ"์™€ ๊ฐ™์ด ๋‹จ๊ณ„์ ์œผ๋กœ ๋ฆฌํŒฉํ„ฐ๋ง ํ•˜๋Š” ๊ฒƒ์ด ๋„์›€์ด ๋  ๊ฒƒ์ด๋ผ ์ƒ๊ฐํ•œ๋‹ค.

1.5 ์ธ๋ผ์ธ ์ฝ”๋“œ๋ฅผ ํ•จ์ˆ˜ ํ˜ธ์ถœ๋กœ ๋ฐ”๊พธ๊ธฐ

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

// ๋ฆฌํŒฉํ„ฐ๋ง ์ „let appliesToMass = false;for(const s of states) {    if (s === "MA") appliesToMass = true;}// ๋ฆฌํŒฉํ„ฐ๋ง ํ›„const appliesToMass = states.includes("MA");

ํ™ฉ๋‹นํ•  ์ˆ˜๋„ ์žˆ์ง€๋งŒ ๊ตณ์ด ๋งํ•˜๊ณ  ์‹ถ์€ ์ ์€ ์‚ฌ์šฉ์ค‘์ธ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด์™€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ API๋ฅผ ์ž˜ ํŒŒ์•…ํ•˜๊ณ  ์žˆ๋‹ค๋ฉด ์ฝ”๋“œ๋ฅผ ๊ฐœ์„ ํ•˜๋Š”๋ฐ ๋” ์ˆ˜์›”ํ•˜๋‹ค๋Š” ๊ฒƒ์„ ์•Œ๋ ค์ฃผ๊ณ  ์‹ถ๋‹ค.

1.6 ๋ฌธ์žฅ ์Šฌ๋ผ์ด๋“œํ•˜๊ธฐ (์กฐ๊ฑด๋ฌธ ๊ณตํ†ต ์‹คํ–‰์ฝ”๋“œ ๋‚ด๋นผ๊ธฐ)

๊ด€๋ จ๋œ ์ฝ”๋“œ๋“ค์ด ๊ฐ€๊นŒ์ด ๋ชจ์—ฌ ์žˆ๋‹ค๋ฉด ์ดํ•ดํ•˜๊ธฐ๊ฐ€ ๋” ์‰ฝ๋‹ค. ์˜ˆ๋ฅผ ๋“ค๋ฉด ํ•˜๋‚˜์˜ ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ฌธ์žฅ๋“ค์€ ๋‹ค๋ฅธ ๋ฐ์ดํ„ฐ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ฌธ์žฅ ์‚ฌ์ด์— ํฉ์–ด์ ธ ์žˆ๊ธฐ ๋ณด๋‹ค๋Š” ํ•œ๋ฐ ๋ชจ์—ฌ์žˆ๋Š”๊ฒŒ ์ข‹๋‹ค. ๋ฌธ์žฅ ์Šฌ๋ผ์ด๋“œํ•˜๊ธฐ ๋ฆฌํŒฉํ„ฐ๋ง์ด ์ด๋Ÿฐ ์ฝ”๋“œ๋“ค์„ ํ•œ๋ฐ ๋ชจ์•„๋‘”๋‹ค.
๋ฌธ์žฅ ์Šฌ๋ผ์ด๋“œํ•˜๊ธฐ๋ฅผ ๊ฐ„๋‹จํžˆ ๋งํ•˜๋ฉด ์ฝ”๋“œ ์œ„์น˜๋ฅผ ์ •๋ฆฌํ•˜์—ฌ ๋ฆฌํŒฉํ„ฐ๋ง ํ•˜๊ฒŒ ํŽธํ•˜๊ณ  ์ดํ•ดํ•˜๊ธฐ ๋” ์‰ฝ๊ฒŒ ๋งŒ๋“œ๋Š” ๊ฒƒ์ด๋‹ค.

๋ฌผ๋ก  ๋ชจ๋“  ๋ณ€์ˆ˜ ์„ ์–ธ์„ ํ•จ์ˆ˜ ์ฒซ๋จธ๋ฆฌ์— ๋ชจ์•„๋‘๋Š” ์‚ฌ๋žŒ๋„ ์žˆ์ง€๋งŒ, ๋ฆฌํŒฉํ„ฐ๋ง ์ €์ž๋Š” ๋ณ€์ˆ˜๋ฅผ ์ฒ˜์Œ ์‚ฌ์šฉํ•  ๋•Œ ์„ ์–ธํ•˜๋Š” ์Šคํƒ€์ผ์„ ์„ ํ˜ธํ•œ๋‹ค.

๋ฌธ์žฅ ์Šค๋ผ์ด๋“œ ์ฃผ์˜์ 

  • ์ฝ”๋“œ ์กฐ๊ฐ์—์„œ ์ฐธ์กฐํ•˜๋Š” ์š”์†Œ๋ฅผ ์„ ์–ธํ•˜๋Š” ๋ฌธ์žฅ ์•ž์œผ๋กœ๋Š” ์ด๋™์ด ๋ถˆ๊ฐ€ํ•˜๋‹ค.

  • ์ฝ”๋“œ ์กฐ๊ฐ์„ ์ฐธ์กฐํ•˜๋Š” ์š”์†Œ์˜ ๋’ค๋กœ๋Š” ์ด๋™ํ•  ์ˆ˜ ์—†๋‹ค.

  • ์ฝ”๋“œ ์กฐ๊ฐ์—์„œ ์ฐธ์กฐํ•˜๋Š” ์š”์†Œ๋ฅผ ์ˆ˜์ •ํ•˜๋Š” ๋ฌธ์žฅ์„ ๊ฑด๋„ˆ๋›ฐ์–ด ์ด๋™ํ•  ์ˆ˜ ์—†๋‹ค.

  • ์ฝ”๋“œ ์กฐ๊ฐ์ด ์ˆ˜์ •ํ•˜๋Š” ์š”์†Œ๋ฅผ ์ฐธ์กฐํ•˜๋Š” ์š”์†Œ๋ฅผ ๊ฑด๋„ˆ๋„์–ด ์ด๋™ํ•  ์ˆ˜ ์—†๋‹ค.

๊ทธ๋ฆฌ๊ณ  ์ฝ”๋“œ ์กฐ๊ฐ์„ ์Šฌ๋ผ์ด๋“œํ•  ๋•Œ๋Š” ๋‘ ๊ฐ€์ง€๋ฅผ ํ™•์ธํ•ด์•ผํ•œ๋‹ค. "๋ฌด์—‡์„ ์Šฌ๋ผ์ด๋“œ"ํ•  ๊ฒƒ์ธ๊ฐ€์™€ "์Šฌ๋ผ์ด๋“œ ๊ฐ€๋Šฅ"ํ•œ์ง€ ์—ฌ๋ถ€์ด๋‹ค. "๋ฌด์—‡์„"์€ ๋งฅ๋ฝ๊ณผ ๊ด€๋ จ์ด ๊นŠ์œผ๋ฉฐ, ์Šฌ๋ผ์ด๋“œ ๊ฐ€๋Šฅ ์—ฌ๋ถ€๋„ ์ฝ”๋“œ ์กฐ๊ฐ ์ˆœ์„œ์— ๋”ฐ๋ผ ๋™์ž‘์ด ๋‹ฌ๋ผ์ง€๋Š” ์ง€๋ฅผ ํ™•์ธํ•ด์•ผ ํ•œ๋‹ค. ๋‹ค์Œ์€ ์˜ˆ์‹œ์ด๋‹ค.

// Before : ์ฝ”๋“œ๊ฐ€ ๊ด€์‹ฌ์‚ฌ์— ์ƒ๊ด€์—†์ด ๋ฐฐ์น˜๋œ ๊ฒฝ์šฐ๋“ค์ด ์žˆ์Œ. ์ค‘๊ฐ„์— ์–ด๋–ค ๊ณผ์ •์ด ์ถ”๊ฐ€๋˜๋ฉด ์ถ”์ ํ•˜๊ธฐ๋„ ํž˜๋“ค๊ฒƒ์ด๋‹ค.// ๋ชฉํ‘œ : ์ฝ”๋“œ๋ฅผ ๋น„์Šทํ•œ ๊ด€์‹ฌ์‚ฌ๋ผ๋ฆฌ ๋ฌถ์–ด๋ณด์žconst pricingPlan = retrievePricingPlan();const order = retreiveOrder();const baseCharge = pricingPlan.base;let charge;const chargePerUnit = pricingPlan.unit;const units = order.units;let discount;charge = baseCharge + units * chargePerUnit;let discountableUnits = Math.max(units - pricingPlan.discountThreshold, 0);discount = discountableUnits * pricingPlan.discountFactor;if(order.isRepeat) discount += 20;charge = charge - discount;chargeOrder(charge);// 9๋ฒˆ ์ค„๊นŒ์ง€๋Š” ์„ ์–ธ๋ฌธ์œผ๋กœ ๋ณด์ธ๋‹ค. ๊ทธ๋‹ค์Œ ์ค„๋ถ€ํ„ฐ๋Š” ์š”๊ธˆ ๊ณ„์‚ฐ์ด ์‹œ์ž‘๋œ๋‹ค. 12๋ฒˆ ์ค„์— ๋Š” discount๋ฅผ ๊ณ„์‚ฐํ•œ๋‹ค.// ์œ„์™€ ๊ฐ™์€ ๋ฐฉ์‹์œผ๋กœ ํ•œ๋ฒˆ ์Šฌ๋ผ์ด์‹ฑ ํ•ด๋ณด์ž. ๋‹จ ์œ„์น˜ ๋ณ€๊ฒฝ์ด ๊ฐ€๋Šฅํ•œ์ง€ ๋ฐ˜๋“œ์‹œ ํ™•์ธํ•˜๋ฉด์„œ ํ•ด์•ผํ•œ๋‹ค.// After : ๊ด€์‹ฌ์‚ฌ ๋ผ๋ฆฌ ๋ฌถ์–ด๋ณด์žconst pricingPlan = retrievePricingPlan();const order = retreiveOrder(); // ์ฃผ๋ฌธconst units = order.units;     // ์ฃผ๋ฌธ ๋‹จ์œ„ ์ˆ˜let discountableUnits = Math.max(units - pricingPlan.discountThreshold, 0); // ํ• ์ธ ๊ฐ€๋Šฅ ๊ฐœ์ˆ˜let discount; // ํ• ์ธ๊ฐ€discount = discountableUnits * pricingPlan.discountFactor; // ํ• ์ธ๊ฐ€ ๊ณ„์‚ฐif(order.isRepeat) discount += 20; // ํ• ์ธ๊ฐ€ ๊ณ„์‚ฐ2const baseCharge = pricingPlan.base; // ์š”๊ธˆ ๊ธฐ๋ณธconst chargePerUnit = pricingPlan.unit; // ์š”๊ธˆ ๋‹จ์œ„let charge; // ์š”๊ธˆcharge = baseCharge + units * chargePerUnit; // ์š”๊ธˆ ๊ณ„์‚ฐ1charge = charge - discount;// ์š”๊ธˆ ๊ณ„์‚ฐ2chargeOrder(charge);// ์ฃผ๋ฌธ ์š”๊ธˆ ๋ถ€๊ณผ

์œ„์—์„œ ์ฃผ๋ฌธ, ํ• ์ธ, ์š”๊ธˆ ์ด๋ ‡๊ฒŒ 3๊ฐ€์ง€๋กœ ๋‚˜๋ˆ ์„œ ์Šฌ๋ผ์ด์‹ฑํ–ˆ๋‹ค. ์ €๋ ‡๊ฒŒ ๋ณด๋‹ˆ ๊ทธ ๋‹ค์Œ ๋ฌด์—‡์„ ์–ด๋–ป๊ฒŒ ๋ฆฌํŒฉํ„ฐ๋งํ•ด์•ผํ•  ์ง€ ๋” ๋ช…ํ™•ํ•ด์ง„๋‹ค.(ํ™•์‹คํžˆ ์ž˜ ๋ณด์ธ๋‹ค) ์ด์ œ ํ•ฉ์น ๊ฑฐ ํ•ฉ์น˜๊ณ  ์ถ”์ถœํ•  ๊ฑฐ ์ถ”์ถœํ•˜๋ฉด ํ›จ์”ฌ ๊น”๋”ํ•œ ์ฝ”๋“œ๊ฐ€ ๋‚˜์˜ฌ ๊ฒƒ์ด๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๋งŒ์•ฝ ์Šฌ๋ผ์ด์‹ฑ์ด ๊ฐ€๋Šฅํ•œ์ง€ ๋” ๋น ๋ฅด๊ฒŒ ํŒ๋‹จํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” "๋ช…๋ น-์งˆ์˜ ๋ถ„๋ฆฌ ์›์น™(Command-Query Separation)"์„ ์ง€์ผœ์„œ ์ฝ”๋“œ๋ฅผ ์งœ๋ฉด ์ข‹๋‹ค.

๋‹ค์Œ์€ ์กฐ๊ฑด๋ฌธ์ด ์žˆ์„ ๊ฒฝ์šฐ ์Šฌ๋ผ์ด์‹ฑ ์˜ˆ์‹œ์ด๋‹ค. ์กฐ๊ฑด๋ฌธ์˜ ์•ˆ๋ฐ–์œผ๋กœ ์Šฌ๋ผ์ด๋“œํ•ด์•ผํ•  ๊ฒฝ์šฐ๊ฐ€ ์žˆ๋Š”๋ฐ, ๋ฐ–์œผ๋กœ ์Šฌ๋ผ์ด๋“œํ•˜๋ฉด ์ค‘๋ณต ๋กœ์ง์ด ์ œ๊ฑฐ๋  ๊ฒƒ์ด๊ณ , ์กฐ๊ฑด๋ฌธ ์•ˆ์œผ๋กœ ์Šฌ๋ผ์ด๋“œํ•  ๋•Œ๋Š” ๋ฐ˜๋Œ€๋กœ ์ค‘๋ณต ๋กœ์ง์ด ์ถ”๊ฐ€๋  ๊ฒƒ์ด๋‹ค.

// Before : allocatedResources.push๊ฐ€ ์กฐ๊ฑด๋ฌธ ๋งˆ๋‹ค ์ค‘๋ณต๋œ๋‹ค.// ๋ชฉํ‘œ : ๋ฐ–์œผ๋กœ ์Šฌ๋ผ์ด์‹ฑ ํ•˜์—ฌ ์ค‘๋ณต์„ ์ œ๊ฑฐํ•ด๋ณด์ž.let result;if (availableResources.length ===0) {    result = createResource();    allocatedResources.push(result);} else {    result = availableResources.pop();    allocatedResources.push(result);}return result;// After : ์กฐ๊ฑด๋ฌธ๋งˆ๋‹ค allocatedResouces.push๊ฐ€ ์—ฌ์ „ํžˆ ์‹คํ–‰๋˜์ง€๋งŒ, ์ค‘๋ณต์ด ์ œ๊ฑฐ๋˜์—ˆ๋‹ค.let result;if (availableResources.length ===0) {    result = createResource();} else {    result = availableResources.pop();}allocatedResources.push(result);return result;

1.7 ๋ฐ˜๋ณต๋ฌธ ์ชผ๊ฐœ๊ธฐ

์ข…์ข… ๋ฐ˜๋ณต๋ฌธ ํ•˜๋‚˜์—์„œ ๋‘ ๊ฐ€์ง€ ์ผ์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ์žˆ๋‹ค. ํ•˜์ง€๋งŒ ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ๋ฐ˜๋ณต๋ฌธ์„ ์ˆ˜์ •ํ•ด์•ผ ํ•  ๋•Œ๋งˆ๋‹ค ๋‘ ๊ฐ€์ง€ ์ผ ๋ชจ๋‘ ์ž˜ ์ดํ•ดํ•˜๊ณ  ์ง„ํ–‰ํ•ด์•ผ ํ•œ๋‹ค. ๋ฐ˜๋Œ€๋กœ ๊ฐ๊ฐ์˜ ๋ฐ˜๋ณต๋ฌธ์œผ๋กœ ๋ถ„๋ฆฌํ•ด๋‘๋ฉด ์ˆ˜์ •ํ•  ๋™์ž‘ ํ•˜๋‚˜๋งŒ ์ดํ•ดํ•˜๋ฉด ๋œ๋‹ค. ์ด๊ฑด ์šฐ์„  ์˜ˆ์‹œ๋ฅผ ๋ณด์—ฌ์ฃผ๊ณ  ๊ทธ ๋‹ค์Œ ์˜๋ฌธ์— ๋Œ€ํ•ด์„œ ๋งํ•ด๋ณด๊ณ ์ž ํ•œ๋‹ค.

// Before : ํ•˜๋‚˜์˜ ๋ฐ˜๋ณต๋ฌธ์— 2๊ฐ€์ง€ ์ผ์„ ํ•œ๋‹ค.// ๋ชฉํ‘œ : ๋ฐ˜๋ณต๋ฌธ์„ ์ชผ ๊ฐœ์„œ ํ•œ ๊ฐœ์˜ ๋ฐ˜๋ณต๋ฌธ์ด ํ•˜๋‚˜์˜ ์ฑ…์ž„์„ ์ˆ˜ํ–‰ํ•˜๊ฒŒ ํ•ด๋ณด์ž.let averageAge = 0;let totalSalary = 0;for (const p of people) {    averageAge += p.age;    totalSalary += p.salary;}averageAge = averageAge / people.length;// After : ํ•˜๋‚˜์˜ ๋ฐ˜๋ณต๋ฌธ์— 1๊ฐ€์ง€ ์ผ์„ ์ฒ˜๋ฆฌํ•œ๋‹ค.let totalSalary = 0;for (const p of people) {    totalSalary += p.salary;}let averageAge = 0;for (const p of people) {    averageAge += p.age;}averageAge = averageAge / people.length;

์œ„ ์ฝ”๋“œ๋ฅผ ๋ณด๋ฉด ๊ด€์‹ฌ์‚ฌ ๋ณ„๋กœ ์ฝ”๋“œ ์กฐ๊ฐ์ด ์กด์žฌํ•˜๋Š” ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ๋‹ค. ๊ทธ๋Ÿฌ๋ฉด ์ด ๋ฆฌํŒฉํ„ฐ๋ง์„ ๋งค์šฐ ๋ถˆํŽธํ•ดํ•˜๋Š” ์‚ฌ๋žŒ์ด ๋งŽ์„ ๊ฒƒ ๊ฐ™๋‹ค. ์™œ๋ƒํ•˜๋ฉด ๋ฐ˜๋ณต๋ฌธ์„ 2๋ฒˆ ์‹คํ–‰ํ•˜์—ฌ ๋ณ‘๋ชฉ ํ˜„์ƒ์„ ์œ ๋ฐœํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค(์ด ๊ธ€์„ ์“ฐ๋Š” ์ €๋„ ์ด๊ฑด ์ซŒ...). ์ €์ž๋Š” ๋ฆฌํŒฉํ„ฐ๋ง๊ณผ ์ตœ์ ํ™”๋ฅผ ๊ตฌ๋ถ„ํ•˜๋ผ๊ณ  ํ•œ๋‹ค. ์™œ๋ƒํ•˜๋ฉด ์ตœ์ ํ™”๋Š” ์ฝ”๋“œ๋ฅผ ๊น”๋”ํžˆ ์ •๋ฆฌํ•œ ํ›„์— ์ ์šฉํ•˜๋Š” ๊ฒƒ์ด๋ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๊น”๋”ํ•˜๊ฒŒ ์ •๋ฆฌ๋œ ํ›„์—๋Š” ์ตœ์ ํ™”๋กœ ๋‘ for๋ฌธ์„ ํ•ฉ์น˜๋Š” ๊ฒƒ์€ ์‹์€ ์ฃฝ ๋จน๊ธฐ๋ผ๊ณ  ํ•œ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๋ณ‘๋ชฉ ํ˜„์ƒ์œผ๋กœ ์ด์–ด์ง€๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋“œ๋ฌผ๊ธฐ ๋•Œ๋ฌธ์— ์˜คํžˆ๋ ค ๋ฐ˜๋ณต๋ฌธ ์ชผ๊ฐœ๊ธฐ๊ฐ€ ๋‹ค๋ฅธ ๋” ๊ฐ•๋ ฅํ•œ ์ตœ์ ํ™”๋ฅผ ์ ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๊ธธ์„ ์—ด์–ด์ฃผ๊ธฐ๋„ ํ•œ๋‹ค๊ณ  ํ•œ๋‹ค.

๋ฌผ๋ก  ๋‚˜๋„ ์ €์ž ์˜๊ฒฌ์— ๋™์˜ํ•˜์ง€๋งŒ, ๊ฐ„๋‹จํ•œ for๋ฌธ ์ฝ”๋“œ๋ผ๋ฉด ๊ตณ์ด ์ ์šฉํ•  ํ•„์š”๊ฐ€ ์žˆ์„๊นŒ ๋ผ๋Š” ์ƒ๊ฐ์ด ๋“ ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์ €๋Ÿฐ ์ฝ”๋“œ๊ฐ€ 1๊ฐœ์ผ ๋•Œ๋Š” ๋ณ‘๋ชฉ์ด ์—†๊ฒ ์ง€๋งŒ "์ด๊ณณ ์ €๊ณณ์—์„œ for๋ฌธ์ด ๋ชจ๋‘ ๋ถ„๋ฆฌ๋˜์–ด ์กด์žฌํ•œ๋‹ค๋ฉด ๊ทธ ๋ˆ„์ ์น˜๊ฐ€ ๋ณ‘๋ชฉ์œผ๋กœ ์ž‘์šฉํ•˜์ง€ ์•Š์„๊นŒ?"๋ผ๋Š” ์ƒ๊ฐ๋„ ๋“ ๋‹ค.

๋ฌผ๋ก  ์•„๋ž˜ ์˜ˆ์‹œ๋ฅผ ๋ณด๋ฉด ๊ฐ€๋…์„ฑ์ด ์ƒ๋‹นํžˆ ์ข‹๋‹ค๋Š” ์žฅ์ ์„ ๋ณผ ์ˆ˜ ์žˆ๊ธฐ๋Š” ํ•˜๋‹ค.

// Before : ๋ฐ˜๋ณต๋ฌธ ์ชผ๊ฐœ๊ธฐ ์ ์šฉ ์ „let youngest = people[0] ? people[0].age : Infinity;let totalSalary = 0;for (const p of people) {  totalSalary += p.salary;}for (const p of people) {  if (p.age < youngest) youngest = p.age;}return `youngestAge: ${youngest}, totalSalary: ${totalSalary}`;// After : ๋ฐ˜๋ณต๋ฌธ ์ชผ๊ฐœ๊ธฐ์— youngestAge์™€ totalSalary ํ•จ์ˆ˜๋กœ ์ถ”์ถœํ•˜๊ธฐ ๊นŒ์ง€ ์ ์šฉ.return `youngestAge: ${youngestAge()}, totalSalary: ${totalSalary()}`;function totalSalary() {  return people.reduce((total, p) => total + p.salary, 0);}function youngestAge() {  return Math.min(...people.map(p => p.age));}

1.8 ๋ฐ˜๋ณต๋ฌธ์„ ํŒŒ์ดํ”„๋ผ์ธ์œผ๋กœ ๋ฐ”๊พธ๊ธฐ

๊ฐ์ฒด ์ปฌ๋ ‰์…˜์„ ์ˆœํšŒํ•  ๋•Œ ๋ฐ˜๋ณต๋ฌธ์„ ๋งŽ์ด ์‚ฌ์šฉํ•  ๊ฒƒ์ด๋‹ค. ๊ทธ๋Ÿฐ๋ฐ ์–ธ์–ด๊ฐ€ ๋ฐœ์ „ํ•˜๋ฉด์„œ ์ด๋Ÿฌํ•œ ์ฒ˜๋ฆฌ ๊ณผ์ •์„ ํ•จ์ˆ˜ํ˜• ํ”„๋กœ๊ทธ๋ž˜๋ฐ์œผ๋กœ ์ผ๋ จ์˜ ์—ฐ์‚ฐ ๊ณผ์ •์œผ๋กœ ํ‘œํ˜„ํ•  ์ˆ˜ ์žˆ๋‹ค. ๋Œ€์ดˆ์ ์ธ ์ปฌ๋ ‰์…˜ ํ•จ์ˆ˜๊ฐ€ map๊ณผ filter๊ฐ€ ์žˆ๋‹ค. ๋…ผ๋ฆฌ๋ฅผ ํŒŒ์ดํ”„๋ผ์ธ์œผ๋กœ ํ‘œํ˜„ํ•œ๋‹ค๊ณ  ์ดํ•ดํ•˜๋ฉด ํ›จ์”ฌ ์‰ฌ์›Œ์ง„๋‹ค.

์˜ˆ์‹œ๋ฅผ ๋ณด๋ฉด ๋Œ€๋ถ€๋ถ„ ๋ฌด์Šจ ๋ง์ธ์ง€ ์•„์‹ค ๊ฒƒ ๊ฐ™๋‹ค.

// Before : ๋‹จ์ˆœ for๋ฌธ ์‚ฌ์šฉ// ๋ชฉํ‘œ : ์ปฌ๋ ‰์…˜ ํŒŒ์ดํ”„๋ผ์ธ์„ ์ด์šฉํ•˜์—ฌ ๋…ผ๋ฆฌ์˜ ํ๋ฆ„ ํŒŒ์•…์„ ์‰ฝ๊ฒŒ ๋งŒ๋“ค์–ด ๋ณด์ž.function acquireData(input) {  const lines = input.split('\n');  let firstLine = true;  const result = [];  for (const line of lines) { // line ๋ณ„ ์ˆœํšŒ    if (firstLine) {      firstLine = false; // 1๋ฒˆ์งธ line์ด๋ฉด ๋ฒ„๋ฆฌ๊ธฐ      continue;    }    if (line.trim() === '') continue; // trimํ•œ ๊ฒฝ์šฐ ๋นˆ ๋ผ์ธ์ด๋ฉด ๋ฒ„๋ฆฌ๊ธฐ    const record = line.split(','); // ,์„ ๊ตฌ๋ถ„์ž๋กœ ๋ ˆ์ฝ”๋“œ ๋ถ„๋ฆฌ    if (record[1].trim() === 'India') { // India์ธ ๋ ˆ์ฝ”๋“œ๋ฉด ๊ฒฐ๊ณผ์— ์ €์žฅ      result.push({ city: record[0].trim(), phone: record[2].trim() }); // ์ €์žฅ๋œ ๋ ˆ์ฝ”๋“œ์˜ ๋„์‹œ์™€ ์ „ํ™”๋ฒˆํ˜ธ๋งŒ ์ €์žฅ    }  }  return result;}// After : ๋‚ด์žฅ Array ํ•จ์ˆ˜ ์‚ฌ์šฉfunction acquireData(input) {  const lines = input.split('\n');  return lines      .slice  (1) // 1๋ฒˆ์งธ ๋ผ์ธ ๋ฒ„๋ฆฌ๊ธฐ      .filter (line   => line.trim() != '') // line์„ ํŠธ๋ฆผํ•œ ๊ฒฝ์šฐ ๋นˆ๋ผ์ธ์ด๋ฉด ๋ฒ„๋ฆฌ๊ธฐ      .map    (line   => line.split(',')) // ,์„ ๊ตฌ๋ถ„์ž๋กœ ๋ ˆ์ฝ”๋“œ ๋ถ„๋ฆฌ      .filter (fields => fields[1].trim() === 'India') // ๋ ˆ์ฝ”๋“œ๊ฐ€ India๊บผ๋ฉด ์ €์žฅ      .map    (fields => ({city: fields[0].trim(), phone: fields[2].trim()})); // ์ €์žฅ๋œ ๋ ˆ์ฝ”๋“œ์˜ ๋„์‹œ์™€ ์ „ํ™”๋ฒˆํ˜ธ๋งŒ ์ €์žฅ}

์œ„์™€ ๊ฐ™์ด ํŒŒ์ดํ”„๋ผ์ด๋‹ํ•˜์—ฌ ๋ฌด์Šจ ๋…ผ๋ฆฌ๋กœ ์ปฌ๋ ‰์…˜์„ ๊ฐ€๊ณตํ•˜๋Š”์ง€ ํ•œ๋ˆˆ์— ๋ณผ ์ˆ˜ ์žˆ๋‹ค.

๋งˆ๋ฌด๋ฆฌ

์ด๋ฒˆ ์žฅ์—์„œ๋Š” ์ฝ”๋“œ๋‚˜ ๊ธฐ๋Šฅ์˜ ์œ„์น˜ ๋ณ€๊ฒฝ์— ๋Œ€ํ•ด์„œ ์ด์•ผ๊ธฐ ํ–ˆ๋‹ค. ๋‹ค ์˜ˆ์‹œ๋“ค์„ ๋ณด๋ฉด ์‹œ์‹œํ• ๊ฑฐ๋ผ ์ƒ๊ฐํ•œ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๋ฌด์˜์‹ ์ค‘์— ํ•˜๊ณ ์žˆ๋Š” ๋ฆฌํŒฉํ„ฐ๋ง ๋ฐฉ๋ฒ•๋„ ๋งŽ์„ ๊ฑฐ๋ผ๊ณ  ์ƒ๊ฐํ•œ๋‹ค. ํ•˜์ง€๋งŒ ๋ฆฌํŒฉํ„ฐ๋ง ์ฑ…์—์„œ๋Š” ๋ฆฌํŒฉํ„ฐ๋ง ๋ฐฉ๋ฒ•์˜ ์ ˆ์ฐจ์— ๋”ฐ๋ผ ํ•˜๋‚˜์”ฉ ์„ค๋ช…ํ•ด์ค€๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๊ทธ ์„ค๋ช…์—์„œ ๊ฐ ๋‹จ๊ณ„์—์„œ ๋ฌด์—‡์„ ๊ณ ๋ คํ•ด์•ผํ• ์ง€ ์„ค๋ช…์ด ํ•จ๊ป˜ ์žˆ๋‹ค. ๊ทธ๋ž˜์„œ ๊ทธ ๊ณ ๋ คํ•ด์•ผํ•  ์ ๋“ค์„ ํ•œ๋ฒˆ ์ฏค ๋ณด๊ณ  ๋А๊ผˆ์œผ๋ฉด ๋‚˜์ค‘์— ๋ฆฌํŒฉํ„ฐ๋งํ•  ๋•Œ ๋” ๋„์›€์ด ๋  ๊ฒƒ์ด๋ผ๋Š” ๋ง‰์—ฐํ•œ ์ƒ๊ฐ์„ ํ•œ๋‹ค.