study/ts

๐Ÿ“Œ Webpack๊ณผ TypeScript๋กœ ๋งŒ๋“œ๋Š” ์›น์•ฑ ์บ˜๋ฆฐ๋” ํ”Œ๋Ÿฌ๊ทธ์ธ ๊ฐœ๋ฐœ ์‹œ๋ฆฌ์ฆˆ - ์บ˜๋ฆฐ๋” ํ”Œ๋Ÿฌ๊ทธ์ธ ๊ตฌ์กฐ ์„ค๊ณ„ – ๋‚ ์งœ ๋ Œ๋”๋ง์„ ์œ„ํ•œ UI ๊ธฐ๋ณธ ๊ตฌ์„ฑ

octo54 2025. 3. 24. 10:19
๋ฐ˜์‘ํ˜•

๐Ÿ“Œ Webpack๊ณผ TypeScript๋กœ ๋งŒ๋“œ๋Š” ์›น์•ฑ ์บ˜๋ฆฐ๋” ํ”Œ๋Ÿฌ๊ทธ์ธ ๊ฐœ๋ฐœ ์‹œ๋ฆฌ์ฆˆ

โœ… 4ํŽธ: ์บ˜๋ฆฐ๋” ํ”Œ๋Ÿฌ๊ทธ์ธ ๊ตฌ์กฐ ์„ค๊ณ„ – ๋‚ ์งœ ๋ Œ๋”๋ง์„ ์œ„ํ•œ UI ๊ธฐ๋ณธ ๊ตฌ์„ฑ


์ด๋ฒˆ ํŽธ์—์„œ๋Š” ๋“œ๋””์–ด ๋ณธ๊ฒฉ์ ์œผ๋กœ ์บ˜๋ฆฐ๋” ํ”Œ๋Ÿฌ๊ทธ์ธ์˜ UI ๊ตฌ์กฐ๋ฅผ ์„ค๊ณ„ํ•˜๊ณ ,
๊ธฐ๋ณธ ๋‚ ์งœ ๋ Œ๋”๋ง ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ•ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.
์šฐ๋ฆฌ๋Š” ์ด๋ฏธ TypeScript ๊ธฐ๋ฐ˜์˜ ๊ฐœ๋ฐœ ํ™˜๊ฒฝ๊ณผ Webpack ์„ค์ •์„ ์™„๋ฃŒํ–ˆ์œผ๋ฏ€๋กœ,
์ด๋ฒˆ ๊ธ€๋ถ€ํ„ฐ๋Š” **“ํ™”๋ฉด์— ๋‹ฌ๋ ฅ์„ ์ถœ๋ ฅํ•˜๋Š” ์‹ค์งˆ์ ์ธ ๊ธฐ๋Šฅ ๊ตฌํ˜„”**์— ์ง‘์ค‘ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.


๐ŸŽฏ ๋ชฉํ‘œ

  • ํ•œ ๋‹ฌ ๋‹ฌ๋ ฅ ๊ตฌ์กฐ๋ฅผ ์„ค๊ณ„ํ•˜๊ณ  ๋ Œ๋”๋งํ•˜๋Š” ํ•จ์ˆ˜ ๋งŒ๋“ค๊ธฐ
  • Date, TypeScript, DOM ์กฐ์ž‘์„ ํ™œ์šฉํ•ด UI ๊ตฌ์„ฑ
  • ์บ˜๋ฆฐ๋” ๋ฐ์ดํ„ฐ๋ฅผ ํ™”๋ฉด์— ๊ทธ๋ฆด ์ˆ˜ ์žˆ๋Š” ์ตœ์†Œ ๊ธฐ๋Šฅ ์™„์„ฑ

๐Ÿง  ์บ˜๋ฆฐ๋” ๊ธฐ๋ณธ ๊ตฌ์กฐ ์ดํ•ดํ•˜๊ธฐ

โœ… ํ•„์š”ํ•œ ๊ตฌ์„ฑ ์š”์†Œ

์š”์†Œ ์„ค๋ช…

์—ฐ/์›” ํ—ค๋” ํ˜„์žฌ ํ‘œ์‹œ ์ค‘์ธ ๋‚ ์งœ
์š”์ผ ํ—ค๋” ์ผํ†  ํ˜น์€ ์›”์ผ
๋‚ ์งœ ์…€ ํ•œ ๋‹ฌ ๊ฐ„์˜ ๋‚ ์งœ๋ฅผ ๊ทธ๋ฆฌ๋“œ ํ˜•ํƒœ๋กœ ํ‘œ์‹œ
์ด์ „/๋‹ค์Œ ๋‹ฌ ์ด๋™ ์›” ์ „ํ™˜ ๊ธฐ๋Šฅ

๐Ÿ“ฆ 1. ํด๋” ๋ฐ ํŒŒ์ผ ๊ตฌ์กฐ ํ™•์žฅ

src/
โ”œโ”€โ”€ components/
โ”‚   โ””โ”€โ”€ Calendar.ts
โ”œโ”€โ”€ types.ts
โ””โ”€โ”€ index.ts

โœ๏ธ 2. ๋‹ฌ๋ ฅ ๋ Œ๋”๋ง์„ ์œ„ํ•œ ์œ ํ‹ธ ํ•จ์ˆ˜ ๋งŒ๋“ค๊ธฐ

โœ… getCalendarMatrix – ๋‚ ์งœ ๊ทธ๋ฆฌ๋“œ ์ƒ์„ฑ

// src/components/Calendar.ts
export function getCalendarMatrix(year: number, month: number): (Date | null)[][] {
  const matrix: (Date | null)[][] = [];
  const firstDay = new Date(year, month, 1);
  const lastDay = new Date(year, month + 1, 0);
  const startWeekDay = firstDay.getDay(); // ์ผ:0, ์›”:1, ..., ํ† :6

  let current = new Date(year, month, 1 - startWeekDay);
  for (let week = 0; week < 6; week++) {
    const weekRow: (Date | null)[] = [];
    for (let day = 0; day < 7; day++) {
      weekRow.push(new Date(current));
      current.setDate(current.getDate() + 1);
    }
    matrix.push(weekRow);
  }

  return matrix;
}

6์ฃผ(์ตœ๋Œ€) * 7์ผ = 42์นธ์˜ ๊ทธ๋ฆฌ๋“œ ๋‹ฌ๋ ฅ์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.
์ด์ „ ๋‹ฌ, ๋‹ค์Œ ๋‹ฌ์˜ ๋‚ ์งœ๋„ ํฌํ•จํ•˜์—ฌ ๋‚ ์งœ ์œ„์น˜๋ฅผ ๋งž์ถฅ๋‹ˆ๋‹ค.


๐Ÿ–ผ๏ธ 3. ์บ˜๋ฆฐ๋” UI DOM ๊ตฌ์„ฑํ•˜๊ธฐ

โœ… renderCalendar ํ•จ์ˆ˜ ๋งŒ๋“ค๊ธฐ

// src/components/Calendar.ts
export function renderCalendar(target: HTMLElement, year: number, month: number): void {
  const matrix = getCalendarMatrix(year, month);

  target.innerHTML = `
    <div class="calendar-header">
      <h2>${year}๋…„ ${month + 1}์›”</h2>
    </div>
    <div class="calendar-grid">
      ${["์ผ", "์›”", "ํ™”", "์ˆ˜", "๋ชฉ", "๊ธˆ", "ํ† "]
        .map((d) => `<div class="calendar-cell header">${d}</div>`)
        .join("")}
      ${matrix
        .flat()
        .map((date) => {
          const day = date?.getDate();
          const inMonth = date?.getMonth() === month;
          return `<div class="calendar-cell${inMonth ? "" : " out"}">${day}</div>`;
        })
        .join("")}
    </div>
  `;
}

๐Ÿงฉ 4. ์บ˜๋ฆฐ๋” ์ดˆ๊ธฐํ™” ๋ฐ ์‹คํ–‰

โœ… index.ts

import { renderCalendar } from "./components/Calendar";

const root = document.getElementById("calendar-root");
if (root) {
  const today = new Date();
  renderCalendar(root, today.getFullYear(), today.getMonth());
}

๐ŸŽจ 5. CSS ์Šคํƒ€์ผ ์˜ˆ์‹œ

โœ… dist/style.css

.calendar-header {
  text-align: center;
  margin-bottom: 1rem;
}

.calendar-grid {
  display: grid;
  grid-template-columns: repeat(7, 1fr);
  gap: 4px;
}

.calendar-cell {
  border: 1px solid #ccc;
  padding: 10px;
  text-align: center;
  min-height: 40px;
}

.calendar-cell.header {
  font-weight: bold;
  background: #f0f0f0;
}

.calendar-cell.out {
  color: #999;
}

โœ… HTML์— ์—ฐ๊ฒฐ

<link rel="stylesheet" href="style.css">

โœ… ๊ฒฐ๊ณผ ํ™•์ธ

npm run dev

http://localhost:8080 ์ ‘์† ์‹œ, ํ•œ ๋‹ฌ์น˜ ๋‹ฌ๋ ฅ์ด ๊ทธ๋ฆฌ๋“œ ํ˜•ํƒœ๋กœ ์ž˜ ๋ Œ๋”๋ง๋˜๋ฉด ์„ฑ๊ณต!


๐Ÿ“š ์ฐธ๊ณ ์ž๋ฃŒ

 


๋‹ค์Œ ํŽธ ์˜ˆ๊ณ :
๐Ÿ“˜ 5ํŽธ – ์‚ฌ์šฉ์ž ์ด๋ฒคํŠธ ์ถ”๊ฐ€: ๋‚ ์งœ ์„ ํƒ, ์›” ์ด๋™ ๊ธฐ๋Šฅ ๊ตฌํ˜„
ํ™”๋ฉด์— ๋‹ฌ๋ ฅ์„ ๊ทธ๋ ธ๋‹ค๋ฉด, ์ด์ œ๋Š” **“๋™์ž‘ํ•˜๋Š” ๋‹ฌ๋ ฅ”**์„ ๋งŒ๋“ค์–ด์•ผ์ฃ .
์ด๋ฒคํŠธ ์ฒ˜๋ฆฌ, DOM ๋ฐ”์ธ๋”ฉ ๋“ฑ ์‹ค์ „์œผ๋กœ ๋“ค์–ด๊ฐ‘๋‹ˆ๋‹ค! ๐Ÿ™Œ