ํ‹ฐ์Šคํ† ๋ฆฌ ๋ทฐ

RBC npm ๋ฌธ์„œ๋ฅผ ์ฝ๋˜ ์ค‘, ๋‚ ์งœ ํ˜•์‹์„ ์ง€์ •ํ•ด์•ผ ํ•œ๋‹ค๋Š” ์ ์„ ์•Œ์•˜๋‹ค.

RBC๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ ๋‚ ์งœ ๋ฐ ์‹œ๊ฐ„์„ ์ฒ˜๋ฆฌํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์—

ํ˜•์‹์„ ์ง€์ •ํ•˜๊ธฐ ์œ„ํ•ด ๋„ค ๊ฐ€์ง€์˜ ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ์ง€์›ํ•˜๊ณ  ์žˆ๋‹ค.

๋‚˜๋งŒ์˜ ์ƒ๊ฐ ์ •๋ฆฌ
RBC๋Š” ๋‹ฌ๋ ฅ ํ˜•ํƒœ๋ฅผ ๋งŒ๋“ค์–ด ์ค„ ๋ฟ,
ํ•ด๋‹น ์ˆซ์ž๊ฐ€ ๋‚ ์งœ๋ฅผ ๋œปํ•˜๋Š” ๋ฐ”์ž„์„ ์•Œ๊ฒŒ ํ•ด์ฃผ๋Š” ๊ฒƒ์€ ํ”Œ๋Ÿฌ๊ทธ์ธ์˜ ์—ญํ• ์ด๋‹ค.
์ฆ‰, ์บ˜๋ฆฐ๋”์™€ ์‚ฌ์šฉ์ž ์‚ฌ์ด์—์„œ ์บ˜๋ฆฐ๋”์—๊ฒŒ๋Š” ๋ฌธ์ž์—ด๋กœ ์ „๋‹ฌ, ์‚ฌ๋žŒ์—๊ฒŒ๋Š” ๋‚ ์งœ๋กœ ์ „๋‹ฌํ•ด ์ฃผ๋Š” ํ†ต์—ญ๊ฐ€ ์—ญํ• ์ด๋‹ค.

 

 

RBC์—์„œ ์ง€์›ํ•˜๋Š” ๋„ค ๊ฐ€์ง€ ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ๋น„๊ตํ•ด๋ณด์•˜๋‹ค.

๊ณต์‹๋ฌธ์„œ:
 Moment.js , Globalize.js , date-fns , Day.js

 

๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๋ฒˆ๋“ค ํฌ๊ธฐ ์„ฑ๋Šฅ Tree Shaking ์ง€์› TypeScript ์ง€์› ํƒ€์ž„์กด ์ง€์›
Moment.js ์•ฝ 260KB ๋А๋ฆผ X O (moment-timezone ํ•„์š”)
Globalize.js ์•ฝ 200KB ๋А๋ฆผ X X (Intl ์ง€์›)
date-fns ์•ฝ 20KB ๋น ๋ฆ„ O O X
Day.js ์•ฝ 2KB ๋งค์šฐ ๋น ๋ฆ„ O O (ํ”Œ๋Ÿฌ๊ทธ์ธ ํ•„์š”)

 

๋‚˜๋Š” ๊ฐ€๋ฒผ์šด ๋ฒˆ๋“ค ํฌ๊ธฐ, ๋น ๋ฅธ ์†๋„, ์‰ฌ์šด ์ ‘๊ทผ์„ฑ์„ ๊ธฐ์ค€์œผ๋กœ ๋‘์–ด ๊ณ ๋ คํ–ˆ๋‹ค.

๊ทธ์— ์ ํ•ฉํ•˜๋Š” ๊ฒƒ์€ date-fns๋กœ, ๋ฌธ์„œ๋„ ์ž˜ ์ •๋ฆฌ๋˜์–ด ์žˆ๋Š” ๋“ฏ ํ•˜๋‹ค.

 

๊ธฐ์ค€์— ๋”ฐ๋ฅด์ž๋ฉด Day.js๊ฐ€ ๊ฐ€์žฅ ์ ํ•ฉํ•˜์ง€๋งŒ,

ํƒ€์ž„์กด ์ง€์›์— ๋Œ€ํ•ด ํŒ€์›๋“ค๊ณผ ์ด์•ผ๊ธฐ๋ฅผ ๋‚˜๋ˆˆ ๊ฒฐ๊ณผ ํ•œ๊ตญ์ธ ์‚ฌ์šฉ์ž๋งŒ ๊ณ ๋ คํ•˜์—ฌ ์ง„ํ–‰ํ•˜๊ธฐ๋กœ ํ–ˆ๋‹ค.

๋˜ํ•œ ์ƒค๋“œ์‹œ์—”์—์„œ Day Picker๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ํŒ€์›๋ถ„๋„ date-fns๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ–ˆ๊ธฐ์— ์ตœ์ข… ๊ฒฐ์ •์€ date-fns !

 

date-fns ์‚ฌ์šฉํ•˜์—ฌ ์บ˜๋ฆฐ๋” ๋‚˜ํƒ€๋‚ด๊ธฐ

 

๐Ÿ“date-fns ์„ค์น˜

pnpm install date-fns

 

๐Ÿ“TypeScript ์„ค์น˜

  • date-fns๊ฐ€ ๊ธฐ๋ณธ์ ์œผ๋กœ TS๋ฅผ ํฌํ•จํ•˜์ง€๋งŒ,
    ๋ชจ๋“ˆ 'react-big-calendar'์— ๋Œ€ํ•œ ์„ ์–ธ ํŒŒ์ผ์„ ์ฐพ์„ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ์˜ค๋ฅ˜๋กœ ์ธํ•ด ์„ค์น˜ํ–ˆ๋‹ค.
    • react-big-calendar ํŒจํ‚ค์ง€๊ฐ€ TypeScript์šฉ ํƒ€์ž… ์ •์˜ ํŒŒ์ผ์„ ์ œ๊ณตํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ๋ฐœ์ƒํ•œ ์˜ค๋ฅ˜์ด๋‹ค.
    • TypeScript๋Š” .d.ts(ํƒ€์ž… ์„ ์–ธ ํŒŒ์ผ)๊ฐ€ ์—†๋Š” ๊ฒฝ์šฐ, ํ•ด๋‹น ํŒจํ‚ค์ง€๋ฅผ ์•Œ ์ˆ˜ ์—†๋‹ค๊ณ  ํŒ๋‹จํ•œ๋‹ค.

๐Ÿ“์„ค์น˜ ํ›„ import

"use client";
import { Calendar, dateFnsLocalizer } from "react-big-calendar";
import { format, parse, startOfWeek, getDay } from "date-fns";
import { enUS } from "date-fns/locale/en-US";
import { ko } from "date-fns/locale/ko";

// ์•„๋ž˜์˜ import๋Š” ํ•ด๋‹น ์ปดํฌ๋„ŒํŠธ๋ฅผ ํฌํ•จํ•˜๋Š” ํŽ˜์ด์ง€์— ์ž…๋ ฅํ•จ
import "react-big-calendar/lib/css/react-big-calendar.css";

 

๐Ÿ“์ง€์—ญํ™” ์„ค์ •

// ๋กœ์ผ€์ผ(์ง€์—ญํ™”) ์„ค์ •
const locales = {
  "en-US": enUS, //๋ฏธ๊ตญ-์˜์–ด : ๋ฏธ๊ตญ์‹ ๋‚ ์งœ
  "ko-KR": ko, //ํ•œ๊ตญ-ํ•œ๊ธ€ : ํ•œ๊ตญ์‹ ๋‚ ์งœ
};

 

๐Ÿ“dateFnsLocalizer๋กœ RBC์™€ ์—ฐ๊ฒฐ

const localizer = dateFnsLocalizer({
  format, // ๋‚ ์งœ๋ฅผ ๋ฌธ์ž์—ด๋กœ ๋ณ€ํ™˜
  parse, // ๋ฌธ์ž์—ด์„ ๋‚ ์งœ ๊ฐ์ฒด๋กœ ๋ณ€ํ™˜
  startOfWeek, // ํ•œ ์ฃผ์˜ ์‹œ์ž‘ ์š”์ผ ์„ค์ •
  getDay, // ๋‚ ์งœ์˜ ์š”์ผ ๊ฐ€์ ธ์˜ค๊ธฐ
  locales, // ๋‹ค๊ตญ์–ด ์„ค์ • ์ ์šฉ
});

 

๐Ÿ“RBC์˜ <Calendar /> ์ปดํฌ๋„ŒํŠธ props ์„ค์ •

const MainCalendar = () => {
  return (
    <div>
      <Calendar
        localizer={localizer} // ๋‚ ์งœ ๋ฐ ์‹œ๊ฐ„ ํฌ๋งท์„ ์ง€์ •(dateFnsLocalizer)
        events={[]} // ์—ฌ๊ธฐ์— ์ด๋ฒคํŠธ ์ถ”๊ฐ€ ๊ฐ€๋Šฅ
        startAccessor="start" // ๊ฐ ์ด๋ฒคํŠธ ๊ฐ์ฒด์—์„œ ์‹œ์ž‘ ์‹œ๊ฐ„
        endAccessor="end" // ์ข…๋ฃŒ ์‹œ๊ฐ„
        style={{ height: 500 }} // ์บ˜๋ฆฐ๋”์˜ ๋†’์ด(CSS ์ง์ ‘ ์ง€์ •)
      />
    </div>
  );
};

 

 

๐Ÿ“props ์ค‘ events ์ƒ์„ธ ์„ค๋ช…

  • events ๋ฐฐ์—ด์˜ ๊ฐ ๊ฐ์ฒด๋Š” title, start, end์„ ๊ฐ€์ง
  • ๋”ฐ๋ผ์„œ startAccessor="start"์™€ endAccessor="end"๋Š” ๊ทธ ์†์„ฑ์„ ๊ฐ€์ ธ์˜ด
  • new Date์˜ ์ธ์ž๊ฐ€ 3์ธ๋ฐ ์™œ 4์›”์ผ๊นŒ?
    • new Date(year, month, day, hour, minute, second) 
    • JS new Date()์˜ ์›” ์ธ๋ฑ์Šค๋Š” 0๋ถ€ํ„ฐ ์‹œ์ž‘ํ•˜๋Š” ์ œ๋กœ ์ธ๋ฑ์Šค
      1์›” = 0 / 2์›” = 1 / 3์›” = 2 / ... / 12์›” = 11
// ์ผ์ • ์˜ˆ์‹œ
const events = [
  {
    title: "ํšŒ์˜",
    start: new Date(2024, 3, 10, 10, 0), // 4์›” 10์ผ 10:00 AM
    end: new Date(2024, 3, 10, 12, 0),   // 4์›” 10์ผ 12:00 PM
  },
];

 

 

๐Ÿ“Œ์ „์ฒด ๋กœ์ง

// src > components > Calendar.tsx

"use client";
import { Calendar, dateFnsLocalizer } from "react-big-calendar";
import { format, parse, startOfWeek, getDay } from "date-fns";
import { enUS } from "date-fns/locale/en-US";
import { ko } from "date-fns/locale/ko";


const locales = {
  "en-US": enUS,
  "ko-KR": ko, 
};

const localizer = dateFnsLocalizer({
  format,
  parse,
  startOfWeek,
  getDay,
  locales,
});

const MainCalendar = () => {
  return (
    <div>
      <Calendar
        localizer={localizer}
        events={[]}
        startAccessor="start"
        endAccessor="end"
        style={{ height: 500 }}
      />
    </div>
  );
};

export default MainCalendar;
๊ณต์ง€์‚ฌํ•ญ
์ตœ๊ทผ์— ์˜ฌ๋ผ์˜จ ๊ธ€
์ตœ๊ทผ์— ๋‹ฌ๋ฆฐ ๋Œ“๊ธ€
Total
Today
Yesterday
๋งํฌ
TAG
more
ยซ   2026/03   ยป
์ผ ์›” ํ™” ์ˆ˜ ๋ชฉ ๊ธˆ ํ† 
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31
๊ธ€ ๋ณด๊ด€ํ•จ