ํฐ์คํ ๋ฆฌ ๋ทฐ
๋ฆฌ์กํธ ๋น
์บ๋ฆฐ๋(RBC)๋ฅผ ๊ตฌํํ๊ธฐ ์ , ์บ๋ฆฐ๋๋ ์ฌ์ฉ์์์ ์ํธ์์ฉ์ด ๋ง์ด ํ์ํ๊ธฐ ๋๋ฌธ์(์ด๋ฒคํธ ํธ๋ค๋ฌ) ํด๋ผ์ด์ธํธ ์ปดํฌ๋ํธ์ฌ์ผ ํ๋ค๊ณ ์๊ฐํ๋ค.
์ค์ ๋ก "use client"๋ฅผ ๋ช
์ํ์ง ์์ผ๋ฉด ์๋์ ๊ฐ์ ์ค๋ฅ๊ฐ ๋ฐ์ํ๋ค.

CSR์ธ ์ด์
์ค๋ฅ๊ฐ ๋ฐ์ํ๋ค๋ ๊ฒ์ ํํ ํด๋ผ์ด์ธํธ ์ปดํฌ๋ํธ์ฌ์ผ ํ๋ค๋ ๊ฒ์ธ๋ฐ..
๐ค๊ทธ ์ด์ ๊ฐ ๋ฌด์์ผ๊น?
1. RBC๋ ๋ด๋ถ์ ์ผ๋ก ํด๋์ค ์ปดํฌ๋ํธ๋ฅผ ์ฌ์ฉ
์ฐ์ ์ฌ์ง๊ณผ ๊ฐ์ ์ค๋ฅ๋ ํด๋์ค ์ปดํฌ๋ํธ ๊ธฐ๋ฐ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์๋ฒ ์ปดํฌ๋ํธ์์ ๋ ๋๋งํ๋ ค๊ณ ํ ๋ ๋ฐ์ํ๋ค.
ํด๋์ค ์ปดํฌ๋ํธ๋ ์๋ฒ ์ปดํฌ๋ํธ์์ ๋์ํ ์ ์๋๋ก ์ค๊ณ๋์ง ์์๋ค.
๋ฐ๋ผ์ RBC๋ Next.js์ ์๋ฒ ์ปดํฌ๋ํธ ํ๊ฒฝ์์๋ ์ด๋ฅผ ์ง์ ์คํํ ์ ์๋ค.
2. ์ด๋ฒคํธ ํธ๋ค๋ง
์ผ์ ํด๋ฆญ, ๋๋๊ทธ ๋ฑ ์ฌ์ฉ์์์ ์ํธ์์ฉ์ด ํ์ํ ์ด๋ฒคํธ๋ค์ ์๋ฒ ์ปดํฌ๋ํธ์์ ์ฌ์ฉ๋ ์ ์๋ค.
3. RBC๋ DOM์ ์กฐ์
์บ๋ฆฐ๋ ํน์ฑ์ DOM ์์๋ฅผ ์กฐ์ํ๊ธฐ ๋๋ฌธ์ document์ ๊ฐ์ ๋ธ๋ผ์ฐ์ API๋ ์๋ฒ ์ฌ์ด๋์์ ์คํํ ์ ์๋ค.
React-Big-Calendar์ DOM ์กฐ์
RBC๋ React ๊ธฐ๋ฐ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ง๋ง, ๋ด๋ถ์ ์ผ๋ก ๋ธ๋ผ์ฐ์ ์ DOM์ ์ง์ ์กฐ์ํ๋ ๊ธฐ๋ฅ์ ํฌํจํ๊ณ ์๋ค.
1. ์ด๋ฒคํธ ๋ ๋๋ง ๋ฐ ์คํ์ผ ์ ์ฉ
- ์บ๋ฆฐ๋ ํ๋ฉด์ ์ง์ ์์ฑ
- ์๊ฐ/์ฃผ๊ฐ ๋ทฐ๋ฅผ ์ ํํ๋ฉด ๊ธฐ์กด DOM์ ์ง์ฐ๊ณ ์๋กญ๊ฒ ๋ ๋๋ง
- ์คํ์ผ์ ๋์ ์ผ๋ก ์ ์ฉ(eventPropGetter)
2. ๋๋๊ทธ & ๋๋กญ
- ์ฌ์ฉ์์ ํด๋ฆญ๊ณผ ๋๋๊ทธ๋ฅผ ํตํด ์ด๋ํ๊ฑฐ๋ ํฌ๊ธฐ ์กฐ์
- ๋ง์ฐ์ค ์ด๋ฒคํธ ๊ฐ์ง, ์์น ์กฐ์
- DOM ์ด๋ฒคํธ๋ฅผ ์ง์ ํธ๋ค๋ง(๋ด๋ถ ๋ผ์ด๋ธ๋ฌ๋ฆฌ:react-dnd)
3. ํดํ, ํ์ , ๋ชจ๋ฌ
- DOM์ ์๋ก์ด ์์ ์ถ๊ฐ, ์กฐ์(๋ด๋ถ ๋ผ์ด๋ธ๋ฌ๋ฆฌ:react-popper)
4. ๋ฐ์ํ ๋ฐ ๋์ ๋์ด ์กฐ์
- ๋ธ๋ผ์ฐ์ ํฌ๊ธฐ์ ๋ฐ๋ผ ๋์ ์ผ๋ก ๋์ด ์กฐ์ (style ์์ฑ์ ํ์ฉ:autoHeight)
- window.resize ์ด๋ฒคํธ๋ฅผ ์ถ๊ฐํ์ฌ DOM์ ๋ค์ ๊ทธ๋ฆฌ๋ ๋ฐ์ํ ๊ตฌํ
๊ทธ๋ ๋ค๋ฉด ์ DOM์ ์กฐ์ํ๋ ๊ฒ์ผ๊น?
state๋ก ๊ด๋ฆฌํ๊ฒ ๋๋ฉด ํ์ํ ๋ถ๋ถ๋ง ๋ฆฌ๋ ๋๋ง ๋์ด์ ์ฌ์ฉ์์๊ฒ ๋ณ๋์ฌํญ์ ๋์ฑ ๋น ๋ฅด๊ฒ ๋ณด์ฌ์ค ์ ์๋ ๊ฒ ์๋๊น?
ํ๋ง๋๋ก ์ ๋ฆฌํ์๋ฉด ์บ๋ฆฐ๋์ ๋ณต์กํ ๋ ์ด์์๊ณผ ์ฑ๋ฅ ์ต์ ํ๋ฅผ ์ํ ๊ฒ์ด๋ค.
state๊ฐ ๋ณํํ๋ฉด ๋ฆฌ๋ ๋๋ง์ด ์ผ์ด๋๊ฒ ๋๋ค.
์ด ๋์์ ์์ธํ ๋ฏ์ด๋ณด์๋ฉด
ํ์ด์ง ์ ์ฒด ์ค, ์ผ๋ถ๋ง ๋ณ๋์ด ์ผ์ด๋๋ค. -> ์๋ณธ์ธ DOM๊ณผ ๋น๊ตํ์ฌ ๋ณ๋๋ ๋ถ๋ถ(state)๋ง ๊ฐ์งํ๋ค. -> ๋ฆฌ๋ ๋๋ง์ ํตํด ๋ณ๋๋ ๋ถ๋ถ์ ๋ฐ์ํ๋ค.
state๋ก ๊ด๋ฆฌํ๋ ๋ถ๋ถ์ด ์ ๊ฑฐ๋ ํ์คํ๋ค๋ฉด ์ด๋ฐ ๋ฐฉ์์ด ํจ์ฌ ํจ์จ์ ์ด๋ค.
ํ์ง๋ง RBC๋
- ์ด๋ฒคํธ ํ๋๊ฐ ๋ฐ๋์ด๋ ์ ์ฒด ์บ๋ฆฐ๋ UI๋ฅผ ๋ค์ ๋ ๋๋ง ํด์ผ ํ๋ค.
- ์ฆ๊ฐ์ ์ผ๋ก ๋ฐ์ํด์ผ ํ๋ ๋๋๊ทธ&๋๋กญ์ ์ค์๊ฐ์ผ๋ก ๋ถ๋๋ฌ์ด ๋ฐ์์ด ํ์ํ๋ค.
- ๋ง์ ๊ธฐ๋ฅ์ด ์๋ ์บ๋ฆฐ๋์ ๊ฒฝ์ฐ์๋ ์์๋ณด๋ค ๋ ๋ง์ ์์๊ฐ ๋ค์ ๋ ๋๋ง๋ ์๋ ์๋ค.
- ์บ๋ฆฐ๋์ ๊ด๋ จ์ด ์๋ ๋ถ๋ถ์์๋ ์บ๋ฆฐ๋๊ฐ ์์์ปดํฌ๋ํธ ์ ์ฅ์ด ๋๋ค๋ฉด ๋ฆฌ๋ ๋๋ง์ด ๋ฐ์ํ๋ค.
์ด์ ๊ฐ์ ์ด์ ๋ค ๋๋ฌธ์ state๋ก ๊ด๋ฆฌํ๊ฒ ๋๋ฉด ๋ฆฌ๋ ๋๋ง์ด ๋ถํ์ํ๊ฒ ๋ฐ์ํ ์ ์๋ค.
์ผ์ ์ State๋ก ๊ด๋ฆฌ
RBC๊ฐ DOM(Document Object Model) ์กฐ์์ ํ๋ค๋ฉด,
๐คstate๋ฅผ ์ด๋ป๊ฒ ํ์ฉํ๋ ๊ฑฐ์ง? ์๋, ์ฌ์ฉํ ์๋ ์๋??
์ฝ๊ฒ ์๊ฐํ๋ฉด ๊ป๋ฐ๊ธฐ๋ DOM์ผ๋ก ์กฐ์, ์๋งน์ด๋ state๋ก ๊ด๋ฆฌํ๋ ๊ฒ์ด๋ค.
์ผ์ ๊ณผ ๊ด๋ จ๋ ๋ฐ์ดํฐ๋ฅผ state๋ก ๊ด๋ฆฌํ๊ณ , ์ด๋ฅผ ์บ๋ฆฐ๋์ ๋ฐ์ํ๋ ๋ฐฉ์์ ์ฌ์ฉํ๋ค.
์์์ ์ดํด๋ณด์๋ฏ์ด RBC๋ events ๋ฐฐ์ด์ ๊ธฐ๋ฐ์ผ๋ก ์ผ์ ์ ํ์ํ๋ค.
์ด events๋ฅผ state๋ก ๊ด๋ฆฌํ์ฌ ๋์ ์ผ๋ก ์ผ์ ์ ๊ด๋ฆฌ(์ถ๊ฐ, ์ด๋, ์ญ์ )ํ๋ ๊ฒ์ด๋ค.
useState์ ์ด๊ธฐ๊ฐ์ ์ด๋ฒคํธ ๋ฐฐ์ด๋ก ๋๊ณ , ์ผ์ ์ด ๋ณ๋๋๋ฉด setState๋ฅผ ํตํด ์บ๋ฆฐ๋ UI๊ฐ ์๋์ผ๋ก ์ ๋ฐ์ดํธ ๋๋ค.
ํด๋ฆญ ์ด๋ฒคํธ๋ API ์ฐ๋ ๋ฑ์ ํตํด ์ผ์ ์ ๋์ ์ผ๋ก ๊ด๋ฆฌํ๋ ๊ฒ์ด๋ค.
๐์์ ์ฝ๋: events๋ฅผ useState๋ก ๊ด๋ฆฌํ๊ธฐ
import { useState } from "react";
import { Calendar, dateFnsLocalizer } from "react-big-calendar";
import { format, parse, startOfWeek, getDay } from "date-fns";
const localizer = dateFnsLocalizer({
format,
parse,
startOfWeek,
getDay,
locales: { "en-US": require("date-fns/locale/en-US") },
});
const MyCalendar = () => {
// โ
`events`๋ฅผ state๋ก ๊ด๋ฆฌ
const [events, setEvents] = useState([
{
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
},
]);
// โ
์๋ก์ด ์ด๋ฒคํธ ์ถ๊ฐ ํจ์
const addEvent = () => {
const newEvent = {
title: "์ ์ผ์ ",
start: new Date(2024, 3, 15, 14, 0), // 4์ 15์ผ 2:00 PM
end: new Date(2024, 3, 15, 16, 0), // 4์ 15์ผ 4:00 PM
};
setEvents([...events, newEvent]); // ๊ธฐ์กด ์ด๋ฒคํธ์ ์ ์ด๋ฒคํธ ์ถ๊ฐ
};
return (
<div>
<button onClick={addEvent}>์ ์ผ์ ์ถ๊ฐ</button> {/* ๋ฒํผ ํด๋ฆญ ์ ์๋ก์ด ์ผ์ ์ถ๊ฐ */}
<Calendar
localizer={localizer}
events={events} // โ
state๋ก ๊ด๋ฆฌ๋๋ events ์ ๋ฌ
startAccessor="start"
endAccessor="end"
style={{ height: 500 }}
/>
</div>
);
};
export default MyCalendar;'Project' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
| [์ฌ๋๋ณ_Day6] ์บ๋ฆฐ๋์ ์ผ์ ๋ํ๋ด๊ธฐ - UTC (0) | 2025.04.04 |
|---|---|
| [์ฌ๋๋ณ_Day5] RBC ํํค์น๊ธฐ 4 - ๊ธฐ์กด ์คํ์ผ๊ณผ ์ปค์คํฐ๋ง์ด์ง (0) | 2025.04.03 |
| [์ฌ๋๋ณ_Day4] RBC ํํค์น๊ธฐ 2 - date-fns (0) | 2025.04.02 |
| [์ฌ๋๋ณ_Day4] RBC ํํค์น๊ธฐ 1 - Webpack์ CSS ์ฒ๋ฆฌ (0) | 2025.04.02 |
| [์ฌ๋๋ณ_Day3] ์บ๋ฆฐ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ๋น๊ต๐ (0) | 2025.04.01 |