๐ ์ฐํ ์ฝ 7๊ธฐ ํ๋ฆฌ์ฝ์ค 1์ฃผ์ฐจ ํ๊ณ
๐ฏ์ฃผ์
์ ๋ ฅํ ๋ฌธ์์ด์์ ์ซ์๋ฅผ ์ถ์ถํ์ฌ ๋ํ๋ ๊ณ์ฐ๊ธฐ๋ฅผ ๊ตฌํํ๋ค.
- ์ผํ(,) ๋๋ ์ฝ๋ก (:)์ ๊ตฌ๋ถ์๋ก ๊ฐ์ง๋ ๋ฌธ์์ด์ ์ ๋ฌํ๋ ๊ฒฝ์ฐ ๊ตฌ๋ถ์๋ฅผ ๊ธฐ์ค์ผ๋ก ๋ถ๋ฆฌํ ๊ฐ ์ซ์์ ํฉ์ ๋ฐํํ๋ค.
- ์: "" => 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์์ ๋ฐ์ผ์ ํ๋ค.
์ฌ์ง ์ถ์ฒ: ์ฐํ ์ฝ