๋ฐ๋ธ์ฝ์ค ํ๋ก ํธ์๋ ๊ณผ์ ์งํ ์ค ๋ฐ๋๋ผ JS ๋ง์ผ๋ก ํฌ๋ ๋ฆฌ์คํธ ๋ง๋ค๊ธฐ ๊ณผ์ ๊ฐ ๋์๋ค. ํ๋ก๊ทธ๋๋จธ์ค ๋ฐ๋ธ ๋งค์นญ ๊ณผ์ ์ ์ ๋ต๊ณผ ์ ์ฌํ ๋ฐฉ์์ผ๋ก ์ปดํฌ๋ํธ๋ฅผ ์์ฑํด์ผํ๊ธฐ ๋๋ฌธ์ ๊ฐ์๋ฅผ ์ดํดํ๋๋ฐ ํฌ๊ฒ ์ด๋ ค์์ ์์๋ค.
๋ค๋ง ์ด๋ฒ์ ํจ์ ์ปดํฌ๋ํธ๊ฐ ์๋๋ผ class ํ์ผ๋ก ๋ง๋ค์ด๋ณด๊ธฐ๋ก ํ๋ค.
ํ๋ก ํธ ์๋๋ฅผ ์ ๋ฌธํ ๋ ๋ ธ๋ง๋ ์ฝ๋์์ ๋ก์ปฌ ์คํ ๋ฆฌ์ง๋ฅผ ์ฌ์ฉํด ํฌ๋ ๋ฆฌ์คํธ๋ฅผ ๋ง๋ค์ด๋ณด๋ ์ค์ต์ ํด๋ณธ ์ ์ด ์์๋๋ฐ, ๊ทธ ๋์ ์ฝ๋์ ๋น๊ตํ์ฌ ์ผ๋ง๋ ๋์์ก๋์ง๋ฅผ ํ๊ฐ๋ฆ ํ ์ ์๋ค๊ณ ์๊ฐํด์ ์ด์ฌํ ๋ง๋ค์ด๋ณด๊ณ ์ ํ๋ค.
README.md
์ ๊ตฌํํ ๊ธฐ๋ฅ๊ณผ ๊ณํ ์ ์๋ค. ์ ์ฒด์ ์ธ ๊ณํ์ ๋ค์๊ณผ ๊ฐ๋ค.
1. ๊ธฐ๋ฅ ํ๋์ฉ ๊ตฌํํ๊ธฐ
2. ๋ฆฌํฉํ ๋ง ์งํํ๊ธฐ
3. ์์ธ์ฒ๋ฆฌ ํ๊ธฐ
4. CSS ๊พธ๋ฏธ๊ธฐ
5. ๊ณผ์ ์๊ตฌ์ฌํญ์ ๋ง์กฑํ๋์ง ๊ฒํ ํ๊ธฐ
๊ธฐ๋ฅ์ ๊ตฌํํ๋ค ๋ณด๋ฉด ์ง๊ธ ๋ด๊ฐ ์ด๋ค ๊ฑธ ๊ตฌํํ๊ณ ์๋์ง, ์ ์ฒด์ ์ธ ํ๋ฆ์ด ์ด๋์ฏค์ธ์ง ๊น๋จน๊ณค ํด์ ์ ์ฒด์ ์ธ ๊ณํ๊ณผ, ์ปดํฌ๋ํธ๋ณ ๊ตฌํ ๊ธฐ๋ฅ์ ์ฐ์ ์์ฑํ๋ค.
์ง๋ ๊นํ๋ธ ํน๊ฐ๋ ๋ฐฐ์ ๋ ๊ฒ์ฒ๋ผ ํ๋์ ๋ณํ๋ฅผ ์ปค๋ฐ์ผ๋ก ๋ง๋ค๊ธฐ ์ํด, ๋ด๊ฐ ์๊ฐํ๋ ์ปค๋ฐ์ ํ๋ฆ๋๋ก ๊ณํ์ ์์ฑํ๋ค.
์ปดํฌ๋ํธ ๋ณ๋ก ํ๋์ฉ ๊ธฐ๋ฅ์ ๊ตฌํํด ๋๊ฐ๋ค. ๊ตฌํ์ ์๋ฃํ๊ณ ๋ณด๋ ์ด๋ ค์ด ๋ก์ง์ด ์๋๋ฐ, ์๋ ํ๊ณ ์์ ์์ฑํ ๋ฌธ์ ๋ค๋ก ์ธํด ์๊ฐ์ด ์ค๋ ๊ฑธ๋ ธ๋ค.
๊ฐ ์ปดํฌ๋ํธ๊ฐ ํ๋ ์ผ์ ๋ค์๊ณผ ๊ฐ๋ค.
1. Header
๊ณผ์ ์ ์ ๋ชฉ์ ์๋ ค์ฃผ๋ ์ญํ ์ ํ๋ ์ปดํฌ๋ํธ.
2. TodoForm
์ฌ์ฉ์๋ก๋ถํฐ ํฌ๋๋ฆฌ์คํธ๋ฅผ ์
๋ ฅ ๋ฐ๋ ์ปดํฌ๋ํธ.
3. TodoList
ํฌ๋๋ฆฌ์คํธ๋ฅผ ๋ณด์ฌ์ฃผ๋ ์ปดํฌ๋ํธ. ์๋ฃ ๋ฒํผ์ ๋๋ฅด๋ฉด ๊ธ์ ์์ ์ ์ด ๊ทธ์ด์ง๊ณ , ์ญ์ ๋ฅผ ๋๋ฅด๋ฉด ํฌ๋๋ฆฌ์คํธ๊ฐ ์ญ์ ๋๋ค.
4. TodoCount
์๋ฃ๋ ๋ฆฌ์คํธ - ํ์ฌ ์ด ํฌ๋ ๋ฆฌ์คํธ ๊ฐ์๋ฅผ ๋ณด์ฌ์ฃผ๋ ์ปดํฌ๋ํธ
๊ธฐ๋ฅ์ ๊ตฌํํ ๋ค์ ๋ค์๊ณผ ๊ฐ์ ๊ธฐ์ค์ผ๋ก ๋ฆฌํฉํ ๋ง์ ์งํํ๋ค.
- ๋ณ์๋ช ์ ์๋ฏธ ์๊ฒ ์ง์๋๊ฐ?
- ๋ก์ง์ด ํจ์จ์ ์ด๊ณ ์ฌ๋ฐ๋ฅธ๊ฐ?
- ์์ธ์ฒ๋ฆฌ๊ฐ ๋์ด์๋๊ฐ?
- ๊ณผ์ ์ ์๊ตฌ์ฌํญ์ ๋ง์กฑํ๋๊ฐ?
- ์ง๋์ฃผ์ ์ฝ๋ ๋ฆฌ๋ทฐ๋ฅผ ์ด๋ฒ ๊ณผ์ ์๋ ๋ฐ์ํ์!
1. App ์ปดํฌ๋ํธ๊ฐ ํ์ ์ปดํฌ๋ํธ ๋ค์ ๊ด๋ฆฌํ๋ค.
state ๋ App ์์ ๊ด๋ฆฌํ๊ณ , state ๋ณํ๋ฅผ App ์์ ๊ฐ์งํ๋ฉด ๋ค๋ฅธ ์ปดํฌ๋ํธ์ ํด๋น ๋ณํ๋ฅผ ์ ํด์ฃผ๋ ๋ฐฉ์์ด๋ค.
2. ๋ก์ปฌ ์คํ ๋ฆฌ์ง์ ๊ด๋ จ๋ ๋ฉ์๋๋ฅผ ์์ฑํ๋ค.
๋ก์ปฌ ์คํ ๋ฆฌ์ง๋ ์ ์ญ ๋ฉ์๋๋ก ์ ๊ทผํ ์ ์๋๋ก ๋ฐ๋ก class ๋ฅผ ๋ง๋ค์๋ค.
1. ํ์ด์ง ๋ก๋ฉ
ํ์ด์ง ๋ก๋ฉ ์ Storage ์ ๊ธฐ์กด์ ์ ์ฅํ state ๋ฅผ ๋ถ๋ฌ์จ๋ค.
// App ์ปดํฌ๋ํธ
export default class App {
constructor(target) {
this.lists = StorageHandler.getCurrLists();
}
}
// StorageHandler ํด๋์ค
export default class StorageHandler {
static getCurrLists = () => {
try {
const currLists = JSON.parse(localStorage.getItem('lists'));
return currLists === null ? [] : currLists;
} catch (error) {
console.log(error.message);
}
}
}
2. ํ์ด์ง ์ด๊ธฐ ๋ ๋๋ง
์ด๊ธฐ์ ๋ฐ์ state ๋ฅผ ํตํด ์ ์ฒด ์ปดํฌ๋ํธ๋ฅผ ๋ ๋๋งํ๋ค. ์ด๋ state(ํฌ๋๋ฆฌ์คํธ ๋ชฉ๋ก)๊ฐ ํ์ํ ์ปดํฌ๋ํธ๋ TodoList ์ปดํฌ๋ํธ, TodoCount ์ปดํฌ๋ํธ๋ค.
export default class App {
constructor(target) {
this.lists = StorageHandler.getCurrLists();
this.header = new Header(target);
this.todoForm = new TodoForm(target, this.onSubmit);
this.todoLists = new TodoLists(target, this.lists, this.onChange);
this.todoCount = new TodoCount(target, this.lists);
}
}
์ด๋ ์ปดํฌ๋ํธ๋ฅผ ์์ฑํ๋ฉด์ TodoForm ๊ณผ TodoList ์์ state ์ ๋ณ๊ฒฝ๊ณผ ๊ด๋ จ๋ ์ด๋ฒคํธ๊ฐ ์์ผ๋ฏ๋ก state ๋ณ๊ฒฝ ๊ฐ์ง ํจ์๋ฅผ ์ ๋ฌํ๋ค.
์ด๋ ๊ฒ ํจ์ผ๋ก์จ App ์์ state ๋ฅผ ๊ด๋ฆฌํ๊ณ , App ์ด state ๊ฐ ๋ณ๊ฒฝ๋จ์ ๊ฐ์งํ๋ฉด state ์ ๋ฐ์ดํธ ํ state ๋ฅผ ๋ฐ๋ ํ์ ์ปดํฌ๋ํธ ๋ค์ ์๋ก ๊ทธ๋ ค์ฃผ๋ฉด ๋๋ค.
onSubmit = (newList) => {
const newLists = [...this.lists, newList];
this.setLists(newLists);
};
onChange = (newLists) => {
this.setLists(newLists);
};
3. state ๋ณ๊ฒฝ ์ ํ์ด์ง ๋ฆฌ๋ ๋๋ง
App ์ปดํฌ๋ํธ์์ state ๊ฐ ๋ณ๊ฒฝ๋จ์ ๋ฐ๋ผ todoList์ todoCount์ ์ ๋ฌํด์ค๋ค.
// App ์ปดํฌ๋ํธ
setLists = (newLists) => {
if (newLists.every(element => 'content' in element && 'isCompleted' in element)) {
this.lists = newLists;
this.todoLists.setLists(this.lists);
this.todoCount.setLists(this.lists);
}
};
// TodoList, TodoCount
setLists = (changedLists) => {
this.lists = changedLists;
this.render();
}
๋ก์ปฌ ์คํ ๋ฆฌ์ง์๋ ๋ณ๊ฒฝ๋ ์ฌํญ์ ๋ฐ๋ก ์ ์ฅํ๋ค.
// App
setLists = (newLists) => {
if (newLists.every(element => 'content' in element && 'isCompleted' in element)) {
this.lists = newLists;
this.todoLists.setLists(this.lists);
this.todoCount.setLists(this.lists);
StorageHandler.saveLists(this.lists);
}
};
// StorageHandler
static saveLists = (newLists) => {
try {
localStorage.setItem('lists', JSON.stringify(newLists));
} catch (error) {
console.log(error.message);
}
}
๋ค์๊ณผ ๊ฐ์ ์ด์ ๋ค๋ก ๊ธฐ๋ฅ์ ๊ตฌํํ๋ ๋ฐ ์์ด ์ ๋ฅผ ๋ง์ด ๋จน์๋ค.
1. state ๊ด๋ฆฌ๋ฅผ ์๊ฐํ์ง ์์๋ค.
์ปดํฌ๋ํธ๋ฅผ ์ด๋ป๊ฒ ๊ตฌํํ ์ง ๋๋ต์ ์ธ ๊ฐ์ ์ก์์ง๋ง state ๋ฅผ ์ด๋ป๊ฒ ๊ด๋ฆฌํ ์ง๋ฅผ ์๊ฐํ์ง ์๊ณ ๋ฌดํฑ๋๊ณ ๊ธฐ๋ฅ ๊ตฌํ์ ์งํํ๋ค. state ์ ๊ด๋ จ๋ ๋ก์ง์ ์์ฑํ ๋๋ง๋ค ํ์ผ ์ ์ฒด๋ฅผ ์์ ํ๊ณ , ์ค๊ณ๋ฅผ ๋์ง์ด๋ณด๊ธธ ์์ฐจ๋ก ๋ฐ๋ณตํ๋ค.
์ฒ์๋ถํฐ App ์์ state ๋ฅผ ๊ด๋ฆฌํ ๊ฒ์ธ์ง, ์๋๋ฉด ์ด๋์ ๋ ์ปดํฌ๋ํธ ๋ผ๋ฆฌ ์์กด์ฑ์ ๋ ๊ฒ์ธ์ง๋ฅผ ์๊ฐํ์ด์ผ ํ๋๋ฐ... ๊ทธ๋ฌ์ง ๋ชปํ๊ณ ๊ณ์ ๊ฐํก์งํก ํ๋ค. ๋ค์๋ฒ ๊ณผ์ ์์ state ๊ด๋ฆฌ๋ฅผ ์ด๋ป๊ฒ ํด์ผํ ์ง ๊ผผ๊ผผํ๊ฒ ์๊ฐํด์ผ๊ฒ ๋ค.
2. this ๋ฅผ ์ดํดํ์ง ๋ชปํด ์๊ฐ์ ๋ง์ด ํ๋นํ๋ค.
๊ฐ์์์ ํจ์ํ ์ปดํฌ๋ํธ๋ค์ ์ฌ์ฉํ์ง๋ง ๋๋ ํด๋์คํ์ผ๋ก ์ปดํฌ๋ํธ๋ฅผ ์ฌ์ฉํ๋ค. this ๋ฅผ ํตํด ์ ์ญ์ ์ผ๋ก App ์์ ํ์ ์ปดํฌ๋ํธ๋ค๊ณผ ๋ฉ์๋๋ฅผ ๊ด๋ฆฌํ๊ณ ์ถ์ด ๋ค์๊ณผ ๊ฐ์ด ์ ์ธํ๋ค.
class App {
constuctor(target) {
this.form = new TodoForm(target, this.onSubmit);
this.list = new TodoList(target);
}
onSubmit(newState) {
this.list.setState(newState);
}
}
์ด๋ ์ด๋ฒคํธ ํจ์๋ TodoForm ์ ๋งค๊ฐ๋ณ์๋ก ์ ๋ฌ๋๋ฉฐ this๊ฐ ๊ฐ๋ฆฌํค๋ ๋์์ด App ์์ TodoForm ์ผ๋ก ๋ฐ๋๊ฒ ๋๋ค. TodoForm ๋ด์์ this.lists ๊ฐ ์กด์ฌํ์ง ์์ผ๋ฏ๋ก ์ค๋ฅ๊ฐ ๋๋ค. ๊ทธ๋์ this ๋ฅผ App ์ผ๋ก ๋ฐ์ธ๋ฉ ํ ์ ์๋๋ก ๋ค์๊ณผ ๊ฐ์ด ํ์ดํ ํจ์๋ฅผ ์ฌ์ฉํ์ฌ ์์ ํ๋ค.
onSubmit = (newState) => {
this.setState(newState);
}
3. ์ปค๋ฐ ๋ฉ์ธ์ง๋ฅผ ๋์๋์ ์์ฑํ๋ค.
README.md
์ ์ ์ด๋์ ๊ฒ๋งํผ์ ์ปค๋ฐ ๋ฉ์ธ์ง๋ฅผ ์์ฑํ์ง ๋ชปํ๋ค. ๊ทธ๋์ ์ปค๋ฐ ๋ฉ์ธ์ง๋ฅผ ์ดํด๋ณด๋๋ฐ ์ด๋ค ์ปดํฌ๋ํธ๋ฅผ ์ด๋ป๊ฒ ์์ ํ๋์ง ์ ๋ํด ์ฝ๊ฒ ์์๋ณผ ์ ์์๋ค.
๋ค์๋ฒ์ ์ปค๋ฐ ๋ฉ์ธ์ง๋ฅผ ์ข ๋ ์๊ฒ ๋๋๊ณ , ๋ฌด์์ ์ด๋ป๊ฒ ์์ ํ๋์ง์ ๋ํด ์์ธํ๊ฒ ์ ์ด์ผ๊ฒ ๋ค.
์ง๋ ์ฃผ์ ์ฝ๋ ๋ฆฌ๋ทฐ๋ฅผ ๋ฐ์ํ์ฌ ์ด๋ฒ ์ฃผ ๊ณผ์ ์๋ ์ ์ฉํ๋ค. ๋๋ฆ ๊น๋ํ ์ฝ๋๋ฅผ ์ง ๋ค๊ณ ์๊ฐํ๋๋ฐ ์ฌ์ ํ ๋ด ๊ธฐ์ค์ผ๋ก ๋ณด๊ธฐ ํธํ ์ฝ๋๋ฅผ ์์ฑํ๋ค๋ ๊ฒ์ ์ ์ ์์๋ค.
error, element, event ๋ฅผ ๋ชจ๋ e ๋ก ์ทจํฉ์ํจ๋ค๋ ๊ฐ... ๐ค
ํ ํธ์ผ๋ก ๋์๊ฒ ์ค๋งํ์ง๋ง ๋ ํ ํธ์ผ๋ก ์ด๋ ๊ฒ ๋ ํ๋จ๊ณ ๋ฐฐ์๋๊ฐ๋๊ตฌ๋ ์ถ์๋ค.
ํฌ๋ ๋ฆฌ์คํธ๋ ํ๋ก ํธ ์๋๋ฅผ ์ฒ์ ๊ณต๋ถํ๊ธฐ ์์ํ๋ฉฐ JS ๋ก ๊ฐ๋จํ ๋ง๋ค์ด ๋ณธ ์ ์ด ์์๊ณ , ํด๋น ๊ณผ์ ์ ๋ธ๋ก๊ทธ์ ๋จ๊ฒจ๋์๋ค.
์๋ ์ ๋ง๋ ํฌ๋ ๋ฆฌ์คํธ ์ฝ๋์ ์ค๋ช ์ ๋ณด๋ฉด์ ๊ทธ๋๋ 1๋ ์ฌ์ด ๊ณต๋ถ๋ฅผ ํ๋๊ฒ ํ ๊ฑด ์๋๊ตฌ๋, ํ๊ณ ์๊ฐํ๋ค. ํ ํธ์ผ๋ก ์ ์ ์๊ธฐ์ ๋น์ฐํ ๊ฒ๋ค์ ์์ง ๋ชปํ์๊น ํ๋ ์๊ฐ์ด ๋ค๊ธฐ๋ ํ๋ค. ์๋ง 1๋ ๋ค์ ๋๋ ๋ ์ง๊ธ์ ๋๋ฅผ ๋ณด๋ฉฐ ๋น์ทํ ์๊ฐ์ ํ ์ง๋ ๋ชจ๋ฅด๊ฒ ๋ค.
์ด๋ฏธ์ง๋ ๊ฐ์ด ์ ๋ฆฌ๋์ด ์์ด์ ๊ธ ๋ณด๊ธฐ๊ฐ ํธํ์ด์!
์ ๋ ์ํ ๊ด๋ฆฌ๊ฐ ๋๋ฌด ๋๋ฌด ์ด๋ ค์ ์๋๋ฐ.... ๋ฆฌํฉํ ๋ง ์ด์ฌํ ํด์ผ๊ฒ ์ด์...