์ฃผ์š” ์ž‘์—…

  • ์ฃผ๊ฐ„๊ณ„ํš์„œ ์ž‘์„ฑ
  • ํ”„๋กœ์ ํŠธ ์ดˆ๊ธฐ์„ธํŒ…(์˜์กด์„ฑ ์„ค์น˜, ํด๋”๊ตฌ์กฐ, 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);
 

ํ˜„์žฌ๋Š” ๊ณจ๋Œ€๋งŒ ์žก์•„ ์ฒ˜์Œ์œผ๋กœ ๋ Œ๋”๋ง์„ ์‹œ์ผœ๋ณด์•˜๋‹ค. ์•„์ง๊นŒ์ง€๋Š” ์ด๋ฒคํŠธ๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ถ€๋ถ„์ด๋‚˜ ๋ฆฌ์ŠคํŠธ ์ „๋ถ€๋ฅผ ๋ Œ๋”๋งํ•˜์ง€ ๋ชปํ•˜๋Š” ์ƒํƒœ์ง€๋งŒ ์ด ๋ถ€๋ถ„์„ ๋ณด๋‹ค ๋ณด์™„ํ•˜์—ฌ ๊ฐ ์นด๋“œ๋“ค์˜ ๋ฆฌ์ŠคํŠธ๋ฅผ ๋ Œ๋”๋งํ•˜๋Š” ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋งŒ๋“ค๊ณ , ์ด๋ฅผ ๋ฉ”์ธ ํŽ˜์ด์ง€์—์„œ ํ™œ์šฉํ•  ๊ณ„ํš์ด๋‹ค.