ํฐ์คํ ๋ฆฌ ๋ทฐ
[์ฌ๋๋ณ_Day5] RBC ํํค์น๊ธฐ 4 - ๊ธฐ์กด ์คํ์ผ๊ณผ ์ปค์คํฐ๋ง์ด์ง
์ฑ._. 2025. 4. 3. 22:38RBC์ ๋ ๋๋ง ๋ฐฉ๋ฒ(CRS)๊น์ง ํ์ ํ์ฌ ์บ๋ฆฐ๋ ํํ๋ฅผ ์ถ๋ ฅํ์๋ค!
RBC์ ๊ธฐ๋ณธ์ ์ธ ์คํ์ผ์ด๋ฉฐ, ์ปค์คํฐ๋ง์ด์ง์ ์ํ ๋ด์ฉ๋ค์ ์ ๋ฆฌํ๋ค.

RBC์ ๊ธฐ๋ณธ ์คํ์ผ
RBC npm ๋ฌธ์๋ฅผ ์ฝ๋ ์ค SASS์ ๋ํด ์๊ฒ ๋์๋ค.
๋ฌธ์์๋ ๋ค์๊ณผ ๊ฐ์ด ๋์์๋ค.

์ด ๋ง์ธ์ฆ์จ,
- RBC์ ๊ธฐ๋ณธ ์คํ์ผ์ด ์ ์ฉ๋ CSS ํ์ผ(react-big-calendar.css)์ด ์๊ณ ์ด๋ฅผ ๋ฐ๋ก import ํ์ฌ ์ ๊ทผํ ์ ์๋ค.
- ํ์ง๋ง ์คํ์ผ์ ์ปค์คํฐ๋ง์ด์งํ๋ ค๋ฉด SASS ํ์ผ์ ์์ ํด์ผ ํ๋ค.
- ์ด๋ ๊ฒ ์์ ํ SASS ํ์ผ์ ์๋ก์ด CSS ํ์ผ์ ๋น๋ํ๋ฉฐ ์ง์ import ํ๋ค.
์ด๊ธฐ ์ธํ ์ค ์๋์ ๊ฐ์ด ์บ๋ฆฐ๋ ์ปดํฌ๋ํธ์ ์ธ๋ผ์ธ ์คํ์ผ ์์๋ฅผ ์ ์ฉ์์ผฐ๋ค.
๊ณต์ ๋ฌธ์์ ๋์์๋ฏ ๋ฌ๋ ฅ์ ์ปจํ ์ด๋ ์์์ ๋์ด๋ฅผ ์ฃผ์ด์ผ ํ๋ฉด์ ๋ํ๋๊ธฐ ๋๋ฌธ์ด๋ค.
์ด๋ CSS ํ์ผ์ import๋ฅผ ํ๊ธฐ ๋๋ฌธ์ ๊ธฐ๋ณธ ์คํ์ผ์ ์ ๊ทผํ ์ ์์๋ ๊ฒ์ด๋ค!
import "react-big-calendar/lib/css/react-big-calendar.css";
<Calendar
localizer={localizer}
events={events}
startAccessor="start"
endAccessor="end"
style={{ height: 500 }} // โ
๋ฌ๋ ฅ ๋์ด(๋ฌ๋ ฅ ๋ํ๋ด๊ธฐ ์ํจ)
/>
๋์ด๋ฅผ ์ฃผ์ง ์์ผ๋ฉด ๋ค์๊ณผ ๊ฐ์ด ์ถ๋ ฅ๋๋ค.

RBC์์ ๊ธฐ๋ณธ์ ์ผ๋ก ์ ๊ณตํ๋ ์คํ์ผ ์์๋ค
๊ฐ์ฅ ๊ธฐ๋ณธ ํํ์ CSS ์์๋ฅผ 7๊ฐ์ ์น์ ์ผ๋ก ๋๋์ด ์ดํด๋ณด๊ฒ ๋ค.

1. ์บ๋ฆฐ๋ ์ ์ฒด ๋ ์ด์์ (.rbc-calendar)
- display: flex;๋ก ๊ตฌ์ฑ๋์ด ์์
- ๋ด๋ถ์ ์ผ๋ก rbc-toolbar, rbc-month-view ๋ฑ์ ์์๋ฅผ ํฌํจ
.rbc-calendar {
box-sizing: border-box;
display: flex;
flex-direction: column;
height: 100%;
font-family: sans-serif;
font-size: 14px;
}
2. ํด๋ฐ ์คํ์ผ (.rbc-toolbar)
- ์ ๋ณ๊ฒฝ ๋ฒํผ๊ณผ ํ์ฌ ๋ ์ง ํ์ํ๋ ๋ถ๋ถ
- ๋ฒํผ ๊ธฐ๋ณธ ์คํ์ผ ์ ์ฉ๋จ
.rbc-toolbar {
display: flex;
align-items: center;
justify-content: space-between;
margin-bottom: 10px;
}
.rbc-toolbar button {
background-color: #f7f7f7;
border: 1px solid #ddd;
padding: 5px 10px;
cursor: pointer;
}
// ๊ธฐ๋ณธ ๋ฒํผ ์คํ์ผ
.rbc-toolbar button:hover {
background-color: #e6e6e6;
}
3. ์์ผ ํค๋ ์คํ์ผ (.rbc-header)
- ์์ผ ํ์ํ๋ ๋ถ๋ถ (์: "์ผ", "์", "ํ", …)
.rbc-header {
text-align: center;
padding: 10px;
background-color: #f7f7f7;
border-bottom: 1px solid #ddd;
}
4. ๋ ์ง ์ ์คํ์ผ (.rbc-day-bg)
- ๊ฐ ๋ ์ง ์นธ์ ์ ์ฉ๋๋ ์คํ์ผ
.rbc-day-bg {
border-right: 1px solid #ddd;
}
// ์ฃผ๋ง ์คํ์ผ
.rbc-day-bg.rbc-off-range-bg {
background-color: #f3f3f3;
}
5. ์ด๋ฒคํธ ์คํ์ผ (.rbc-event)
- ์บ๋ฆฐ๋์ ํ์๋๋ ์ผ์ (์ด๋ฒคํธ) ์คํ์ผ
.rbc-event {
background-color: #3174ad; /* ๊ธฐ๋ณธ ํ๋์ */
color: white;
padding: 4px;
border-radius: 4px;
}
// ๋ง์ฐ์ค ์ค๋ฒ ์ ์คํ์ผ
.rbc-event:hover {
background-color: #265985;
}
// ์ฐ์ ์ด๋ฒคํธ ์คํ์ผ
.rbc-event-continues-before {
border-top-left-radius: 0;
border-bottom-left-radius: 0;
}
.rbc-event-continues-after {
border-top-right-radius: 0;
border-bottom-right-radius: 0;
}
6. ํ์ฌ ๋ ์ง ๊ฐ์กฐ (.rbc-today)
- ์ค๋ ๋ ์ง ๋ฐฐ๊ฒฝ์ ๊ฐ์กฐ
.rbc-today {
background-color: rgba(0, 0, 255, 0.1);
}
7. ์ ํ๋ ๋ ์ง ์คํ์ผ (.rbc-selected-cell)
- ๋๋๊ทธ๋ก ๋ ์ง ๋ฒ์ ์ ํ ์ ๊ฐ์กฐ ํ์๋จ
.rbc-selected-cell {
background-color: rgba(0, 0, 255, 0.2);
}
๊ธฐ์กด ์คํ์ผ์ ๋ฎ์ด์ฐ์ง ์๊ณ ์ ์งํ๋ ๋ฐฉ๋ฒ
์์ ๋ณธ 7๊ฐ์ง์ ๊ธฐ์กด ์คํ์ผ์ ์ ์งํ๊ณ , ๊ทธ ์ด์ธ์ ๋ถ๋ถ์ ์๋ก์ด ์คํ์ผ์ ์ ์ฉํ๊ณ ์ถ๋ค๋ฉด?
1. ๊ธฐ์กด ์คํ์ผ์ ํ์ฅํ๋ ๋ฐฉ์
๊ธฐ์กด ์คํ์ผ์ ์ด๋ฆ์ ํ์ฅํ์ฌ ์๋ก์ด ์คํ์ผ์ ์ ์ฉํ๋ค.
.rbc-calendar {
background-color: white; // ๊ธฐ์กด ์คํ์ผ ์ ์ง
}
.rbc-calendar.custom {
border: 2px solid red; // ์ถ๊ฐ์ ์ธ ์คํ์ผ๋ง ์ ์ฉ
}
2. ๊ธฐ์กด ์คํ์ผ ์์
@extend๋ฅผ ์ฌ์ฉํ์ฌ ๊ธฐ์กด์ ์คํ์ผ์ ๋ฌผ๋ ค๋ฐ์ ์๋ก์ด ์คํ์ผ ์ด๋ฆ์ ์ง์ ํ๋ค.
.custom-calendar {
@extend .rbc-calendar;
border: 2px solid red;
}
3. CSS ๋ณ์ ํ์ฉ
RBC์ ๊ธฐ์กด SCSS ๋ณ์๋ฅผ ๋ณ๊ฒฝํ๋ ค๋ฉด $๋ณ์๋ฅผ ์ฌ์ฉํ์ง๋ง ์๋ก์ด ์คํ์ผ์ ์ถ๊ฐํ ๋๋ --๋ณ์๋ก ์ ์ธํ๊ณ var(--๋ณ์)๋ก ์ฌ์ฉํ๋ค.
// styles.scss (๊ธฐ์กด RBC ์คํ์ผ ์์ )
@import 'react-big-calendar/lib/sass/styles';
$event-background-color: red; // ๊ธฐ์กด ์ด๋ฒคํธ ๋ฐฐ๊ฒฝ์ ๋ณ๊ฒฝ
.rbc-event {
background-color: $event-background-color !important;
}
// styles.css (์๋ก์ด ์คํ์ผ ์ง์ )
:root {
--custom-event-bg: blue; // ์๋ก์ด CSS ๋ณ์
}
.my-custom-event {
background-color: var(--custom-event-bg) !important;
}
RBC์ SASS
์๋จ์ ์ ์ ๊ฒ์ฒ๋ผ RBC์ ์คํ์ผ์ ์ปค์คํฐ๋ง์ด์งํ๋ ค๋ฉด SASS ํ์ผ์ ์์ ํด์ผ ํ๋ค.
๊ทธ๋ ๋ค๋ฉด SASS๋ ๋ฌด์์ด๋ฉฐ ์ด๋ป๊ฒ ์๋ํ๋ ๊ฒ์ผ๊น?
SASS์ SCSS

RBC ๋ด๋ถ์ ์ผ๋ก ์ปค์คํฐ๋ง์ด์ง์ ์ํด์๋ SASS ํ์ผ์ ์์ ํด์ผ ํ๋ค.
์ปค์คํฐ๋ง์ด์ง ํ ์คํ์ผ์ ๋ธ๋ผ์ฐ์ ์ ์ ์ฉํ๊ธฐ ์ํด์๋ CSS ํ์ผ์ด ํ์ํ๋ค.
๋ธ๋ผ์ฐ์ ๋ ์ง์ SCSS ํ์ผ์ ์ดํดํ์ง ๋ชปํ๋ค.
์ฆ, SCSS ํ์ผ์ ๋ธ๋ผ์ฐ์ ์์ ์ฌ์ฉํ๊ธฐ ์ํด์๋ SCSS ํ์ผ์ CSS ํ์ผ๋ก ์ปดํ์ผํ์ฌ ๋ธ๋ผ์ฐ์ ๊ฐ ์ดํดํ ์ ์๋ CSS ํ์ผ๋ก ๋ณํํด์ผ ํ๋ค.
RBC์ ๋ธ๋ผ์ฐ์ ์ ๊ฐ๊ทน์ ํด๊ฒฐํด์ฃผ๋ ๊ฒ์ด Sass ์ด๋ค.
๋ฐ๋ผ์ Sass๋ผ๋ ๊ฒ์ CSS ์ ์ฒ๋ฆฌ๊ธฐ ๋๊ตฌ์ด๋ฉฐ, RBC์ ์ปค์คํฐ๋ง์ด์ง์ ๋ธ๋ผ์ฐ์ ์ ์ ์ฉํ ์ ์๋๋ก ๋์์ค๋ค.
- Sass(=SASS)๋ CSS ์ ์ฒ๋ฆฌ๊ธฐ ๋๊ตฌ์ด๋ค.
- SCSS๋ Sass์์ ์ง์ํ๋ ๋ฌธ๋ฒ ์คํ์ผ ํ์์ด๋ค.
- RBC ๋ด๋ถ ์คํ์ผ ํ์ผ์ SCSS(.scss) ํ์์ผ๋ก ๋์ด์๋ค.
// Sass(.sass)
$primary-color: blue
body
background: $primary-color
nav
ul
margin: 0
padding: 0
// SCSS(.scss)
$primary-color: blue;
body {
background: $primary-color;
}
nav {
ul {
margin: 0;
padding: 0;
}
}
CSS ์ ์ฉ ์ฐ์ ์์
RBC๊ฐ ๊ฐ๊ณ ์๋ ๊ธฐ๋ณธ ์คํ์ผ๊ณผ ์ปค์คํฐ๋ง์ด์ง์ ์ํ ํ์ผ๊น์ง ์์๋ณด์๋ค.
๐ค๊ธฐ์กด ์คํ์ผ์ ์ ๊ทผํ์ง ์๊ณ SASS ํ์ผ์ ์์ ํ์์ ๋, ๊ธฐ์กด ์คํ์ผ๊ณผ ๊ฒน์น๋ ๋ถ๋ถ์ด ์๋ค๋ฉด ์ต์ข
์ ์ผ๋ก ์ด๋ค ๊ฒ์ด ๋ฐ์๋ ๊น?
- ์ธ๋ผ์ธ ์คํ์ผ (style={{}}) → ๊ฐ์ฅ ๊ฐํจ
- ID ์ ํ์ (#calendar)
- ํด๋์ค ์ ํ์ (.rbc-calendar) / ์์ฑ ์ ํ์ ([type="text"])
- ํ๊ทธ ์ ํ์ (div, span ๋ฑ)
- ๊ธฐ๋ณธ ๋ธ๋ผ์ฐ์ ์คํ์ผ → ๊ฐ์ฅ ์ฝํจ
๋ง์ฝ, ๊ธฐ์กด CSS์ ๊ฒน์น ๊ฒฝ์ฐ ๊ธฐ์กด ์คํ์ผ๋ณด๋ค ๊ฐํ๊ฒ ์ ์ฉํ๋ ค๋ฉด
- ๋ ๊ฐํ ์ ํ์ ์ฌ์ฉ (.my-calendar-class .rbc-event ๋ฑ)
- !important ์ถ๊ฐ
- CSS ํ์ผ์ด ๋น๋ ํ ๋ ๋์ค์ ๋ก๋๋๋๋ก ์กฐ์
- ์ปค์คํ CSS๋ฅผ ๊ธฐ์กด CSS ์ดํ์ importํ๊ธฐ
import 'react-big-calendar/lib/css/react-big-calendar.css';
import './my-custom-calendar.scss'; // ์ปค์คํ
์คํ์ผ์ด ๋ ๋์ค์ ๋ก๋๋จ!
'Project' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
| [์ฌ๋๋ณ_Day8] RBC ์ชผ๊ฐ๊ธฐ 1 - CustomToolbar : ๋ ์ง ์ด๋ (0) | 2025.04.07 |
|---|---|
| [์ฌ๋๋ณ_Day6] ์บ๋ฆฐ๋์ ์ผ์ ๋ํ๋ด๊ธฐ - UTC (0) | 2025.04.04 |
| [์ฌ๋๋ณ_Day4] RBC ํํค์น๊ธฐ 3 - ์บ๋ฆฐ๋๋ ์ CSR? (0) | 2025.04.02 |
| [์ฌ๋๋ณ_Day4] RBC ํํค์น๊ธฐ 2 - date-fns (0) | 2025.04.02 |
| [์ฌ๋๋ณ_Day4] RBC ํํค์น๊ธฐ 1 - Webpack์ CSS ์ฒ๋ฆฌ (0) | 2025.04.02 |