๋
ธ์
ํด๋ก๋ ํ๋ก์ ํธ 2์ผ์ฐจ์ ๋์
ํ๋ค. ์ต๊ทผ ์ผ๋ง ๋์ ๊ณผ์ ์ ๊ฐ์๋์ด ๋ง์ TIL๋ฅผ ์์ฑํ ์ฌ๋ ฅ์ด ์์ด ์์ฑํ์ง ๋ชปํ๋ค.
์ ๋ฒ์ฃผ ํ ์์ผ ๋ฐฐ๋ฏผ์ ๋ง๊ดํ ๋์ ๊ฐ์ฐ์์ ๊ธฐ๋ก์ ์ต๊ดํ์ ์ค์์ฑ์ ๋ค์ ํ ๋ฒ ๊นจ๋ซ๊ณ ๋ฌด์๋ฏธํ ๋์ด์ TIL๋ณด๋ค ์ฌ์ํ ๊ฒ์ด๋ผ๋ ๋ด๊ฐ ์๋ก ์๊ฒ ๋ ๊ฒ๋ค์ ๋จ๊ธฐ๋ ์์ผ๋ก ์งํํ ์๊ฐ์ด๋ค.
๋
ธ์
ํด๋ก๋ ํ๋ก์ ํธ ์งํ ์ค ์ฌ์ด๋ ๋ค๋น๋ฐ์ ํ์ํ ๋ฌธ์ ๋ชฉ๋ก์ ๋ฐ์ดํฐ๋ก๋ถํฐ ๋ฝ์๋ด์ผ ํ๋ค. ์ด๋ฅผ ์ฌ๊ทํจ์๋ฅผ ํตํด ํ์ ๋ฌธ์๊ฐ ์์๋๊น์ง ๋ฝ์๋ด๋ ค๊ณ ๋ฐ๋ก ๊ตฌํํ์ผ๋ console.log
๋ก๋ ์ ๋๋ก ์ถ๋ ฅ๋์ง๋ง ๋ง์ง๋ง ๋ฐํ๊ฐ์ด undefined
๊ฐ ์๊พธ ๋์๋ค.
export function makeDocTree(root, depth, domTree) {
// domTree์ root ๋ฌธ์ ์์ ์ถ๊ฐ...
domTree += ...
// ํด๋น root ๋ฌธ์๊ฐ ํ์ ๋ฌธ์๊ฐ ์์ผ๋ฉด
if (root.documents.length === 0) {
return domTree;
}
// ์ฌ๊ท
makeDocTree(root.documents[0], depth + 1, domTree);
}
์ด์ ๋ ๊ฐ๋จํ๋ค. ์ด ๋ธ๋ก๊ทธ๋ฅผ ์ฐธ๊ณ ํด๋ณด๋ ์ฌ๊ท ํจ์๋ 3๊ฐ์ง ์์น์ด ์์๋ค.
- Base Case๋ฅผ ๋ช ํํ ์์ฑ
- Base Case๊ฐ ๋ถํฉํ์ง ์์ ๊ฒฝ์ฐ, ์ฌ๊ท Case๋ฅผ ๋ช ํํ ์์ฑ
- ์ํ๋ ๊ฒฐ๊ณผ๋ฌผ๊น์ง ์ต๋ํ ์ ๊ทผํ๊ณ ํ์ํ ๊ฒฝ์ฐ return. ์ผ๋ฐ์ ์ผ๋ก 2๊ฐ์ return์ด ์กด์ฌ
๋๋ ์์น์ 3๋ฒ์งธ ํญ๋ชฉ์ ์งํค์ง ์์์ ์ฌ๊ท ํจ์์ ๋ฐํ๊ฐ์ด undefined
๋์ค๊ฒ ๋ ๊ฒ์ด์๋ค. ์๋์ ๊ฐ์ด ์ฝ๋๋ฅผ ์์ ํ๋ ์ ์์ ์ผ๋ก ์ํ๋ Dom Tree HTML ์์๋ฅผ ๊ตฌํ ์ ์์๋ค.
...
// ์ฌ๊ท
return makeDocTree(root.documents[0], depth + 1, domTree);
...
๋จ์ํ ์ฌ๊ท ํจ์๋ง ๋ฐ๋ณตํ ๊ฒฝ์ฐ ์ํ๋ return ๊ฐ์ด ๋๋ฝ๋์ด ๋ฌธ์ ๊ฐ ๋ฐ์ํ๋ ๊ฒ์ด์๋ค. ์ด๋ ๊ฒ ๊ตฌํํ ์ฌ์ด๋ ๋ค๋น๋ฐ์ ํ์ํ ๋ฌธ์ ๋ชฉ๋ก ์์ ์ฌ์ง์ด๋ค.
๋
ธ์
๊ธ ์๋ํฐ์์ ์ ๋ชฉ <input>
ํ๊ทธ๋ ๋ค์๊ณผ ๊ฐ์ ์กฐ๊ฑด์ ๋ง์กฑํด์ผ ํ๋ค.
- ๋น ์ ๋ชฉ์ผ ๊ฒฝ์ฐ placeholder ๊ฐ์ด
์ ๋ชฉ ์์
์ด์ด์ผ ํ๋ค.- ์ ๋ชฉ์ ์ ๋ ฅํ๊ณ ์์ ๊ฒฝ์ฐ (
focus
๋์์ ๊ฒฝ์ฐ) placeholder ๊ฐ์ด ์ ๊ฑฐ๋์ด์ผ ํ๋ค.- ์ดํ ๋ค์ ์ ๋ชฉ์ด ๋น ๊ฐ์ด ๋๋ฉด ๋ค์ placeholder ๊ฐ์ด ์์๋ณต๊ท๋์ด์ผ ํ๋ค.
focus
์ด๋ฒคํธ์ ๋ํด์๋ ์๊ณ ์์์ผ๋ focus
๊ฐ ํด์ ๋์์ ๊ฒฝ์ฐ๋ ์ด๋ค ์ด๋ฒคํธ ๋ช
์ ๊ฐ์ง๋์ง ๋ชฐ๋๋ค. ๊ฒ์ํด๋ณด๋ ํด๋น ์ด๋ฒคํธ๋ blur
์๋ค.
์๋๋ ์์ ์กฐ๊ฑด์ ๋ง์กฑํ๋๋ก ์ด๋ฒคํธ๋ฆฌ์ค๋๋ฅผ ์ค์ ํ ์ฝ๋์ด๋ค.
const $editHeaderInput = document.querySelector('input#title');
$editHeaderInput.addEventListener('focus', (e) => {
const $input = e.target;
$input.placeholder = '';
});
$editHeaderInput.addEventListener('blur', (e) => {
const $input = e.target;
if ($input.text !== '') $input.placeholder = '์ ๋ชฉ ์์';
});
์์ง๊น์ง ์ ํํ๊ฒ ๋น๋๊ธฐ Promise์ ๋ํ ์ ๋ฆฌ๊ฐ ๋์ด ์์ง ์์์ ์๋ฒ์์ ๋ฐ์ดํฐ๋ฅผ ํธ์ถํด์ ์์ฑ ๋ฐ ์ญ์ ๋ฅผ ์ฌ์ฐจ์ ์ฐจ ์งํํ์ง๋ง ์ด๋ค ๊ณผ์ ์ ์ํด์ ๋๋์ง ์ ๋งค๋ชจํธํ ์ํฉ์ด๋ค.
MDN ๊ณต์ ๋ฌธ์์ ๋ชจ๋ ์ฝ์ด ์๋ฐ์คํฌ๋ฆฝํธ์ ๊ธฐ์ ๋ ๋ด์ฉ์ ๋ค์ ์ ๋
ํ๊ณ Promise์ async-await์ ๋ํ ๊ฐ๋
์ ํ๋ฆฝํด์ผ ํ ๊ฒ ๊ฐ๋ค.
๋
ธ์
ํด๋ก ์ฝ๋ฉ ๊ฐ์ธ ํ๋ก์ ํธ๋ฅผ ์งํํ๋ฉด์ ๋งจ๋
์์๋ถํฐ ์ฝ๋ฉ์ ํผ์ ๊ณ ๋ฏผํ๋ฉด์ ํ๊ฒ ๋๋ ์ง์ง ์ค๋ ฅ์ด ์กฐ๊ธ์ฉ ๋๋ ๊ฒ ๊ฐ์ ๊ธฐ๋ถ์ด ์ข๋ค!! (๋ฐฑ๋ฌธ์ด ๋ถ์ฌ์ผํ๊ฐ ๋ง๋๋ฏ)
๊ธฐ๋ฅ์ ๊ตฌํํ๊ธฐ ์ ์ ์ด๋ค ์๋ฃ ๊ตฌ์กฐ๋ฅผ ์ฌ์ฉํ ์ง, ์ํ ๊ด๋ฆฌ ๋ฐ ํจ์์ ์ปดํฌ๋ํธ๋ ์ด๋ป๊ฒ ์ค์ ํ ๊ฒ์ธ์ง ๋ฏธ๋ฆฌ ๊ตฌ์ํ๋๋ฐ ์๊ฐ์ด ๋ง์ด ์์๋์๋ค.
ํ์ง๋ง ์ด๋ฅผ ํตํด ์ค์ ๋
ธ์
๊ณผ ๊ฑฐ์ ๋์ผํ๊ฒ ๊ธฐ๋ฅ์ด ๋์ํ๋ ๊ฒ์ ํ์ธํ๋ ๋ญ๊ฐ ๋ฟ๋ฏํ๋ค.
๋ด์ผ์ ๊ธ ์๋ํฐ์ ์ฌ์ด๋ ๋ค๋น๋ฐ ๋ฌธ์๋ฅผ ์ฐ๋ํ๋ ๊ฒ๊ณผ History API๋ก SPA ๊ตฌํ์ ํด๋ณผ ๊ฒ์ด๋ค. ์์์์!! ๐
๐ ํด๋น ๋ด์ฉ์ ๊ณต๋ถํ๋ฉด์ ์ ๋ฆฌํ ๊ธ์ ๋๋ค. ํ๋ฆฐ ๋ถ๋ถ์ด๋ ์คํดํ๊ณ ์๋ ๋ถ๋ถ์ด ์๋ค๋ฉด ํผ๋๋ฐฑ ๋ถํ๋๋ฆฝ๋๋ค.
๊ด๋ จ ๋ ํผ๋ฐ์ค