์ฃผ์ ์์
- history์ค๊ณ โ
2024-09-03
- history ํ ์ด๋ธ ์ค๊ณ
- action๋ณ history์ ๋ํด ๋ ์ฝ๋ ์ถ๊ฐ ์ค์
- ๊ฐ card ๋ฉ์๋์ ๋ํ history ์ ๋ฐ์ดํธ ๋ก์ง
- ์ฟ ํค์ ์ธ์ ํ์ต โ 2024-09-03
- ์๋ฒ ๋ก๊ทธ์ธ ์์
โ
2024-09-04
- ์๋ฒ์์ passport ์ฌ์ฉํ์ฌ ๋ก๊ทธ์ธ ๋ฐ ์ธ์ ๊ด๋ฆฌ(์งํ์ค)
ํ์ต ํค์๋
- XSS ๊ณต๊ฒฉ
- sql Trigger
- ์ฟ ํค์ ์ธ์
ํ์ต์ ๋ฆฌ ์ข ํฉ๋ณธ
https://luxurious-share-af6.notion.site/3-1f7fcdb0591241f487bdfa6f74f1200a?pvs=4
์คํ ๋ฐฉ๋ฒ
์คํ์ ๊ฒฝ์ฐ
npm install
npm start๋ฅผ ํตํด ์คํํ์๋ฉด ๋ฉ๋๋ค!(.env ํ์ผ์ ๊ฒฝ์ฐ๋ ์ฌ๋์ผ๋ก ์ก๋ถ๋๋ฆฌ๊ฒ ์ต๋๋ค)
๊ณ ๋ฏผ ๋ฐ ํด๊ฒฐ๊ณผ์
undo, redo๋ฅผ ๊ณ ๋ คํ history ์ ์ฅ ๊ด๊ณ
์ด์ ์ฌ๋ฆฐ PR์์๋ Undo, Redo๋ฅผ ๊ณ ๋ คํ history์ ์ ์ฅ ๊ด๊ณ์ ์ด์ ๋ํด์ undo์ redo๋ฅผ ์ด๋ป๊ฒ ์ํํ ๊ฒ์ธ๊ฐ์ ๋ํ ๊ณ ๋ฏผ์ ์ ์์ต๋๋ค.
1. mysql ์์ฒด์์ ํธ๋ฆฌ๊ฑฐ๋ฅผ ์ฌ์ฉํ ํ์คํ ๋ฆฌ ๊ธฐ๋ก
- Mysql์์ ์ง์ํ๋ ํธ๋ฆฌ๊ฑฐ(Trigger)์ ํน์ ์กฐ๊ฑด์ด ๋ง์กฑํ๋ฉด ์ ์ ๋ก ์คํ๋๋ ์ผ์ข
์ ์ฅ์น๋ก, ํ๋ฒ ์ค์ ์ ํด๋์ผ๋ฉด ์ด๋ฒคํธ๋ฆฌ์ค๋์ ๋น์ทํ ๋ฐฉ์์ผ๋ก ๋์์ ๊ณ์ ๊ฐ์ํ๋ฉด์ ์กฐ๊ฑด์ ํด๋นํ๋ ๋์์ด ์ํ๋๋ ์๊ฐ ์คํ๋๋ ํน์ง์ ๊ฐ์ง๋ค.
- ํธ๋ฆฌ๊ฑฐ๋ฅผ ์ฌ์ฉํ์ฌ ํ์คํ ๋ฆฌ๋ฅผ ๊ธฐ๋กํ ๋, ํ์คํ ๋ฆฌ๋ ์๋์ผ๋ก ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ถ๊ฐ๋๊ธฐ ๋๋ฌธ์ undo, redo๋ฅผ ๊ณ ๋ คํ๋ ์
์ฅ์์ ์ด๋ฅผ ์ค๊ณํด๋ณด์๋ฉด
- undo, redo๋ฅผ ์ํํ๋ฉด ํ์คํ ๋ฆฌ์์ ํด๋นํ๋ ์ ์ ์ ํ์คํ ๋ฆฌ์์ ๊ฐ์ฅ ์ต๊ทผ์ ํ์คํ ๋ฆฌ๋ฅผ ์ ๊ฑฐํ๋ค.
- ํ์คํ ๋ฆฌ๊ฐ ์ ๊ฑฐ๋ ๋ ์คํ๋๋ ํธ๋ฆฌ๊ฑฐ๋ฅผ ๋ฑ๋กํ์ฌ ํธ๋ฆฌ๊ฑฐ๋ฅผ ํตํด history์ undo๋ฅผ ์ํํ๋ค.
- ๊ทธ๋ฌ๋ redo๋ฅผ ์ํํ ๋๋ ์ง๊ธ ์๊ฐํ ์ ๋๋ก๋ history์ ๋ํ History ํ
์ด๋ธ์ ๋ค์ ๋ง๋๋ ๋ฐฉ๋ฒ๋ฐ์๋ ์๊ฐ๋์ง ์๋๋ฐ, history ํ
์ด๋ธ์ ๋ ๊ฐ ๋๋ ๊ฒ์ด ์์์์ผ๋ก๋ ๊ด์ฐฎ์ ๋ณด์ด์ง ์์์ ๊ณ ๋ฏผ์ด๋ค.
2. ์จ๋ฉ๋ชจ๋ฆฌ์์ deque๋ฅผ ํตํ history ์ ์ฅ
- mysql์ ํธ๋ฆฌ๊ฑฐ๋ฅผ ์ฌ์ฉํ์ง ์๊ณ ๋ฐ๋ก history์ Insert๋ฅผ ํตํด์ ๋ฃ์ด์ฃผ๋ ๋ฐฉ์์ด๋ค.
- deque์์ 5๊ฐ์ ๊ฐ์์ ํ์ ๋๊ณ , action์ด ์ด๋ฃจ์ด์ง ๋๋ง๋ค ํ๋์ฉ pushํด์ฃผ๋, ๊ฐ์๋ฅผ ๋์ด๊ฐ๋ฉด ํ๋์ฉ dequeueํด์ฃผ๋ฉด์ ์ด์ ๋ํด ์ค์ง์ ์ผ๋ก db์ ๋ฐ์ํด์ฃผ๋ ๋ฐฉ์์ด๋ค.
- ์ด๋ ๊ฒ ์ค๊ณํ ๊ฒฝ์ฐ, ์จ๋ฉ๋ชจ๋ฆฌ์์ deque๋ฅผ ํ๋ ๋๊ณ Undo์ redo์ ๋ํด์ action๋ง๋ค ์ํํ๋ ๋ก์ง์ ๋ธ๋ผ์ฐ์ ์์ ๋๊ณ ๊ด๋ฆฌํ๊ฒ ๋๋ค.
- ์ผ๋ฐ์ ์ผ๋ก undo, redo๋ ์๋ก๊ณ ์นจ์ด๋ ์ฐฝ์ ๋๊ฐ๋ค๊ฐ ๋ค์ ์ ์ํ ์์ ์์ด์ง๊ฒ ๋๋ฏ๋ก, ์๋ก๊ณ ์นจ์ด๋ ์ฐฝ ๋ซ๊ธฐ ๋ฑ์ ํ์๋ฅผ ์ด๋ฒคํธ๋ฆฌ์ค๋๋ฅผ ๋ฑ๋กํด๋๊ณ ์๋ค๊ฐ ํด๋น ์ด๋ฒคํธ๊ฐ ๋ฐ์ํ๋ฉด flush๋ฅผ ํตํด์ ๋ชจ๋ history์ ๋ด์ฉ์ ๋ฐ์ํ๋ ๋ก์ง์ผ๋ก ์๋์ํจ๋ค.
- ํ์ง๋ง ์ด๋ฌํ ๋ฐฉ์์ผ๋ก ๊ฐ ๊ฒฝ์ฐ, history์ ๋ํ ์์ธ ๋ก์ง์ด ์ด๋ฃจ์ด์ง์ง ์์ ๋ง์ฝ ์ฐฝ์ ๊ป์ ์์ ์ด๋ฒคํธ๊ฐ ์ ๋๋ก ๋์ํ์ง ์๋๋ค๋ฉด history์ ๊ฐฑ์ ์ด ์ด๋ฃจ์ด์ง์ง ์์ผ๋ฏ๋ก ์ด๋ db์ ์์์ ์ผ์ผํจ๋ค.
3. db์ action๋๋ง๋ค ์ง์ ๋ฃ๋, ํ๋์ฉ ๋นผ์ undo, redo
- ์ด ๊ฒฝ์ฐ, action์ ๋ํ api ํธ์ถ์ ํ๋ฉด์ ํด๋น api๋ฅผ ์ฒ๋ฆฌํ๋ ๋ก์ง์์ ํ์คํ ๋ฆฌ ์
๋ฐ์ดํธ + aciton์ ๋ํ ์ํ ์์ฒด๋ฅผ ํ๋์ ํธ๋์ญ์
์ผ๋ก ์ธ์ํ์ฌ ์ฌ์ฉํด์ผ ํ๋ค.
- ๊ฐ๊ฐ์ action์ ๋ํ ํ์คํ ๋ฆฌ์ ๋ ์ฝ๋๋ฅผ ์ง์ ์ฟผ๋ฆฌ๋ฌธ์ ํตํด ๋ฃ์ด์ค๋ค.
- redo์ ๊ฒฝ์ฐ undoํ ๊ฒ์ ๋นผ์ ์จ๋ฉ๋ชจ๋ฆฌ์์ stack ํ์์ผ๋ก ์ ์ฅํ๊ณ ์๋ค๊ฐ ๋ค์ ์คํํ ๊ฒฝ์ฐ ์ด์ ๋ํ ๋ก์ง์ ์ค๊ณํ์ฌ ๋ค์๊ธ ๋์๊ฐ ์ ์๋ค.
- redo์ ๊ฒฝ์ฐ ๊ตณ์ด ์๋ก๊ณ ์นจ์ด๋ ์ฐฝ์ ๊ป์ ๋, ๋ณต๊ตฌ์ํฌ ์๋ฌด๋ ์๋ค๊ณ ์๊ฐํ๋ค. undo ๋ํ db์์ ๊ณ์ ๋์ด๋ค๊ฐ ๋ณต๊ตฌํ ์๋ ์๊ฒ ์ง๋ง์ ๊ตณ์ด ์ด๊ฑธ ์ ๋ถ ํ ์ ์๋๋ก ํ์ฉํด์ฃผ๋ฉด db์ ๋ถ๋ด์ด ๊ฐ ์ ์๊ธฐ ๋๋ฌธ์ ๋ธ๋ผ์ฐ์ ๋ด๋ถ์์ ๊ฐ์๋ฅผ ์ ํด๋๊ณ ์ด๋ฅผ ๋ง๋ ๋ฐฉ์์ด ๋์ ๊ฒ ๊ฐ๋ค๊ณ ํ๋จํ๋ค.
- ๋๋ ํ์คํ ๋ฆฌ์ action์ ์ํ์ด ํ๋์ ํธ๋์ญ์
์ผ๋ก ํ๋จํด์ผ๋ง ์ ์์ ์ธ db์ ๊ฐฑ์ ์ด ์ด๋ฃจ์ด์ง๊ธฐ ๋๋ฌธ์ ์ด ๋ฐฉ์์ด ์ ์ผ ํฉ๋ฆฌ์ ์ด๋ผ๊ณ ์๊ฐํ๋ค.
๊ทธ๋ ์๊ฐํ ๋ฐฉ์์ ์ธ ๊ฐ์ง๊ฐ ์์๋๋ฐ์,
- mysql ์์ฒด์์ ํธ๋ฆฌ๊ฑฐ๋ฅผ ์ฌ์ฉํ ํ์คํ ๋ฆฌ ๊ธฐ๋ก
- ์จ๋ฉ๋ชจ๋ฆฌ์์ deque๋ฅผ ํตํ history ์ ์ฅ
- db์ action๋๋ง๋ค ์ง์ ๋ฃ๋, ํ๋์ฉ ๋นผ์ undo, redo
์ฒ์์๋ ํ์คํ ๋ฆฌ์ action ์์ฒด๊ฐ ํ๋์ ํธ๋์ญ์ ์ด๋ผ๊ณ ์๊ฐํด์ผ ํ๋ค๊ณ ์๊ฐํ๊ธฐ ๋๋ฌธ์ ์ด๋ฅผ ๋ณด๋ค ์ธ์ฌํ๊ฒ ๊ด๋ฆฌํ ์ ์๋ 3๋ฒ์ ๊ณ ๋ฏผํ์์ต๋๋ค. 2๋ฒ์ ๋ฐฉ์์์ data flush์ ๋ํ ์ํ์ฑ์ ์ค์ธ ๋ฒ์ ์ด๊ธฐ ๋๋ฌธ์ ๋๋ค.
ํ์ง๋ง ๊ทธ๋ผ์๋ ๋ถ๊ตฌํ๊ณ ์จ๋ฉ๋ชจ๋ฆฌ๋ก history์ ๋ํด์ ๊ด๋ฆฌํ๋ ๊ฒ์ ๋ํ ๋ถ๋ด์ ์์ ํ ์ ๊ฑฐํ๊ธฐ๋ ์ด๋ ต๋ค๊ณ ์๊ฐํฉ๋๋ค. ์ธ๋ถ์ ์ธ history ๋ด์ญ์ ์จ๋ฉ๋ชจ๋ฆฌ๋ก ๊ด๋ฆฌํ๋ ๊ฒ์ด ๊ณผ์ฐ ์์ ํ๋ค๊ณ ํ ์ ์์๊น? ์ ์๋ฌธ์ ๊ฐ์ก์ต๋๋ค. ๋ฉ๋ชจ๋ฆฌ์ ์๋ history์ ๋ด์ฉ์ด ๋ณ๊ฒฝ๋ ๊ฐ๋ฅ์ฑ๋ ํฌํจํ๊ณ ์๊ธฐ ๋๋ฌธ์ ๋ฐ์ดํฐ์ ์ผ๊ด์ฑ์ ์ ์งํ๊ธฐ ์ด๋ ต๋ค๋ ์ ๊ณผ ๋ธ๋ผ์ฐ์ ์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ๋ญ๋นํ๋ ๊ฒ ์์ฒด๊ฐ ๋นํจ์จ์ ์ผ๋ก ๋๊ปด์ง๊ธฐ ๋๋ฌธ์ ๋๋ค.
๊ทธ๋์ ์ด์ ๋ํ ํด๊ฒฐ์ฑ ์ผ๋ก 1๋ฒ์ ๋ฐฉ์๊ณผ 3๋ฒ์ ๋ฐฉ์์ ํฉ์ณ ํ์ฉํ๋ ๋ฐฉ์์ด ์ด๋จ๊น ์๊ฐํ์ต๋๋ค. action์ด ์ผ์ด๋๋ฉด mysql ์์ฒด์์ ํธ๋ฆฌ๊ฑฐ๋ฅผ ์ฌ์ฉํ ํ์คํ ๋ฆฌ ๊ธฐ๋ก์ ์ ๋ฐ์ดํธ ํ๊ณ , ํ์คํ ๋ฆฌ๋ฅผ db์์ ํ๋์ฉ ๋นผ์ด ์ฐ๋ ํํ์ ๋๋ค.
ํธ๋ฆฌ๊ฑฐ๋ฅผ ์ฌ์ฉํ์ฌ ํ์คํ ๋ฆฌ๋ฅผ ๊ธฐ๋กํ ๋, ํ์คํ ๋ฆฌ๋ ์๋์ผ๋ก ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ถ๊ฐ๋๋๋ก ํด๋๊ณ , undo, redo๊ฐ ๋์ค์ ์ถ๊ฐ๋ ๊ฒฝ์ฐ์๋ ํด๋น ์ ์ ์ ํด๋นํ๋ ํ์คํ ๋ฆฌ๋ฅผ undoํ ๊ฒฝ์ฐ์๋ ๊ฐ์ฅ ์ต์ ์ ํ์คํ ๋ฆฌ๋ฅผ db์์ ๋นผ๋ด์ด ์ด์ ๋ํ action์ ๋๋๋ฆฌ๋ ์ฝ๋๋ฅผ ์์ฑํ๋ฉด ๋ ๊ฒ ๊ฐ๊ณ , redo์ ๊ฒฝ์ฐ์๋ ์ด์ฐจํผ action์ ๋๋๋ฆฌ๋ ์ฝ๋๋ฅผ ์ธ ๊ฒฝ์ฐ ๋ํ action์ด card์ ์ด๋ฃจ์ด์ง ๊ฒ์ด๊ธฐ ๋๋ฌธ์ ์ด๋ฅผ ๋ค์๊ธ ๋นผ๋ด์ด undo๋ฅผ undo ํ๋ ๋ฐฉ์์ผ๋ก ํ๋ฉด ๋ ๊ฒ ๊ฐ๋ค๊ณ ์๊ฐํ์ต๋๋ค.
์๋๋ ์ ๊ฐ ์์ฑํ ํธ๋ฆฌ๊ฑฐ์ ๋๋ค.(mysql workbench์์ ์ํํ์ต๋๋ค)
delimiter $$
create trigger todo_submit_history
after insert on todo_cards
for each row
begin
insert into history (username, card_id,action, column_name, title)
values(NEW.author,new.card_id,"submit", NEW.task_column, NEW.title);
end$$
delimiter $$
create trigger todo_move_or_edit_history
after update on todo_cards
for each row
begin
if OLD.task_column != NEW.task_column then
insert into history(username, action, card_id,title, from_column, to_column)
values(OLD.author, "move", old.card_id, old.title,old.task_column, new.task_column);
else
insert into history(username,card_id,action,title,detail)
values(old.author,old.card_id,"edit", old.title, old.detail);
end if;
end$$
delimiter $$
create trigger todo_delete_history
after delete on todo_cards
for each row
begin
insert into history(username,card_id, title, detail, column_name, created_at)
values(old.author, old.card_id, old.title,old.detail,old.task_column,old.created_at);
end$$์ด๋ฌํ ๊ณ ๋ฏผ ๊ณผ์ ์์ ์ ๊ฐ ๋๋ฆฌ๊ณ ์ถ์ ์ง๋ฌธ์, ์ ๊ฐ ์ ํํ ๋ฐฉ๋ฒ์ด ํจ์จ์ ์ด๊ณ ์์ ํ๊ฐ?์ ๋ํด ์ฌ์ญ๊ณ ์ถ์ต๋๋ค. undo์ redo๋ฅผ ๊ณ ๋ คํ์ฌ trigger๋ฅผ ์ค๊ณํ์ง๋ง, ์๋ฒ -> db์์ ํ๋์ฉ ๊บผ๋ด์ด ํด๋น action์ ๋ง์ถ undo ๋ก์ง -> ๋ค์ ์๋ฒ๋ก ๋ฐ์ํ๋ ๊ณผ์ ์์ db์ ๋ํ ๋ถ๋ด์ด ์๋๊ฐ?์ ๋ํ ์๋ฌธ์ด ์ ๋๋ก ํด์๋์ง ๋ชปํ ์ํ์
๋๋ค. ์ด์ ๋ํด์ ํผ๋๋ฐฑ ํด์ฃผ์๋ฉด ๊ฐ์ฌํ๊ฒ ์ต๋๋ค!
ํด๋ผ์ด์ธํธ ์ฌ์ด๋ ๋ ๋๋ง์ ๋ฐ๋ฅธ ๋ฆฌ๋ ๋๋ง ๋ก์ง
ํด๋ ๊ตฌ์กฐ ์ค๋ช
์ ๋ ํ๋ค๋ณด๋ ๋๋ ํ ๋ฆฌ๊ฐ ๋๋ฌด ๋ง์์ง ํ์ ๊ตฌ๋ถํ์๊ธฐ ํ๋์ค ์ ์์ผ์ค ๊ฒ ๊ฐ์ ๊ฐ๋จํ ๋ง์๋๋ฆฌ๋ ค ํฉ๋๋ค. ์ ๋ ํด๋ผ์ด์ธํธ ์ฌ์ด๋ ๋ ๋๋ง์ ๋ง์ด ํ์ฉํ๊ณ ์ ๊ฐ๊ฐ์ ์ปดํฌ๋ํธ๋ค์ ๋ํด์ fsd ํจํด์ ์ฐธ๊ณ ํ์ฌ ์ปดํฌ๋ํธ๋ค์ ํด๋๋ณ๋ก ๋๋ ๋ค์ ๋ค์๊ธ ํด๋น ์ปดํฌ๋ํธ์ ํ์ํ api๋ ์คํ์ผ์ํธ ๋ฑ์ ๋ํด์๋ ๊ฐ๊น์ด ์๋ฆฌ์ ๋ฐฐ์นํ๊ณ , ์ด๋ฒคํธ ์์์ ํตํ ๋ก์ง์ feature์ ํฐ ์ปดํฌ๋ํธ(widget)๋ณ๋ก ๊ตฌ๋ถํ ๋ค index๋ฅผ ํตํด ์คํฌ๋ฆฝํธ๋ฅผ ํตํฉํ์ฌ ๋ถ๋ฌ์ค๋ ๋ฐฉ์์ผ๋ก ์ค๊ณํ์์ต๋๋ค.
์ ์ฒด์ ์ธ ๋๋ ํ ๋ฆฌ ๊ตฌ์กฐ๋ ์๋์ ๊ฐ์ต๋๋ค.
๐ฆviews
โฃ ๐app
โ โฃ ๐app.css
โ โฃ ๐app.js
โ โ ๐app.scss
โฃ ๐asset
โฃ ๐entities
โ โฃ ๐addTodo
โ โ โฃ ๐api
โ โ โฃ ๐style
โ โ โฃ ๐template
โ โ โ ๐index.js
โ โฃ ๐card
โ โ โฃ ๐api
โ โ โฃ ๐component
โ โ โฃ ๐style
โ โ โฃ ๐template
โ โ โ ๐index.js
โ โฃ ๐history
โ โ โฃ ๐script
โ โ โฃ ๐style
โ โ โฃ ๐ui
โ โ โ ๐index.js
โ โฃ ๐historyItem
โ โ โฃ ๐api
โ โ โฃ ๐style
โ โ โฃ ๐ui
โ โ โ ๐index.js
โ โ ๐section
โ โ โฃ ๐api
โ โ โฃ ๐component
โ โ โฃ ๐style
โ โ โ ๐index.js
โฃ ๐feature
โ โฃ ๐header
โ โ โฃ ๐historyHandler.js
โ โ โฃ ๐index.js
โ โ โฃ ๐rendering.js
โ โ โ ๐sortHandler.js
โ โฃ ๐mainsection
โ โ โฃ ๐addCardHandler.js
โ โ โฃ ๐deleteCardHandler.js
โ โ โฃ ๐editCardHandler.js
โ โ โฃ ๐index.js
โ โ โฃ ๐moveCardHandler.js
โ โ โ ๐rendering.js
โ โ ๐index.js
โฃ ๐pages
โ โ ๐main
โ โ โฃ ๐css
โ โ โฃ ๐ui
โ โ โ ๐index.js
โฃ ๐shared
โ โฃ ๐deleteConfirm
โ โ โฃ ๐component
โ โ โฃ ๐css
โ โ โ ๐index.js
โ โฃ ๐fab
โ โ โฃ ๐style
โ โ โ ๐index.js
โ โฃ ๐utils
โฃ ๐widgets
โ โฃ ๐header
โ โ โฃ ๐component
โ โ โฃ ๐style
โ โ โ ๐index.js
โ โ ๐mainsection
โ โ โฃ ๐api
โ โ โฃ ๐style
โ โ โฃ ๐ui
โ โ โ ๐index.js
โ ๐index.pug
์๋ฅผ ๋ค์ด, ๊ฐ๊ฐ์ section๋ค์ ๋ถ๋ฌ์ค๋ mainsection์ ๊ฒฝ์ฐ, /widgets/mainsection/index.js์์ ํด๋น ํ๋ ํ์ ์ปดํฌ๋ํธ๋ค์ ์์กด ๊ด๊ณ๋ก ๋ฌถ์ด ๋ ๋๋ง ํ๋ ๋ฐฉ์์ผ๋ก ์ค๊ณํ์ต๋๋ค.
// /widgets/mainsection/index.js
import section from "/entities/section/index.js";
import pug from "/shared/utils/pugCompile.js";
function Mainsection() {
const template = `style
| @import url('/widgets/mainsection/style/mainsection.css')
main#sections`;
function render() {
const mainsection = pug.compileHTML(template);
document.getElementById("html__body--pageContainer").innerHTML +=
mainsection;
section.render();
}
return {
render,
};
}
const mainsection = new Mainsection();
export default mainsection;
๊ทธ๋ ๊ธฐ ๋๋ฌธ์ mainsection์ ๋ ๋๋ง์ํค๋ ํจ์๋ฅผ ๋ง๋ค์ด ํด๋น ํจ์์์๋ ๊ธฐ์กด์ pug ํ์ผ์ ์ปดํ์ผํ์ฌ ๋ฐํ๋ HTML element๋ค์ DOM Api๋ฅผ ํตํด ์ง์ ์ง์ ํ ์์น์ ๊ทธ๋ ค๊ฐ๋๋ค.
// entities/section/index.js
import fetch from "./api/index.js";
import card from "/entities/card/index.js";
import addTodo from "/entities/addTodo/index.js";
function Section() {
const template = `style
| @import url('/entities/section/style/section.css')
section(id=section.classify)
.main__div--topbar
.section__div--titleWrapper
span.titleWrapper__span--title #{section.classify}
span.titleWrapper__span--count #{section.cards.length}
.section__div--buttonWrapper
img(src="/asset/plus.svg", alt="add", data-action="add", data-target=section.classify)
img(src="/asset/close.svg", alt="delete")
ul.todoList`;
async function render() {
const { data, path } = await fetch();
console.log(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);
card.render(document.getElementById(section.classify), section.cards);
});
}
return {
render,
};
}
const section = new Section();
export default section;
์ด๋ ๊ฒ ๋ ๋๋ง ์ค๊ฐ์ ๋ฐ์ดํฐ๋ฅผ fetchingํด์์ผ ํ๋ ๋ถ๋ถ์ ์ปดํฌ๋ํธ๋ง๋ค ์ค์ ํ์ฌ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์จ ํ์ ๊ฐ์ ธ์จ ๋ฐ์ดํฐ๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ๋ ๋๋งํ๊ฒ ๋ฉ๋๋ค. ๋ง์ฝ ์นด๋ ์ถ๊ฐ๋ ์ญ์ ์ ๊ฐ์ ํ์ ๋ํ ์ด๋ฒคํธ๋ฅผ ํธ์ถํ๋ฉด ํด๋น section ์ ์ฒด๋ฅผ ์ ํจ์์ render() ํจ์๋ฅผ ํตํด์ ๋ฆฌ๋ ๋๋งํ๋ ๋ฐฉ์์ ๊ตฌ์ํ์ฌ ๊ตฌํํด ๋ณด์์ต๋๋ค.
์ ๊ฐ ์ํ๋ ๋๋ก ์ปดํฌ๋ํธ๋ง๋ค ๊ฐ๊ฐ์ ๋ํด ๋ฐ์ดํฐ๋ฅผ json ํ์์ผ๋ก ๊ฐ์ ธ์ค๊ณ , ๋ฐ์์จ ๋ฐ์ดํฐ๋ฅผ ๊ธฐ๋ฐ์ผ๋ก templating ๋ฐ painting ์์ ์ ํด๋ผ์ด์ธํธ์์ ํ๋ค๋ ์ ์์ ํด๋ผ์ด์ธํธ ์ฌ์ด๋ ๋ ๋๋ง์ด ์ด๋์ ๋ ๊ตฌํ๋์๋ค๊ณ ์๊ฐํฉ๋๋ค.
ํ์ง๋ง ํด๋ผ์ด์ธํธ ์ฌ์ด๋ ๋ ๋๋ง ๋ฐฉ์์ ์ฌ์ฉํจ์ ์์ด์ ๊ณ ๋ฏผ์ด ์์์ต๋๋ค.
๋ฆฌ๋ ๋๋ง์ ๊ฒฝ์ฐ DOM API๋ฅผ ์ฌ์ฉํด์ ๋ค์๊ธ ์ด๊ธฐํํ๊ณ ๊ทธ๋ ค๋ด๋ ๋ฐฉ์ ์์ฒด๊ฐ ๋๋ฌด rawํ๋ค๋ ์๊ฐ์ด ๋ค์์ต๋๋ค.
DOM ์์ ์ ๊ฒฝ์ฐ ๊ณ ๋น์ฉ์ธ๋ฐ ๋ฐํด ์ด๋ฅผ ๊ณ์ ๋ฐ์ดํฐ ๊ฐฑ์ ์ด ์ด๋ฃจ์ด์ง ๋๋ง๋ค ๋ค์๊ธ http ์์ฒญ์ ๋ณด๋ด๊ณ ๋ ๋๋ง ๋จ์์ธ ์ ์ฒด column์ ๋ํด ๋ฆฌ๋ ๋๋งํ๋๊ฒ์ด ์์ ๋ญ๋น๋ผ๊ณ ์๊ฐ์ด ๋ค์์ต๋๋ค. ํ์ง๋ง ์ด๋ฌํ ๋น์ฉ์ ์๋ผ๊ณ ์ ์นด๋ ์ถ๊ฐ, ์ญ์ ์ ๊ฐ์ ๊ฒฝ์ฐ ๋ฐ์์จ json ๋ฐ์ดํฐ๋ฅผ ํตํด ํ๋๋ง์ ์นด๋๋ฅผ ์ถ๊ฐํ๊ฑฐ๋ ์ญ์ ํ๋ softํ ๋ฐฉ์์ ์ถ๊ฐ๋ ์ญ์ ์ ๊ฒฝ์ฐ ๋์ ์ ๊ทผํด์ ์์ ์ด๋ ๋ค๋ฅธ ๊ณณ์์ ๊ฐ์ ๊ณ์ ์ column์ ์์ ์ ๋ํด ๋ฐ์์ฌํญ์ ๋ถ๋ฌ์ค์ง ๋ชปํ๋ค๋ ์ ์์ ์ ์ฒด์ ์ธ column์ ๋ฐ์ดํฐ๋ฅผ ๋ค์ getํด์์ ๋ฆฌ๋ ๋๋ง ํ๋ ๊ฒ์ด ํฉ๋ฆฌ์ ์ด๋ผ๋ ์๊ฐ ๋ํ ๋ค์ด ์ด๋ค ๋ฐฉ์์ด ๋ ๋ง์๊น์ ๋ํ ๊ณ ๋ฏผ์ด ๊ณ์ ๋๋ ๊ฒ ๊ฐ์ต๋๋ค. ์ด์ ๋ํ ๋ฉํ ๋์ ๊ณ ๊ฒฌ์ ์ฌ์ญ๊ณ ์ถ์ต๋๋ค!