CODE KATA๋, ํ๋ก ์ํํ๋ ์ธ์ธํ ์๋ฌด ํจํด์ด์, ํ์ต์๊ฐ ํน์ ํ ๊ธฐ๋ฒ์ ๋ฐ๋ณต ํ์ต์ด ์๋ ์์ฐ์ค๋ฌ์ด ๋ฐฉ์์ผ๋ก ์ฒด๊ณ์ ์ธ ์ ๊ทผ์ ํตํด ์ฒด๋ํ๋๋ก ํ๋ KATA(ๅฝข)๋ฅผ ์ฝ๋ฉ์ ์ ๋ชฉ์ํจ ๊ฒ์ด๋ค.
What makes a good practice session? You need time without interruptions, and a simple thing you want to try. You need to try it as many times as it takes, and be comfortable making mistakes. You need to look for feedback each time so you can work to improve. There needs to be no pressure: this is why it is hard to practice in a project environment. it helps to keep it fun: make small steps forward when you can. Finally, youโll recognize a good practice session because youโll came out of it knowing more than when you went in.
-codekata.com-
์ด์ ์งํํ๋ ์ฝ๋์ ์์ฑ ๊ฒฐ๊ณผ ์ค ๋ฒ๊ทธ๋ก ์ถ์ ๋๋ ๊ฒฐ๊ณผ๊ฐ ์์๋ค. ์ด์ ๋ํด ์ ๋ค๊ธฐ ์ ๋ ์ข์ ๋ฐฉ๋ฒ์ด ์์๊น ์๊ฐํ๋ ๋๋ ์ฐ์ฐํ ์ฝ์๋ CODE KATA์ ์ฒซ๋ฒ์งธ ๋์์ผ๋ก ์ด ๋ฒ๊ทธ๋ฅผ ์ค์๋ฅผ ๊ฐ๋ดํ๊ณ , ์๊ฐ์ ๋ค์ฌ์๋ผ๋ ํด๊ฒฐํด๋ณด๊ธฐ๋ก ๊ฒฐ์ ํ๋ค.
ํด๋น ๋ฒ๊ทธ๋ 2๊ฐ ์ด์์ธ ์ ์ n๊ฐ์ To Do List๊ฐ ์กด์ฌํ๋ ๊ฒฝ์ฐ, ๋ง์ง๋ง ์์๊ฐ ์๋ <li>
๋ฅผ ์ญ์ ํ๊ณ , ์๋ก์ด To Do List๋ฅผ ์ถ๊ฐํ ๊ฒฝ์ฐ, id๊ฐ n์ธ To Do List๊ฐ ์ค๋ณต๋๊ณ , ๋ ์ค ํ๋์ delBtn
์ clickํ์ฌ ์ญ์ ํ๋ ๊ฒฝ์ฐ ๊ทธ ๋์ด ๋์์ ์ญ์ ๋๋ ํ์์ด์๋ค.
์๋ก๊ณ ์นจ์ ํ๋ ๊ฒฝ์ฐ ๋ค์ ์ ์์ ์ผ๋ก id๊ฐ ์ ๋ ฌ๋์ง๋ง, momentum์ด๋ผ๋ ํ๋ก์ ํธ์ ํน์ฑ์ ๋งค๋ฒ reload๋ฅผ ํ์ง ์๊ณ ๋ ์ ์์ ์ผ๋ก id๋ฅผ ์ ๋ ฌํ๋ ๋ฐฉ๋ฒ์ด ํ์ํ๋ค.
ํด๋น ๋ฒ๊ทธ๋ฅผ ์์ ํ๊ธฐ ์ํด ์ฒ์์ผ๋ก ์ฌ์ฉํ ๋ฐฉ๋ฒ์ comment์ ์๋ ๋ฐฉ๋ฒ์ด๋ค.
ํด๋น ๋ฐฉ๋ฒ๋๋ก ์งํํ๋ฉด, ๋ช
๋ฐฑํ id๊ฐ ์ค๋ณต๋๋ ์ผ์ ๋ฐ์ํ์ง ์์ง๋ง,
์ด์ ๊ฐ์ด ์๋ก๊ณ ์นจ์ ํ๊ธฐ์ ๊น์ง๋ ์์์ id๊ฐ ๋ณ๊ฐ๋ก ๊ณ์ ์ปค์ง์ ํ์ธํ ์ ์๋ค. id๊ฐ ์ค๋ณต๋์ง ์๋๋ค๋ ์ ์์ ํ๋ฒ์ ๋๊ฐ์ง <li>
๊ฐ ์ญ์ ๋๋ ๋ฒ๊ทธ๋ ์์ ๋ ๊ฒ์ด ๋ง์ง๋ง, ํ๋ก์ ํธ์ ์์ด ์ถ๊ฐ์ ์ธ ๊ธฐ๋ฅ์ด ๊ตฌํ๋ ๊ฒฝ์ฐ (์๋ฅผ ๋ค์ด, "1,4,5๋ฒ์งธ ํญ๋ชฉ์ด ๋จ์์ต๋๋ค"๋ฅผ ์ถ๋ ฅํ๋ ๊ธฐ๋ฅ) ์๋ก๊ณ ์นจ ์์ด id์ ์์๊ฐ ์ผ์นํ์ง ์๋๋ค๋ ๋ฌธ์ ๊ฐ ์๋ค.
์์์ id๋ฅผ ์๋ก๊ณ ์นจ ์์ด ์ผ์น์ํค๊ณ ์ถ๋ค๋ ๋ง์์ด ์๊ฒจ ์ด๋ฐ ์ ๋ฐ ๋ฐฉ๋ฒ์ ์ฌ์ฉํด๋ณด์๋ค. ๊ฐ์ฅ ๋จผ์ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ์ forEach() ํจ์๋ฅผ ํตํ id ์์ ์ด์๋ค.
const cleanToDos = toDos.filter(function(toDo){
return toDo.id !== parseInt(li.id);
})
toDos = cleanToDos;
saveToDos();
๋ค์๊ณผ ๊ฐ์ ์ต์ด์ ์ฝ๋์์, forEach()
๋ฅผ ํตํด ๊ฐ๊ฐ์ id
๋ฅผ ์์๋๋ก ์ฌ์ง์ ํด์ฃผ๋ฉด ๋์ง ์์๊น, ํ๊ณ ์๊ฐํ์๋ค. ํน์, paintToDo()
๋ฅผ ๋ค์ ์คํ์์ผ์ฃผ๋ฉด ์ด๋จ๊น ์๊ฐ์ ํ์ผ๋, To Do List๊ฐ ์ค๋ณต์ผ๋ก ์์ฑ๋๋ ๊ฒฐ๊ณผ๊ฐ ๋ฐ์ํ๋ค.
const cleanToDos = toDos.filter(function(toDo){
return toDo.id !== parseInt(li.id);
})
idNum = 1;
cleanToDos.forEach(function(toDo){
toDo.id = idNum;
idNum += 1;
}
toDos = cleanToDos;
saveToDos();
๋ค์๊ณผ ๊ฐ์ด ์ฝ๋๋ฅผ ์์ ํ์, id
๋ ์ ์์ ์ผ๋ก ๋ณํ์ด ๋์์ผ๋, ๋๋ ค ์ญ์ ๊ธฐ๋ฅ์ด ์๋๋์ง ์์๋ค. ์ด์ ๋ ํด๋น toDo
์ id
๋ ๋ฐ๋์์ผ๋, <li>
์ id
๋ ๋ฐ๋์ง ์์๊ธฐ ๋๋ฌธ์, ์๋ก์ id
๊ฐ ์ด๊ธ๋์ filter()
๋ถ๋ถ์ด ์ ์์ ์ผ๋ก ์๋ํ์ง ์์ ์๋ฑํ To Do๊ฐ ์ญ์ ๋๊ฑฐ๋, ์๋ฌด๊ฒ๋ ์ญ์ ๋์ง ์๋ ํ์์ด ๋ฐ์ํ๋ค.
<li>
์ ๋ํ ์ ๊ทผ?๊ทธ๋ ๋ค๋ฉด forEach()
์์ ๊ฐ๊ฐ์ toDo.id
๋ฅผ ์์ ํด์ฃผ๋ฉด์, ํด๋น <li>
์ id
๋ ์์ ํด์ฃผ๋ฉด ๋๊ฒ ๋ค. ํ์ง๋ง ์ด๋ป๊ฒ? ๊ฐ๊ฐ์ <li>
๋ paintToDo()
์์ createElement
๋ฅผ ํตํด ์์ฑ๋์๊ณ , ํด๋น ๊ธฐ๋ฅ์ ๋ค๋ฅธ ํจ์๋ก Divideํ์ฌ ์ถ๊ฐ๋ก ๋ชจ๋ํ ํ๊ฑฐ๋, <li>
๋ฅผ ์์ฑํ ๋, class
๋ฅผ ๋ถ์ฌํ์ฌ ๊ฐ๊ฐ์ <li>
์ ๋ํด ์ ๊ทผํ๋ ๋ฐฉ์์ ์๊ฐํ๋ค.
ํ์ง๋ง ๋ ๋ฐฉ์ ๋ชจ๋, ์ด๋ก ์์ผ๋ก ์คํ์ ์ฎ๊ธฐ๋ฉด ๊ฐ๋ฅํ ๊ฒ์ด๋ผ๊ณ ๊ฒฐ๋ก ๋ด๋ ธ์ง๋ง, ํ๋ก๊ทธ๋จ ์์ฒด์ ํฐ ํ์ ๋ณํ๊ฐ ํ์ํ ๊ฒ์ผ๋ก ์์๋์ด ์ตํ์ ๋ณด๋ฃจ๋ก์ ๋จ๊ฒจ๋๊ธฐ๋ก ํ๋ค.
๊ธฐ์กด์ ์ฝ๋์์, toDoList.removeChild(li)
๋ฅผ ํตํด, click์ด ๋ฐ์ํ target์ <li>
๋ฅผ ์ญ์ ํ๋ค. ์ฌ๊ธฐ์, ์ด์ฐจํผ toDo
๋ LS์ ์ ์ฅ๋ ๋ฐ์ดํฐ์ array์ด๊ณ , <li>
๋ค์ ๊ฐ๊ฐ์ ๋ฐ์ดํฐ๋ค์ ๋ด๋ HTML tag๋ผ๋ฉด, ๋จ์ง click๋ ํญ๋ชฉ๋ง ์ญ์ ํ๋ ๊ฒ์ด ์๋๋ผ ๋ชจ๋ ํญ๋ชฉ๋ค์ ์ญ์ ํ ํ, ์ญ์ ํด์ผํ๋ ๋ฐ์ดํฐ๋ฅผ filter()
๋ก ๊ฑธ๋ฌ๋ธ ํ, ํด๋น ๋ฐ์ดํฐ๋ฅผ ํ ๋๋ก forEach()
์ ๋ด๋ถ์์ toDo.id
์ paintToDo(toDo.text)
๋ฅผ ์คํํ์ฌ ์๋ก ์ถ๋ ฅํด์ฃผ๋ฉด ์๋ก๊ณ ์นจ ์์ด๋ ์์์ id๊ฐ ํญ์ ์ผ์นํ ๊ฒ์ด๋ค.
๊ทธ๋ฌ๊ธฐ ์ํด์๋ ํน์ parentNode
์ ๋ชจ๋ child๋ฅผ ์ญ์ ํ๋ ๋ฐฉ๋ฒ์ ์์์ผ ํ๋ค.
MDN removeChild()์์ ์๋์ ๊ฐ์ ๋ด์ฉ์ ํ์ธํ ์ ์๋ค.
To remove all children from an element:
let element = document.getElementById("top"); while (element.firstChild) { element.removeChild(element.firstChild); }
์ด๋ฅผ ํตํด, ๋ค์๊ณผ ๊ฐ์ด ์ฝ๋๋ฅผ ์์ฑํ๋ฉด, delBtn
์ด click๋๋ฉด ๋ชจ๋ <li>
๊ฐ ์ญ์ ๋๋ค.
while(toDoList.firstChild) {
toDoList.removeChild(toDoList.firstChild);
}
๋ค์ ์ด๋ฐ์ ์์ด๋์ด๋ก ๋์์์ forEach()
๋ฅผ ์ฌ์ฉํ ์ ์๋ ํ๊ฒฝ์ด ๊ฐ์ถฐ์ก๋ค. ๊ธฐ์กด์ ํ๋ก๊ทธ๋จ์์ ๊ตฌ์กฐ์ ์ธ ์์ ์ ๊ฑฐ์น์ง๋ ์์๊ณ , ๋จ์ง click๋ <li>
๋ง ์ง์์ง๋ ๊ฒ์ ๋ชจ๋ <li>
๊ฐ ์ญ์ ๋๋๋ก ํ์ฌ, paintToDo()
ํธ์ถ์์ ๋ฐ์ํ๋ ์ค๋ณต ์ถ๋ ฅ๋ ํด๊ฒฐ๋์๋ค. ๋ฐ๋ผ์, forEach()
์์ toDo.id
์ paintToDo(toDo.text)
๋ฅผ ์ฌ์ ์ ์ ์ธํ๋ idNum
์ 1๋ก ๋ณ๊ฒฝ ํ ์ ์ฉ์์ผ์ฃผ๋ฉด,
idNum = 1;
cleanToDos.forEach(function(toDo){
toDo.id = idNum;
paintToDo(toDo.text); // ๋ด๋ถ id๋ idNum์ผ๋ก ์ง์ ๋จ.
// paintToDo๊ฐ ์คํ๋ ํ idNum += 1;์ด ์คํ๋๊ธฐ ๋๋ฌธ์ ์ถ๊ฐ๋ก ์คํํ์ง ์์.
});
toDos = cleanToDos;
saveToDos();
๋ค์๊ณผ ๊ฐ์ ์ฝ๋๊ฐ ์์ฑ๋๊ณ , ์ ์์ ์ผ๋ก ์๋ํจ์ ํ์ธํ ์ ์๋ค!
์ต์ด์ ์ํ, 3๊ฐ์ <li>
์ id
๊ฐ ์์๋๋ก ์ง์ ๋จ.
2๋ฒ์งธ <li>
์ธ "C"๋ฅผ ์ญ์ ํ ์ํฉ. ์๋ก๊ณ ์นจ ์์ด๋ "JAVA"์ id
๊ฐ 2๋ก ์์ ๋จ.
"C++"์ ์ถ๊ฐํ ์ํฉ, ๊ธฐ์กด ์ฝ๋๋ผ๋ฉด id
๊ฐ ์ค๋ณต๋๊ฑฐ๋, 4๋ก ์ง์ ๋์ง๋ง, ์์๋๋ก ์ง์ .
์ธ์ ๋ ๊ทธ๋ฌ๋ฏ์ด, ๋ฐฐ์ด ๋ด์ฉ์ ๋ฐ๋ผํ๊ฑฐ๋, ์ธํฐ๋ท์์ ์ฝ๋๋ฅผ ๋ณด๊ณ ๊ธฐ๋ฅ์ ๊ตฌํํ๋ ๊ฒ์ ๊ธ๋ฐฉ์ด์ง๋ง, ๊ตณ์ด ๊ตณ์ด ์ค์ค๋ก ์ด๊ฑด ์ด๋ฌ๋๊น, ์ ๊ฑด ์ ๋ฌ๋๊น ๋ฐ์ ธ๊ฐ๋ฉฐ ํ๊ณผ ๋ ธํธ๋ก ๊ธฐ๋ก์ ํ๋ฉฐ ์์ํ๋๋ก ์ฝ๋๋ฅผ ์์ฑํ๊ณ , ์์ํ ๊ฒฐ๊ณผ์ ๋น๊ตํด๋ณด๊ณ ์ด์ ๋ฅผ ์๊ฐํ๋ ๊ฒ์ ์ ๋ง ์ค๋ ์๊ฐ์ด ๊ฑธ๋ฆฐ๋ค.
๋ชจ๋ ์ฝ์ง์ ๋ค ๊ธฐ๋กํ๊ธฐ์ ๊ธ์ด ๋๋ฌด ๊ธธ์ด์ง ๊ฒ ๊ฐ์ ์ต์ด์ ๋ฐ์๋ถํฐ ๊ฒฐ๋ก ๊น์ง ๋๋ฆ ์ ์๋ฏธํ ๊ณ ๋ฏผ๋ง์ ๊ธฐ๋กํ๋๋ฐ, ๊ทธ๋๋ ๊ธ์ด ๊ฝค ๊ธธ์ด์ง ๊ฒ ๊ฐ๋ค.
'๊ตฌ์กฐ ์์ ์์ด๋ ์๋๋๊ฑฐ ์๋๊ฐ..' ์ถ์ ์๊ฐ์ด ๋ช๋ฒ ๋ค์์ง๋ง, ์ํด๋๊น ์๋ ์ ์น๊ณ ๊ณ์ ๋ถ๋ค๋๊ฒ ์ข์ ๊ฒฐ๊ณผ๋ก ์ด์ด์ก๊ณ , ์ด ๊ฒฝํ์ผ๋ก ์ฑ์ฅํ ๊ฒ ๊ฐ์ ๊ธฐ์๋ค.