ํฐ์คํ ๋ฆฌ ๋ทฐ
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;'Project' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
| [์ฌ๋๋ณ_Day5] RBC ํํค์น๊ธฐ 4 - ๊ธฐ์กด ์คํ์ผ๊ณผ ์ปค์คํฐ๋ง์ด์ง (0) | 2025.04.03 |
|---|---|
| [์ฌ๋๋ณ_Day4] RBC ํํค์น๊ธฐ 3 - ์บ๋ฆฐ๋๋ ์ CSR? (0) | 2025.04.02 |
| [์ฌ๋๋ณ_Day4] RBC ํํค์น๊ธฐ 1 - Webpack์ CSS ์ฒ๋ฆฌ (0) | 2025.04.02 |
| [์ฌ๋๋ณ_Day3] ์บ๋ฆฐ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ๋น๊ต๐ (0) | 2025.04.01 |
| [์ฌ๋๋ณ_Day2] ํต์ฌ ๊ธฐ๋ฅ ๋ถ์ (0) | 2025.04.01 |