์ฃผ์ ์์
- ์ฃผ๊ฐ๊ณํ์ ์์ฑ
- ํ๋ก์ ํธ ์ด๊ธฐ์ธํ (์์กด์ฑ ์ค์น, ํด๋๊ตฌ์กฐ, sass ๋ณ์ ์ค์ )
- ๊ธฐ๋ณธ ๋ฉ์ธ ํ์ด์ง ๊ตฌ์กฐ html ์์ฑ
- ์นด๋ ์ปดํฌ๋ํธ ๊ตฌ์กฐ ์ ์
ํ์ต ํค์๋
- FSD
- SCSS์ SASS
- bem ๋ฐฉ๋ฒ๋ก
- Web Component
- shadow DOM
- template๊ณผ slot
ํ์ต์ ๋ฆฌ https://luxurious-share-af6.notion.site/1-baed698a7b3c40bbbd6b94fb1097dc42?pvs=4
๊ณ ๋ฏผ๊ณผ ํด๊ฒฐ๊ณผ์
FSD ํจํด์ ๊ณ ๋ คํ ํด๋๊ตฌ์กฐ
ํด๋ ๊ตฌ์กฐ๋ฅผ ์ฐพ์๋ณด๋ ์ค ์ด์ ์๋ ํญ์ ๋ฆฌ์กํธ ํ๋ก์ ํธ๋ฅผ ํ๊ธฐ ๋๋ฌธ์ ๋๋ถ๋ถ ๋ง์ด ์ฐ๋ hooks, server, pages, components ๋ฑ์ผ๋ก ๋๋ด๋ ํด๋ ๊ตฌ์กฐ๊ฐ ์ฌ๊ธฐ์ ์ ์ฉํ๊ธฐ ์ด๋ ต๊ฒ ๋ค๊ณ ํ๋จํ์ฌ ๋ค๋ฅธ ํด๋๊ตฌ์กฐ๋ฅผ ์ฐพ๋ ์ค ์ฌ๋์์ ๋ค๋ฅธ ์บ ํผ๋ถ์ด FSD ํจํด์ ์ถ์ฒํด์ฃผ์
จ๋ค.
ํ์ง๋ง ์ด๋ฅผ ๋ด ํ๋ก์ ํธ์ ์ ์ฉ์ํค๋ ๊ณผ์ ์์ ์ด๋ป๊ฒ ํด๋๊ตฌ์กฐ๋ฅผ ์ก์์ผ ํ ์ง ๊ณ ๋ฏผ์ด ๋ง์ด ๋์๋ค.

์ ์ฒด์ ์ผ๋ก๋ app, pages, processes, pages, widgets, features, entitites, shared๊ฐ ์์์ง๋ง ๋ด ํ๋ก์ ํธ์์ ์ด๋ฅผ ๋ชจ๋ ์ฐ๊ธฐ์๋ ๋๋ฌด ๊ณผํ๋ค๋ ์๊ฐ์ด ๋ค์ด ์ ๋ง ํ์ํ ๊ฒ ๊ฐ์ 4๊ฐ์ง๋ฅผ ๊ณจ๋๋ค.
- app
- ์ ํ๋ฆฌ์ผ์ด์ ์ ์์์
- entities
- ๋ค์ํ ๋ฐ์ดํฐ๋ฅผ ์๋ฒ์ ํต์ ํ ์ ์๋๋ก ์ค์
- pages
- ๊ฐ ํ์ด์ง๋ฅผ ๋ด์ ๋๋ ํ ๋ฆฌ(๋ฉ์ธ๋ฐ์ ์๊ธด ํ์ง๋ง ๋ณด๋ค ๊ฐ๋ ์ฑ์ ์ํด ์ถ๊ฐํ๋ค)
- shared
- ๊ณตํต ์คํ์ผ
- ๊ณตํต ์ปดํฌ๋ํธ
์น ์ปดํฌ๋ํธ์ ์ฌ์ฉ
์ฌ์ค์ ์ด์ ๊น์ง๋ ๋ฆฌ์กํธ๋ง ์ฃผ๋ก ์ฌ์ฉํ๊ธฐ ๋๋ฌธ์ ์น ์ปดํฌ๋ํธ๋ฅผ ์ฌ์ฉํ ๊ธฐํ๊ฐ ์์๋ค. ์ฌ์ค ๊ธฐํ๊ฐ ์์์ด๋ ํผํ์๋ ๊ฒ ๊ฐ๋ค. ๊ธฐ์กด HTMLElement๋ฅผ ์์ํ๋ ๊ฐ์ฒด๋ฅผ ๋ง๋ค์ด shadowDOM์ ํตํด ๋ ๋๋ง์ํค๋ ๋ก์ง ์์ฒด๊ฐ ๋์๊ฒ ๋๋ฌด ์์ํ์ฌ ์ดํด๊ฐ ์ ๋์ง ์์๊ธฐ ๋๋ฌธ์ด๋ค. ํ์ง๋ง ์ด๋ฒ์๋ ์๋ฌด๋๋ ํ๋์ ํ์ด์ง์ ์ ๋ง ๋ง์ html ์์๋ค์ด ๋ค์ด๊ฐ๋ ๋งํผ ์ปดํฌ๋ํธ๋ฅผ ์ฌ์ฉํด์ผ ํ ํ์๊ฐ ์๋ค๊ณ ์๊ฐํ๋ค. ํ์ง๋ง ๋ฆฌ์กํธ์ฒ๋ผ ์ปดํฌ๋ํธ๋ฅผ ๋ง๋ค ์ ์๋ ํ๊ฒฝ์ด ์๋๊ธฐ์ ์น ์ปดํฌ๋ํธ๋ฅผ ์ฌ์ฉํด๋ณด๊ธฐ๋ก ํ์๋ค.
class Card extends HTMLElement {
constructor() {
super();
this.attachShadow({ mode: "open" });
this.render();
}
get title() {
return this.getAttribute("title") || null;
}
get detail() {
return this.getAttribute("detail") || null;
}
get id() {
return this.getAttribute("id") || null;
}
connectedCallback() {
this.render();
}
render() {
this.shadowRoot.innerHTML = this.template({
title: this.title,
detail: this.detail,
id: this.id,
});
}
template(state) {
return `
<li>
<article>
<p>${state.title}</p>
<p>${state.detail}</p>
</article>
<aside>
<img src="../asset/close.svg" alt="delete" />
<img src="../asset/pen.svg" alt="edit" />
</aside>
</li>
`;
}
}
window.customElements.define("todo-card", Card);
ํ์ฌ๋ ๊ณจ๋๋ง ์ก์ ์ฒ์์ผ๋ก ๋ ๋๋ง์ ์์ผ๋ณด์๋ค. ์์ง๊น์ง๋ ์ด๋ฒคํธ๋ฅผ ์ฒ๋ฆฌํ๋ ๋ถ๋ถ์ด๋ ๋ฆฌ์คํธ ์ ๋ถ๋ฅผ ๋ ๋๋งํ์ง ๋ชปํ๋ ์ํ์ง๋ง ์ด ๋ถ๋ถ์ ๋ณด๋ค ๋ณด์ํ์ฌ ๊ฐ ์นด๋๋ค์ ๋ฆฌ์คํธ๋ฅผ ๋ ๋๋งํ๋ ์ปดํฌ๋ํธ๋ฅผ ๋ง๋ค๊ณ , ์ด๋ฅผ ๋ฉ์ธ ํ์ด์ง์์ ํ์ฉํ ๊ณํ์ด๋ค.