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

๋ฆฌ์•กํŠธ ๋น… ์บ˜๋ฆฐ๋”(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๋Š”

  1. ์ด๋ฒคํŠธ ํ•˜๋‚˜๊ฐ€ ๋ฐ”๋€Œ์–ด๋„ ์ „์ฒด ์บ˜๋ฆฐ๋” UI๋ฅผ ๋‹ค์‹œ ๋ Œ๋”๋ง ํ•ด์•ผ ํ•œ๋‹ค.
  2. ์ฆ‰๊ฐ์ ์œผ๋กœ ๋ฐ˜์‘ํ•ด์•ผ ํ•˜๋Š” ๋“œ๋ž˜๊ทธ&๋“œ๋กญ์€ ์‹ค์‹œ๊ฐ„์œผ๋กœ ๋ถ€๋“œ๋Ÿฌ์šด ๋ฐ˜์˜์ด ํ•„์š”ํ•˜๋‹ค.
  3. ๋งŽ์€ ๊ธฐ๋Šฅ์ด ์žˆ๋Š” ์บ˜๋ฆฐ๋”์˜ ๊ฒฝ์šฐ์—๋Š” ์˜ˆ์ƒ๋ณด๋‹ค ๋” ๋งŽ์€ ์š”์†Œ๊ฐ€ ๋‹ค์‹œ ๋ Œ๋”๋ง๋  ์ˆ˜๋„ ์žˆ๋‹ค.
  4. ์บ˜๋ฆฐ๋”์™€ ๊ด€๋ จ์ด ์—†๋Š” ๋ถ€๋ถ„์ž„์—๋„ ์บ˜๋ฆฐ๋”๊ฐ€ ์ž์‹์ปดํฌ๋„ŒํŠธ ์ž…์žฅ์ด ๋œ๋‹ค๋ฉด ๋ฆฌ๋ Œ๋”๋ง์ด ๋ฐœ์ƒํ•œ๋‹ค.

์ด์™€ ๊ฐ™์€ ์ด์œ ๋“ค ๋•Œ๋ฌธ์— 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;
๊ณต์ง€์‚ฌํ•ญ
์ตœ๊ทผ์— ์˜ฌ๋ผ์˜จ ๊ธ€
์ตœ๊ทผ์— ๋‹ฌ๋ฆฐ ๋Œ“๊ธ€
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
๊ธ€ ๋ณด๊ด€ํ•จ