์ฃผ์ ์์
- ์ต์ ๋ฒ ํจํด ์ ์ฉ - notify์ ํ์ด์ง๋ณ ์ปดํฌ๋ํธ ๋ฆฌ๋ ๋๋ง
- MVC ํจํด ์ฌ๊ตฌ์กฐํ(์น ๋ฏ์ด๊ณ ์นจ)
- ํ ์คํธ ์ฝ๋ ์์ฑ
ํ์ต ํค์๋
- Jest ํ ์คํธ์ฝ๋
- javascript class
- ์ต์ ๋ฒ ํจํด
- MVC ํจํด
https://luxurious-share-af6.notion.site/4-aba822d7763544a5ad64778df911c630?pvs=4
๊ณ ๋ฏผ ๋ฐ ํด๊ฒฐ๊ณผ์
TroubleShooting: Class์ getter์ setter ์ค์
RangeError: Maximum call stack size exceeded
33 | }
34 | set title(title) {
> 35 | this.title = title;
| ^
36 | }
37 | set detail(detail) {
38 | this.detail = detail;getter ํจ์์ setter ํจ์๋ฅผ ์ฌ์ฉํจ์ ์์ด์ ์๊พธ ์์ฑ์๋ฅผ ํตํด ์ธ์คํด์ค๋ฅผ ๋ง๋ค๋ ค๊ณ ํ์ง๋ง setterํจ์๋ฅผ ์คํํจ์ผ๋ก์จ ์๋ฌ๊ฐ ๋ฐ์ํ๋ค. ๋ฌด์์ด ๋ฌธ์ ์ธ์ง ํ ์คํธ์ฝ๋๋ฅผ ํตํด์ ์ฐจ๊ทผ์ฐจ๊ทผ ๋ถ์ํด๋ณด์๋ค.
class Card {
constructor({
id,
author,
created_at,
title,
detail,
task_column,
priority,
}) {
this.id = id;
this.author = author;
this.created_at = created_at;
this.title = title;
this.detail = detail;
this.task_column = task_column;
this.priority = priority;
}Card Class์ constructor๋ ์๋ก์ด ๊ฐ์ฒด๋ฅผ ๋ง๋๋ ๊ณผ์ ์์ this.id = id, author ๋ฑ์ ์คํํ๋ค. title๋ฅผ ์๋ก ๋ค์ด๋ณด์๋ฉด, this.title = id๋ฅผ ์คํํ๋ ๊ณผ์ ์ด ์ฌ์ค์ id์ ํ ๋นํ๋ ๊ณผ์ ๊ณผ ๊ฐ๋ค๋ ์ ์ด๋ค.
set title(title) {
this.title = title;
}์ด์ ์ ๋ด๊ฐ ์ผ๋ setter ํจ์์ด๋ค.
๋ณด๋ฉด ์์ฑ์์์ ํ ๋นํ๋ ๊ณผ์ ๊ณผ ๊ฐ๋ค.
๊ทธ๋ ๊ธฐ์ this.title = title์ด๋ผ๋ ํ ๋น๋ฌธ์ setterํจ์๋ฅผ ์คํ์ํค๊ณ , ํจ์์์๋ ๋ค์๊ธ this.title = title์ ์คํ์ํค๋ฉด setter ํจ์๋ฅผ ์ฌ๊ท์ ์ผ๋ก ํธ์ถํ๋ ๊ตฌ์กฐ๊ฐ ๋์ด๋ฒ๋ ธ๋ค.
์ด๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด ์ฐพ์๋ณธ ๊ฒฐ๊ณผ ํด๋์ค์ getter,setterํจ์์์๋ ์ฃผ๋ก property๋ฅผ ๋์๋ฐ(_)๋ฅผ ๋ฃ์ด ๊ตฌ๋ถํ๋ค๊ณ ํ๋ค.
get title() {
return this._title;
}
set title(title) {
this._title = title
}๊ทธ๋ฅ ๋ด๊ฐ ํจ์๋ํ๋ผ ํด๋์ค๋ฅผ ๋ง์ด ์ ์ฌ์ฉํด๋ด์ ๋ฉ์ฒญ์ด์์๋๊ฑธ๋ก..
์ต์ ๋ฒ ํจํด์ ์ ์ฉ ๋ฒ์
์ฒ์์๋ ๊ฐ๊ฐ์ ๋ชจ๋ ์ปดํฌ๋ํธ์ ๋ํด์ ๋ฆฌํฉํ ๋ง์ ํ ๋ค, ์ปดํฌ๋ํธ ๋ณ๋ก ์ํ๋ฅผ ๊ด๋ฆฌํ ์ ์๋ ๋ฆฌ์กํธ์ useState, setState์ ๊ฐ์ด ์ ํธํจ์๋ฅผ ๋ง๋ค์ด ์ฌ์ฉํด๋ณผ๊น ํ๋ ์๊ฐ์ ํ์๋ค.
ํ์ง๋ง ์ฐ๋ฆฌ๊ฐ ๋ง๋ค๊ณ ์๋, ๋ํ ๋ด๊ฐ ๋ง๋ ํ๋ก์ ํธ์ ๊ตฌ์กฐ์์ ์ต์ ๋ฒ ํจํด์ ๊ฐ ์ปดํฌ๋ํธ๋ง๋ค ์ ์ฉํ๋ ๊ฒ์ ์๋์ ๊ฐ์ ์ด์ ์์ ์ค๋ฒ์์ง๋์ด๋ง์ด๋ผ๊ณ ์๊ฐํ๋ค.
์ ํ๋ฆฌ์ผ์ด์ ์ ๋น์ฆ๋์ค ๋ก์ง, ์๋๋ฆฌ์ค์ ๋ฐ๋ผ ์ง์ํด์ ๋ณ๊ฒฝ๋ ์ ์๊ณ , ์ด๋ฅผ ์๊ฐ์ ์ผ๋ก ํํํด์ผ ํ๋ ๋ฐ์ดํฐ๋ฅผ โ์ํโ๋ผ๊ณ ์๊ฐํ๋ค. ํด๋น ์ํ์ ์ ์๋ก ๋์ ํ๋ก์ ํธ๋ฅผ ๋ณด์์ ๋, ์ ๋ณด ๊ฐฑ์ ์ด ์ด๋ฃจ์ด์ง ๋๋ api๋ฅผ ํธ์ถํ์ ๋ ์ด์ธ์ ์ํฉ์์๋ ๊ฐ๋ณ์ ์ผ๋ก ์ํ ๊ด๋ฆฌ๋ฅผ ํ ํ์๊ฐ ์์ด์ง๋ค. ์ด์ ๊ตณ์ด ํ์ํ ๊น? ํ๋ ์๊ฐ์ด ๋ค์๋ค.
๋ฐ๋ผ์ ๋๋ ์ด๋ค ๋ฐฉ์์ผ๋ก ํ์ฌ ์๊ฐ์ ์ผ๋ก ํํ๋์ด ์๋ ๋ฐ์ดํฐ๋ค์ ์ด๋ค ๋ฐฉ์์ผ๋ก ์ต์ ๋ฒ๋ฅผ ๊ด๋ฆฌํ๋ฉฐ, ์ ๋ณด ๊ฐฑ์ ์ด ์ผ์ด๋ฌ์ ๋ ์ต์ ๋ฒ๋ธ์๊ฒ notifyํ ์ ์์๊น? ๋ฅผ ๊ณ ๋ฏผํ๋ค.
์ปดํฌ๋ํธ ๋ณ๋ก ๋ฆฌ๋ ๋๋ง์ด ํ์ํ ๊ณณ์ ์ต์ ๋ฒ๋ธ ๋ด๋ ค์ฃผ๊ธฐ
...
function Main() {
const observable = new Observable();
function render() {
new Header(observable);
new Mainsection(observable);
fab.render(observable);
EventManager.attachEvent("/main");
}
return { render };
}
export default Main();
๋๋ ์ปดํฌ๋ํธ ๋จ์, ํ์ด์ง ๋จ์๋ก ํจ์ํ์ ๋ง๋ค๊ณ , ๋ง์น ์ปดํฌ๋ํธ์ฒ๋ผ ๋ ๋๋งํ๋๋ก ๋ก์ง์ ๊ตฌ์ฑํ๋ค. ์ฌ๊ธฐ์ ๋๋ ์ ๋ณด ๊ฐฑ์ ์ด ์ด๋ฃจ์ด์ก์ ๋ ํจ๊ป ๋ ๋๋ง๊ณผ ์ ๋ณด๋ฅผ ๋ค์๊ธ fetchํด์ฌ ์ ์๋ ์ปดํฌ๋ํธ์ ๋ํด์๋ง observable์ ๊ตฌ๋ ํ ํ์, api ํธ์ถ ๋ถ๋ถ์์ ๊ธฐ์กด์ ๊ฐ์ก๋ ๋ฆฌ๋ ๋๋ง ๋ก์ง ๋์ ์ฝ๋ฐฑํจ์๋ก observable์๊ฒ notifyํด์ฃผ๋ ํจ์๋ฅผ ๋ฃ์ด์ฃผ๋ ๋ฐฉ์์ผ๋ก ๋ฆฌํฉํ ๋งํ๋ค.
function Section(observable) {
observable.subscribe(render);
async function render() {
try {
const { data, path } = await fetch();
console.log("section render:", data);
const compiledFunction = window.pug.compile(template, {
basedir: path,
});
document.getElementById("sections").innerHTML = "";
data.forEach((section) => {
const html = compiledFunction({ section: section }); // ๋ ๋๋ง๋ HTML
document.getElementById("sections").innerHTML += html;
addTodo.render(section.classify);
if (section.cards)
card.render(document.getElementById(section.classify), section.cards);
});
addcolumn.render();
} catch (error) {
alert("์นด๋ ์ ๋ณด๋ฅผ ๋ถ๋ฌ์ค๋ ์ค ์๋ฌ๊ฐ ๋ฐ์ํ์ต๋๋ค.");
}
}
render();
return {
render,
};
}
export default Section;
์ด์ฒ๋ผ ์ ๋ณด ๊ฐฑ์ ์ด ์ด๋ฃจ์ด์ง ํ์, fetch๋ฅผ ๋ค์ ํด์ด์ผ๋ก์จ ์ ๋ณด๋ฅผ ํ์ ์ ์ผ๋ก ๋ณด์ฌ์ค ์ ์๋ db์์ ๊ฐ์ ธ์ ๋์์ฃผ๋ render ํจ์๋ฅผ ์ต์ ๋ฒ๋ธ์ ๊ตฌ๋
ํด์ฃผ๊ณ , ๊ฐฑ์ ์ด ์ด๋ฃจ์ด์ก์ ๋, ๋ฉ์ธํ์ด์ง์ ๊ฒฝ์ฐ ํ์คํ ๋ฆฌ ์ฐฝ ์์ ๋ด์ฉ๋ค๊ณผ ์นด๋๋ค์ ๋ํด์ ๋ค์๊ธ fetchํด์ค๊ณ ์ ๋ณด๋ฅผ ์ต์ ์ ๋ณด๋ก ๋ฆฌ๋ ๋๋ง ์ํฌ ์ ์๋๋ก ์ค๊ณํ์๋ค.
๋ฆฌ๋ทฐ์์ฒญ
์๋ ํ์ธ์ ๋ฉํ ๋! ์ ๋ ์,๋ชฉ ๋์ ์๋ฒ์ ๊ตฌ์กฐ๋ฅผ ๋ฆฌํฉํ ๋งํ๋ ์์ ์ ์ฃผ๋ก ์งํํ์ต๋๋ค. ํ์์ผ ๋ฉํ ๋์ด ๋ฆฌ๋ทฐํด์ฃผ์ ๊ฒ์ ๋ณด๊ณ ์ ์ฝ๋๋ฅผ ๋ค์๊ธ ๋ณด๋ ๊ธฐ์กด์ ๋ชจ๋ธ์ ๋ํ ์ดํด๊ฐ ๋์ง ์์ ํ ๋๋ฉ์ธ์ ๋ํ ๋จ์ผ ๋น์ฆ๋์ค ๋ก์ง์ด๋ผ๊ณ ์๊ฐ์ ํ์๋ ์ ๊ณผ ์ปจํธ๋กค๋ฌ์ ์ญํ ์์ฒด๊ฐ ์๋น์ค ๋ก์ง์ ๋ด๊ณ ์์๋ค๋ ์ ์ด ๋ฌธ์ ๋ผ๊ณ ์๊ฐํ์ต๋๋ค.
์ด์ ๊ฐ์ ํ ์๋ฒ์ ๊ตฌ์กฐ๋ฅผ ๊ฐ๋จํ ๋ง์๋๋ฆฌ์๋ฉด
- ์ปจํธ๋กค๋ฌ : ์์ฒญ๊ณผ ์๋ต์ ๋ํ ๋จ์ ์๋ต/์์ฒญ ๊ฐ์ฒด๋ฅผ ํด๋ผ์ด์ธํธ/์๋น์ค์ ์ ๋ฌ
- ์๋น์ค: ์ผ๋ จ์ ๋น์ฆ๋์ค ๋ก์ง๋ค์ ์ ๋ถ ์ํ
- ๋ ํฌ์งํ ๋ฆฌ : db์ ์ง์ ์ ์ธ ์ ๊ทผ ๋ฐ ์กฐ์์ ํ๋ ๊ณ์ธต์ผ๋ก ๋ฐ์ดํฐ ๊ฐ์ฒด๋ฅผ ๋๊ฒจ๋ฐ๊ณ ๋ฐ์ดํฐ ๊ฐ์ฒด๋ฅผ ๋ฆฌํดํจ
- ๋ชจ๋ธ : ํด๋น ๋๋ฉ์ธ์ ๋ํ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ฒด๋ก ๋ค๋ฃจ๋ฉฐ, ํด๋นํ๋ ๋ฐ์ดํฐ์ ๊ฐ์ฒด๋ฅผ ์๋น์ค์์ ๋ ํฌ์งํ ๋ฆฌ๋ก ์ ๋ฌํ๋ฉด์ ๋ฐ์ดํฐ์ ๊ฐฑ์ ์ ๋ด๋น ์ ๊ตฌ์กฐ๋ก ๊ฐ์ ํด ๋ณด์์ต๋๋ค. ๊ฐ์ ํ ๊ตฌ์กฐ์ ๋ํด์ ๋ฉํ ๋์ ๊ฐ๋จํ ํผ๋๋ฐฑ๊ณผ ์ ์ฒด์ ์ธ ์ฝ๋์ ๋ํ ํผ๋๋ฐฑ ์ฃผ์๋ฉด ๊ฐ์ฌํ๊ฒ ์ต๋๋ค :) 2์ฃผ์ผ๋์ ๊ณ ์ํ์ จ์ต๋๋ค!