๐Ÿ“– ์šฐํ…Œ์ฝ” 7๊ธฐ ํ”„๋ฆฌ์ฝ”์Šค 1์ฃผ์ฐจ ํšŒ๊ณ 

ByEunwoo
woowacourse

๐ŸŽฏ์ฃผ์ œ

์ž…๋ ฅํ•œ ๋ฌธ์ž์—ด์—์„œ ์ˆซ์ž๋ฅผ ์ถ”์ถœํ•˜์—ฌ ๋”ํ•˜๋Š” ๊ณ„์‚ฐ๊ธฐ๋ฅผ ๊ตฌํ˜„ํ•œ๋‹ค.

  • ์‰ผํ‘œ(,) ๋˜๋Š” ์ฝœ๋ก (:)์„ ๊ตฌ๋ถ„์ž๋กœ ๊ฐ€์ง€๋Š” ๋ฌธ์ž์—ด์„ ์ „๋‹ฌํ•˜๋Š” ๊ฒฝ์šฐ ๊ตฌ๋ถ„์ž๋ฅผ ๊ธฐ์ค€์œผ๋กœ ๋ถ„๋ฆฌํ•œ ๊ฐ ์ˆซ์ž์˜ ํ•ฉ์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค.
    • ์˜ˆ: "" => 0, "1,2" => 3, "1,2,3" => 6, "1,2:3" => 6
  • ์•ž์˜ ๊ธฐ๋ณธ ๊ตฌ๋ถ„์ž(์‰ผํ‘œ, ์ฝœ๋ก ) ์™ธ์— ์ปค์Šคํ…€ ๊ตฌ๋ถ„์ž๋ฅผ ์ง€์ •ํ•  ์ˆ˜ ์žˆ๋‹ค. ์ปค์Šคํ…€ ๊ตฌ๋ถ„์ž๋Š” ๋ฌธ์ž์—ด ์•ž๋ถ€๋ถ„์˜ "//"์™€ "\n" ์‚ฌ์ด์— ์œ„์น˜ํ•˜๋Š” ๋ฌธ์ž๋ฅผ ์ปค์Šคํ…€ ๊ตฌ๋ถ„์ž๋กœ ์‚ฌ์šฉํ•œ๋‹ค.
    • ์˜ˆ๋ฅผ ๋“ค์–ด "//;\n1;2;3"๊ณผ ๊ฐ™์ด ๊ฐ’์„ ์ž…๋ ฅํ•  ๊ฒฝ์šฐ ์ปค์Šคํ…€ ๊ตฌ๋ถ„์ž๋Š” ์„ธ๋ฏธ์ฝœ๋ก (;)์ด๋ฉฐ, ๊ฒฐ๊ณผ ๊ฐ’์€ 6์ด ๋ฐ˜ํ™˜๋˜์–ด์•ผ ํ•œ๋‹ค.
  • ์‚ฌ์šฉ์ž๊ฐ€ ์ž˜๋ชป๋œ ๊ฐ’์„ ์ž…๋ ฅํ•  ๊ฒฝ์šฐ "[ERROR]"๋กœ ์‹œ์ž‘ํ•˜๋Š” ๋ฉ”์‹œ์ง€์™€ ํ•จ๊ป˜ Error๋ฅผ ๋ฐœ์ƒ์‹œํ‚จ ํ›„ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์€ ์ข…๋ฃŒ๋˜์–ด์•ผ ํ•œ๋‹ค.

๐Ÿ˜– ์–ด๋ ค์› ๋˜ ์ 

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

๋˜ํ•œ, ํ…Œ์ŠคํŠธ์ฝ”๋“œ์— ๋Œ€ํ•ด์„œ๋„ ๋ฐฐ์šธ ์ˆ˜ ์žˆ์—ˆ๋‹ค. ์ด ์šฐํ…Œ์ฝ” ํ”„๋ฆฌ์ฝ”์Šค์—์„œ๋Š” Jest๋ฅผ ์ด์šฉํ•˜์—ฌ ํ…Œ์ŠคํŠธ์ฝ”๋“œ๋ฅผ ์งฐ๋‹ค. ์ถ”๊ฐ€์ ์œผ๋กœ TDD ๊ฐœ๋…์— ๋Œ€ํ•ด์„œ๋„ ์ž์„ธํžˆ ์•Œ๊ฒŒ ๋˜์—ˆ๋‹ค.

์š”๊ตฌ์‚ฌํ•ญ์„ ๊ผผ๊ผผํ•˜๊ฒŒ ์ž˜ ํ™•์ธํ•˜์žโ—

๊ธฐ๋Šฅ ๋ชฉ๋ก ์ž‘์„ฑ

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



๐Ÿ“– ๋ฐฐ์› ๋˜ ์ 

1. ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ class ์˜ ํ•„์ˆ˜ ๊ฐœ๋…

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์—์„œ ํด๋ž˜์Šค(Class)๋Š” ๊ฐ์ฒด ์ง€ํ–ฅ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์˜ ํ•ต์‹ฌ ๊ฐœ๋…์ด๋‹ค.
ES6์—์„œ ๋„์ž…๋œ ์ดํ›„, ํด๋ž˜์Šค๋Š” ๋” ์ง๊ด€์ ์ด๊ณ  ๊ตฌ์กฐํ™”๋œ ์ฝ”๋“œ ์ž‘์„ฑ์„ ๊ฐ€๋Šฅํ•˜๊ฒŒ ๋˜์—ˆ๋‹ค.

1. ํด๋ž˜์Šค ์„ ์–ธ

ํด๋ž˜์Šค๋Š” class ํ‚ค์›Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์„ ์–ธ.

class Person {
  // ํด๋ž˜์Šค ๋‚ด์šฉ
}

2. ์ƒ์„ฑ์ž (Constructor)

์ƒ์„ฑ์ž๋Š” ํด๋ž˜์Šค์˜ ์ธ์Šคํ„ด์Šค๊ฐ€ ์ƒ์„ฑ๋  ๋•Œ ์ž๋™์œผ๋กœ ํ˜ธ์ถœ๋˜๋Š” ํŠน๋ณ„ํ•œ ๋ฉ”์„œ๋“œ์ด๋‹ค.

class Person {
  constructor(name, age) {
    this.name = name;
    this.age = age;
  }
}
 
const person = new Person('ํ™๊ธธ๋™', 30);
console.log(person.name); // ์ถœ๋ ฅ: ํ™๊ธธ๋™

3. ๋ฉ”์„œ๋“œ (Methods)

ํด๋ž˜์Šค ๋‚ด์—์„œ ํ•จ์ˆ˜๋ฅผ ์ •์˜ํ•˜์—ฌ ๋ฉ”์„œ๋“œ๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค.

class Person {
  constructor(name, age) {
    this.name = name;
    this.age = age;
  }
 
  sayHello() {
    console.log(`์•ˆ๋…•ํ•˜์„ธ์š”, ์ œ ์ด๋ฆ„์€ ${this.name}์ž…๋‹ˆ๋‹ค.`);
  }
}
 
const person = new Person('ํ™๊ธธ๋™', 30);
person.sayHello(); // ์ถœ๋ ฅ: ์•ˆ๋…•ํ•˜์„ธ์š”, ์ œ ์ด๋ฆ„์€ ํ™๊ธธ๋™์ž…๋‹ˆ๋‹ค.

this ๊ฐœ๋…

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์—์„œ this๋Š” ํ˜„์žฌ ์‹คํ–‰ ์ปจํ…์ŠคํŠธ๋ฅผ ๊ฐ€๋ฆฌํ‚ค๋Š” ํ‚ค์›Œ๋“œ์ด๋‹ค.
ํด๋ž˜์Šค ๋‚ด์—์„œ this๋Š” ์ฃผ๋กœ ํ˜„์žฌ ์ธ์Šคํ„ด์Šค๋ฅผ ์ฐธ์กฐํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋œ๋‹ค.

ํด๋ž˜์Šค์˜ ๋ฉ”์„œ๋“œ ๋‚ด์—์„œ this๋Š” ํ•ด๋‹น ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•œ ๊ฐ์ฒด๋ฅผ ๊ฐ€๋ฆฌํ‚จ๋‹ค.

class Person {
  constructor(name) {
    this.name = name;
  }
 
  greet() {
    console.log(`์•ˆ๋…•ํ•˜์„ธ์š”, ${this.name}์ž…๋‹ˆ๋‹ค.`);
  }
}
 
const person = new Person('๊น€์ฒ ์ˆ˜');
person.greet(); // ์ถœ๋ ฅ: ์•ˆ๋…•ํ•˜์„ธ์š”, ๊น€์ฒ ์ˆ˜์ž…๋‹ˆ๋‹ค.

ํ…Œ์ŠคํŠธ์ฝ”๋“œ (TDD)

์ด๋ฒˆ ๊ณผ์ œ์—์„œ ํ…Œ์ŠคํŠธ ์ฝ”๋“œ๋Š” ๋ฌธ์ž์—ด ๊ณ„์‚ฐ๊ธฐ(String Calculator)๋ฅผ ํ…Œ์ŠคํŠธํ•˜๋Š” ๊ฒƒ์ด ์ฃผ์–ด์กŒ๋‹ค.

Jest๋ฅผ ์‚ฌ์šฉํ•œ ํ…Œ์ŠคํŠธ ํ”„๋ ˆ์ž„์›Œํฌ๋ฅผ ์‚ฌ์šฉํ•˜์˜€๋‹ค.
์ž…๋ ฅ์„ ๋ชจํ‚น(mocking)ํ•˜๊ณ  ์ถœ๋ ฅ์„ ์ŠคํŒŒ์ด(spy)ํ•˜์—ฌ ํ…Œ์ŠคํŠธ๋ฅผ ์ˆ˜ํ–‰ํ•˜์˜€๊ณ 
๋‹ค์–‘ํ•œ ์ž…๋ ฅ ์‹œ๋‚˜๋ฆฌ์˜ค์— ๋Œ€ํ•œ ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค๋ฅผ ํฌํ•จํ•˜๊ณ  ์žˆ๋‹ค.
์˜ˆ๋ฅผ๋“ค์–ด,
์ฃผ์š” ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค ์œ ํ˜•:

๊ธฐ๋ณธ ๊ตฌ๋ถ„์ž๋ฅผ ์‚ฌ์šฉํ•œ ๊ณ„์‚ฐ (์‰ผํ‘œ, ์ฝœ๋ก )
์ปค์Šคํ…€ ๊ตฌ๋ถ„์ž ์‚ฌ์šฉ
์˜ˆ์™ธ ์ฒ˜๋ฆฌ (์Œ์ˆ˜, ์ˆซ์ž๊ฐ€ ์•„๋‹Œ ์ž…๋ ฅ, ์ž˜๋ชป๋œ ๊ตฌ๋ถ„์ž ์‚ฌ์šฉ ๋“ฑ)
๋นˆ ์ž…๋ ฅ ์ฒ˜๋ฆฌ
๋‹ค์–‘ํ•œ ์—๋Ÿฌ ์ƒํ™ฉ ํ…Œ์ŠคํŠธ

๋“ฑ์„ ํ…Œ์ŠคํŠธํ•ด๋ณผ ์ˆ˜ ์žˆ์—ˆ๋‹ค.

์ด ํ…Œ์ŠคํŠธ ์ฝ”๋“œ๋Š” TDD(Test-Driven Development) ๋ฐฉ์‹์ด๋‹ค. ๋ฌธ์ž์—ด ์ž…๋ ฅ์„ ๋ฐ›์•„ ๊ตฌ๋ถ„์ž๋กœ ๋ถ„๋ฆฌํ•˜๊ณ  ์ˆซ์ž๋“ค์˜ ํ•ฉ์„ ๊ณ„์‚ฐํ•˜๋Š” ๊ธฐ๋Šฅ์„ ํ…Œ์ŠคํŠธํ•˜์˜€๋‹ค.
์ด ํ…Œ์ŠคํŠธ ์Šค์œ„ํŠธ๋Š” ์ž…๋ ฅ ์œ ํšจ์„ฑ ๊ฒ€์‚ฌ, ๋‹ค์–‘ํ•œ ๊ตฌ๋ถ„์ž ์ฒ˜๋ฆฌ, ์˜ˆ์™ธ ์ƒํ™ฉ ์ฒ˜๋ฆฌ ๋“ฑ ๋ฌธ์ž์—ด ๊ณ„์‚ฐ๊ธฐ์˜ ์ฃผ์š” ๊ธฐ๋Šฅ๊ณผ Edgy case๋ฅผ ํฌ๊ด„์ ์œผ๋กœ ๋‹ค๋ฃจ์—ˆ๋‹ค.

TDD?

TDD๋Š” ์†Œํ”„ํŠธ์›จ์–ด ๊ฐœ๋ฐœ ๋ฐฉ๋ฒ•๋ก ์œผ๋กœ, ์‹ค์ œ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๊ธฐ ์ „์— ํ…Œ์ŠคํŠธ ์ฝ”๋“œ๋ฅผ ๋จผ์ € ์ž‘์„ฑํ•˜๋Š” ๋ฐฉ์‹์ด๋‹ค. ์ด ๋ฐฉ๋ฒ•์€ ์ฝ”๋“œ์˜ ํ’ˆ์งˆ์„ ํ–ฅ์ƒ์‹œํ‚ค๊ณ , ๋ฒ„๊ทธ๋ฅผ ์ค„์ด๋ฉฐ, ๊ฐœ๋ฐœ ํ”„๋กœ์„ธ์Šค๋ฅผ ๋” ํšจ์œจ์ ์œผ๋กœ ๋งŒ๋“œ๋Š” ๊ฒƒ์„ ๋ชฉํ‘œ๋กœ ํ•œ๋‹ค.


2. ํด๋”์™€ ํŒŒ์ผ ๊ธฐ๋Šฅ๋ณ„๋กœ ๋ช…๋žตํ•˜๊ฒŒ

์ด๋ฒˆ ๊ณผ์ œ์—์„œ ์‚ฌ์šฉ๋œ ํด๋”๊ตฌ์กฐ์ด๋‹ค.

๐Ÿ“ฆsrc
 โ”ฃ ๐Ÿ“‚constants // ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ์‚ฌ์šฉ๋˜๋Š” ์ƒ์ˆ˜๋“ค์„ ๋ชจ์•„๋†“์€ ํด๋”
 โ”ƒ โ”ฃ ๐Ÿ“œerror.js // ์—๋Ÿฌ ๋ฉ”์‹œ์ง€ ๊ด€๋ จ ์ƒ์ˆ˜ ์ •์˜
 โ”ƒ โ”— ๐Ÿ“œmessage.js // ์‚ฌ์šฉ์ž ์ธํ„ฐํŽ˜์ด์Šค ๋ฉ”์‹œ์ง€ ๊ด€๋ จ ์ƒ์ˆ˜ ์ •์˜
 โ”ฃ ๐Ÿ“œApp.js // ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๋ฉ”์ธ ๋กœ์ง์„ ๊ด€๋ฆฌํ•˜๋Š” ํด๋ž˜์Šค
 โ”ฃ ๐Ÿ“œCalculator.js // ๋ฌธ์ž์—ด ๊ณ„์‚ฐ ๋กœ์ง์„ ๋‹ด๋‹นํ•˜๋Š” ํด๋ž˜์Šค
 โ”ฃ ๐Ÿ“œindex.js // ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์ง„์ž…์  (entry point)
 โ”— ๐Ÿ“œInput.js // ์‚ฌ์šฉ์ž ์ž…๋ ฅ์„ ์ฒ˜๋ฆฌํ•˜๋Š” ํด๋ž˜์Šค

์ด์— ๋Œ€ํ•ด์„œ MVC ํŒจํ„ด์ด๋ผ๋Š” ๊ฒƒ์ด ์žˆ๋‹ค.

์ฝ”๋“œ๊ฐ€ ๋ณดํ†ต ๋งŽ์•„์ง€๋ฉด ์–ด๋–ค ์ฝ”๋“œ์ธ์ง€ ํŒŒ์•…ํ•˜๊ธฐ ํž˜๋“ค๊ณ  ์œ ์ง€๋ณด์ˆ˜๊ฐ€ ํž˜๋“ค๋‹ค.
๊ทธ๋ž˜์„œ ํ”„๋กœ๊ทธ๋ž˜๋จธ๋“ค์ด ํŒจํ„ด๋“ค๊ณผ ๊ทœ์น™์„ฑ๋“ค์„ ์ •๋ฆฌํ•œ ๊ฒƒ์ด MVC ํŒจํ„ด์ด๋‹ค.

์ฆ‰, MVCํŒจํ„ด์€ ์œ ์ง€๋ณด์ˆ˜๋ฅผ ์–ด๋–ป๊ฒŒ ํ•˜๋ฉด ํŽธํ•˜๊ฒŒ ํ•  ์ˆ˜ ์žˆ์„๊นŒ๋ฅผ ๊ณ ๋ฏผํ•˜๋‹ค๊ฐ€ ๋งŒ๋“ค์–ด์ง„ ํŒจํ„ด ์ค‘ ํ•˜๋‚˜์ด๋‹ค.


3. MVC ํŒจํ„ด

Model: ๋ฐ์ดํ„ฐ์™€ ๊ด€๋ จ๋œ ๋ถ€๋ถ„

  • ๋ฐ์ดํ„ฐ์™€ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์„ ๋‹ด๋‹น
  • ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์ƒํƒœ๋ฅผ ๊ด€๋ฆฌํ•˜๊ณ  ๋ฐ์ดํ„ฐ๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ๊ทœ์น™์„ ์ •์˜
  • View๋‚˜ Controller์— ๋Œ€ํ•ด ์•Œ์ง€ ๋ชปํ•˜๋ฉฐ ๋…๋ฆฝ์ ์œผ๋กœ ๋™์ž‘ํ•จ

View: ์‚ฌ์šฉ์žํ•œํ…Œ ๋ณด์—ฌ์ง€๋Š” ๋ถ€๋ถ„

  • ์‚ฌ์šฉ์ž ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๋‹ด๋‹น
  • Model์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์‹œ๊ฐ์ ์œผ๋กœ ํ‘œํ˜„
  • ์‚ฌ์šฉ์ž์˜ ์ž…๋ ฅ์„ ๋ฐ›์•„ Controller์— ์ „๋‹ฌ
  • Model์˜ ์ƒํƒœ ๋ณ€ํ™”๋ฅผ ๋ฐ˜์˜ํ•˜์—ฌ ํ™”๋ฉด์„ ์—…๋ฐ์ดํŠธ

Controller: Model๊ณผ View๋ฅผ ์ด์–ด์ฃผ๋Š” ๋ถ€๋ถ„

  • Model๊ณผ View ์‚ฌ์ด์˜ ์ค‘์žฌ์ž ์—ญํ• ์„ ํ•จ
  • ์‚ฌ์šฉ์ž์˜ ์ž…๋ ฅ์„ ๋ฐ›์•„ ํ•ด์„ํ•˜๊ณ , Model์„ ์กฐ์ž‘ํ•˜๊ฑฐ๋‚˜ View๋ฅผ ์—…๋ฐ์ดํŠธ ํ•จ
  • ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ํ๋ฆ„์„ ์ œ์–ด

MVC๋ฅผ ์ง€ํ‚ค๋ฉด์„œ ์ฝ”๋”ฉํ•˜๋Š” ๋ฐฉ๋ฒ•

1. Model์€ Controller์™€ View์— ์˜์กดํ•˜์ง€ ์•Š์•„์•ผ ํ•œ๋‹ค.

(Model ๋‚ด๋ถ€์— Controller์™€ View์— ๊ด€๋ จ๋œ ์ฝ”๋“œ๊ฐ€ ์žˆ์œผ๋ฉด ์•ˆ๋œ๋‹ค.)

2. View๋Š” Model์—๋งŒ ์˜์กดํ•˜๊ณ , Controller์—๋Š” ์˜์กดํ•˜๋ฉด ์•ˆ๋œ๋‹ค.

(View ๋‚ด๋ถ€์— Model์˜ ์ฝ”๋“œ๋งŒ ์žˆ์„ ์ˆ˜ ์žˆ๊ณ , Controller์˜ ์ฝ”๋“œ๊ฐ€ ์žˆ์œผ๋ฉด ์•ˆ๋œ๋‹ค.)

3. View๊ฐ€ Model๋กœ๋ถ€ํ„ฐ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ›์„ ๋•Œ๋Š”, ์‚ฌ์šฉ์ž๋งˆ๋‹ค ๋‹ค๋ฅด๊ฒŒ ๋ณด์—ฌ์ฃผ์–ด์•ผ ํ•˜๋Š” ๋ฐ์ดํ„ฐ์— ๋Œ€ํ•ด์„œ๋งŒ ๋ฐ›์•„์•ผ ํ•œ๋‹ค.

4. Controller๋Š” Model๊ณผ View์— ์˜์กดํ•ด๋„ ๋œ๋‹ค.

(Controller ๋‚ด๋ถ€์—๋Š” Model๊ณผ View์˜ ์ฝ”๋“œ๊ฐ€ ์žˆ์„ ์ˆ˜ ์žˆ๋‹ค.)

5. View๊ฐ€ Model๋กœ๋ถ€ํ„ฐ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ›์„ ๋•Œ, ๋ฐ˜๋“œ์‹œ Controller์—์„œ ๋ฐ›์•ผ์•„ ํ•œ๋‹ค.




์‚ฌ์ง„ ์ถœ์ฒ˜: ์šฐํ…Œ์ฝ”

Posted inwoowacourse
Written byEunwoo