์คํ๋ง๋ถํธ(SpringBoot)๋ก ํ์บ๋ฆฐ๋(FullCalendar) ๊ตฌํํ๊ธฐ - 1
ํ์บ๋ฆฐ๋ ๊ธฐ๋ณธ์ ์ธ ์ฌ๋ฌ ์์ฑ์ ๋ํด์ ์ด์ ๊ฒ์๊ธ์ ํตํด ์์๋ดค๋ค๋ฉด, ์คํ๋ง ๋ถํธ๋ฅผ ํ์ฉํด ํ์บ๋ฆฐ๋๋ฅผ ๊ตฌํํด๋ณด๋๋ก ํ๊ฒ ์ต๋๋ค. ํ์บ๋ฆฐ๋๋ ์ผ์ ๊ด๋ฆฌ ๊ธฐ๋ฅ์ ๊ตฌํํ ๋ ๋ง์ด ์ฌ์ฉํ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ก, ๋ง์ ๊ธฐ์ ๋ค์ด ํ์บ๋ฆฐ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ๊ฐ์ ธ๋ค ์ผ์ ๊ด๋ฆฌ ๊ธฐ๋ฅ์ผ๋ก ํ์ฉํ๊ณ ์๋ ๋งํผ ์ง์ ๊ตฌํํ๊ณ ์ฌ์ฉํด๋ณด๋๋ฐ ์๋ฏธ๊ฐ ์์ต๋๋ค.
ํ์บ๋ฆฐ๋ ์ค์ ํ๊ธฐ
์บ๋ฆฐ๋ ํ๋ฉด ๋ง๋ค๊ธฐ
์บ๋ฆฐ๋ ํ๋ฉด์ ๋ง๋ค๊ธฐ ์ํด์๋ JSPํ์ด์ง๋ฅผ ์ด์ฉํด ์บ๋ฆฐ๋๊ฐ ๋ณด์ฌ์ง ํ์ด์ง๋ฅผ ๊ด๋ จ ์คํฌ๋ฆฝํธ, ์คํ์ผ์ ์ ์ฉํด ๋ง๋ค์ด์ผํฉ๋๋ค. ๊ทธ๋ ๊ธฐ ์ํด์๋ ์คํฌ๋ฆฝํธ, ์คํ์ผ ์ ๋ณด๋ฅผ CDN ๋๋ ์ ๊ณต ํ์ผ์ ํตํด ์ค์ ํด์ผ ํฉ๋๋ค. ์บ๋ฆฐ๋ ํ๋ฉด์ ๊ตฌ์ฑํ๊ธฐ ์ํด ๊ธฐ๋ณธ์ ์ธ ์ค์ ์ด ํ์ํ๋ฐ ๊ฐ ์ค์ ์ ๋ฐ๋ผ 3๊ฐ์ง ๋ฐฉ์์ผ๋ก ์บ๋ฆฐ๋ ํ๋ฉด์ ๊ตฌ์ฑํด๋ณด๊ฒ ์ต๋๋ค.
- ํ์บ๋ฆฐ๋ ๊ธฐ๋ณธ ์ค์ ์ ์ด์ฉํ ๋ฐฉ์
- ์ปค์คํ ์ผ์ ์ผ๋ก events ์์ฑ ์ด์ฉํ ๋ฐฉ์
- ์ปค์คํ ์ผ์ ์ผ๋ก events ์์ฑ์ URL ์ด์ฉํ ๋ฐฉ์
COMMON ์ค์
์ 3๊ฐ์ง ๋ฐฉ์ ๋ชจ๋ ์๋ COMMON ์ค์ ์ ๋์ผํฉ๋๋ค. ๋ค๋ง, ์คํฌ๋ฆฝํธ ๋ด์ ์์ฑํด์ผ ํ ์์ฑ ๋ด์ฉ๋ค์ด ๋ค๋ฆ ๋๋ค.
ํ์บ๋ฆฐ๋ GLOBAL CDN ์ค์
<script type="text/javascript" src="https://cdn.jsdelivr.net/npm/fullcalendar@6.1.14/index.global.min.js"></script>
ํ์บ๋ฆฐ๋๊ฐ ๋ํ๋ ์์ญ ์ค์
<div id="calendar"></div>
1. JSP ํ์ด์ง ๊ตฌ์ฑํ๊ธฐ (ํ์บ๋ฆฐ๋ ๊ธฐ๋ณธ ์ค์ )
์ ์ฒด ์์ค
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
<script type="text/javascript" src="https://cdn.jsdelivr.net/npm/fullcalendar@6.1.14/index.global.min.js"></script>
</head>
<body>
<div id="calendar"></div>
</body>
<script type="text/javascript">
document.addEventListener('DOMContentLoaded', function() {
let calendarEl = document.getElementById('calendar');
let headerToolbar = {
left: 'prevYear,prev,next,nextYear today',
center: 'title',
right: 'dayGridMonth,dayGridWeek,timeGridDay'
}
let calendar = new FullCalendar.Calendar(calendarEl, {
initialView: 'dayGridMonth',
headerToolbar: headerToolbar
});
calendar.render();
});
</script>
</html>
์ ์ฉ ํ๋ฉด
๊ธฐ๋ณธ์ ์ธ ํ์บ๋ฆฐ๋ ์ค์ ์ผ๋ก ์ ์ฉํ ๋ชจ์ต์ ๋๋ค. ํค๋ ํด๋ฐ๋ก๋ ์ค๋ฅธ์ชฝ์ '์', '์ฃผ', '์ผ' ๋จ์๋ก ์ผ์ ์ ๋ณผ ์ ์๊ณ ํด๋ฐ ์ผ์ชฝ์๋ ํ์ฌ ์์ ์ด์ , ๋ค์์ผ๋ก ํ์ธํ ์ ์๋ ๋ฒํผ์ด ๋ณด์ฌ์ง๋๋ค. ๊ทธ๋ฆฌ๊ณ ํ์ฌ ๋ ์ง๋ฅผ ์บ๋ฆฐ๋์ ์์์ผ๋ก ํ์๋ฉ๋๋ค.
2. EVENTS ๊ตฌ์ฑํ์ฌ ํ์บ๋ฆฐ๋์ ์ผ์ ์ถ๊ฐํ๊ธฐ (์ปค์คํ ์ผ์ ์ง์ ๊ตฌํ)
์ ์ฒด์์ค
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
<script type="text/javascript" src="https://cdn.jsdelivr.net/npm/fullcalendar@6.1.14/index.global.min.js"></script>
</head>
<body>
<div id="calendar"></div>
</body>
<script type="text/javascript">
document.addEventListener('DOMContentLoaded', function() {
let calendarEl = document.getElementById('calendar');
let headerToolbar = {
left: 'prevYear,prev,next,nextYear today',
center: 'title',
right: 'dayGridMonth,dayGridWeek,timeGridDay'
}
let calendar = new FullCalendar.Calendar(calendarEl, {
initialView: 'dayGridMonth',
headerToolbar: headerToolbar,
events : [
{
id: "sch01",
title : "์ผ์ 01",
start : "2025-05-12",
end : "2025-05-13",
backgroundColor: "red",
textColor : "white",
allDay : true
},
{
id: "sch02",
title : "์ผ์ 02",
start : "2025-05-12T09:00:00",
end : "2025-05-13T09:00:00",
backgroundColor: "green",
textColor : "white",
allDay : false
}
]
});
calendar.render();
});
</script>
</html>
์ ์ฉ ํ๋ฉด
'events' ์์ฑ์ ์ปค์คํ ์ผ๋ก ์์ฑ๋ ์ผ์ 2๊ฐ์ง๋ฅผ ๋ฐฐ์ด์ ํํ๋ก ๋ง๋ค์ด์ ์ค์ ํ์์ต๋๋ค. ์ฒซ๋ฒ์งธ '์ผ์ 01' ์ผ์ ์ allDay์ ์์ฑ์ด 'true'๋ก ํ๋ฃจ์ข ์ผ์ ๋ํ ์ด๋ฒคํธ๋ฅผ ๊ฐ์ง๊ณ ์๋ ์ผ์ ์ด๊ณ ๋๋ฒ์งธ '์ผ์ 02' ์ผ์ ์ allDay์ ์์ฑ์ด 'false'๋ก ํ๋ฃจ์ข ์ผ์ด ์๋๊ธฐ ๋๋ฌธ์ ์์์๊ฐ๊ณผ ๋ ์๊ฐ์ผ๋ก ์ด๋ฃจ์ด์ง ์ผ์ ์ผ๋ก ๊ตฌ์ฑ๋์ด ์์ต๋๋ค. ๊ฐ ์ผ์ ์ ๋ฐ๋ผ์ ๋ค๋ฅธ ์์ฑ ๊ฐ์ ํ์ฉํ ์ ์์ต๋๋ค.
3. ์ผ์ ๋ชฉ๋ก์ ์์ฒญํ URL๋ก ํ์บ๋ฆฐ๋์ ์ผ์ ์ถ๊ฐํ๊ธฐ (DB ์ฐ๋)
์ ์ฒด์์ค
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
<script type="text/javascript" src="https://cdn.jsdelivr.net/npm/fullcalendar@6.1.14/index.global.min.js"></script>
</head>
<body>
<div id="calendar"></div>
</body>
<script type="text/javascript">
document.addEventListener('DOMContentLoaded', function() {
let calendarEl = document.getElementById('calendar');
let headerToolbar = {
left: 'prevYear,prev,next,nextYear today',
center: 'title',
right: 'dayGridMonth,dayGridWeek,timeGridDay'
}
let calendar = new FullCalendar.Calendar(calendarEl, {
initialView: 'dayGridMonth',
headerToolbar: headerToolbar,
events: "/scheduleList.do"
});
calendar.render();
});
</script>
</html>
์ ์ฉ ํ๋ฉด
์ธ๋ฒ์งธ ๋ฐฉ์์ธ ์ผ์ ๋ชฉ๋ก์ ๊ฐ์ ธ์ค๊ธฐ ์ํ ์์ฒญ์ ์๋ฒ๋ก๋ถํฐ ๋ฐ์์ 'events' ์์ฑ์ ๋ฐฐ์ด์ ํํ๋ก ๊ตฌ์ฑํด์ค๋๋ค. ์์ฒญ URL์ ํตํด์ ๋๊ฒจ๋ฐ์ ๋ฐ์ดํฐ ์์ฒด๊ฐ List ํ์ ์ ๋ฐฐ์ด ๋ฐ์ดํฐ๊ธฐ ๋๋ฌธ์ events ์์ฑ์ ๊ฐ ์ผ์ ์ ๊ตฌ์ฑํ event๋ฅผ ์ ๊ณตํด์ค๋ค๋ฉด ์ผ์ ์ ๊ตฌ์ฑํ๋๋ฐ ๋ฌธ์ ๊ฐ ์์ต๋๋ค. ๊ทธ๋ฆฌ๊ณ ์ธ๋ฒ์งธ ๋ฐฉ์์ด ํ์บ๋ฆฐ๋๋ฅผ ๊ตฌํํ๋๋ฐ์์ด ๊ฐ์ฅ ๋ณดํธ์ ์ผ๋ก ๋ง์ด ์ฌ์ฉํ๋ ๋ฐฉ์์ ๋๋ค. (๋ฌผ๋ก events ์์ฑ์ ์์ฑํ ๋ด์ฉ์ ์์ ์๋ค ๋ง๋ค ์ฐจ์ด๊ฐ ์์ ์ ์์ต๋๋ค. ํ์๋ ์๊ฐํด๋๋ฆฐ๊ฒ์ฒ๋ผ URL ๊ธฐ๋ฐ์ผ๋ก ์์ฒญ์ ์ฒ๋ฆฌํ์์ต๋๋ค.)
๊ฐ ๋ฐฉ์์ ๋ฐ๋ผ์ event(์ผ์ )๋ฅผ ๊ตฌ์ฑํด๋ณด์์ต๋๋ค. ๋ง์ง๋ง ๋ฐฉ์์ผ๋ก ์๊ฐํด๋๋ฆฐ DB์ฐ๋์ ์ด์ฉํ ์ผ์ ๊ตฌ์ฑ์ ๋ํด์๋ [ ์คํ๋ง๋ถํธ(SpringBoot)๋ก ํ์บ๋ฆฐ๋(FullCalendar) ๊ตฌํํ๊ธฐ - 2 ] ๊ฒ์๊ธ์ ํตํด์ ์๊ฐํด๋๋ฆฌ๋๋ก ํ๊ฒ ์ต๋๋ค.
์คํ๋ง๋ถํธ(SpringBoot)๋ก ํ์บ๋ฆฐ๋(FullCalendar) ๊ตฌํํ๊ธฐ - 2
'์คํ๋ง๋ถํธ(SpringBoot)๋ก ํ์บ๋ฆฐ๋(FullCalendar) ๊ตฌํํ๊ธฐ - 1' ๊ฒ์๊ธ์ ํตํด์ ๊ธฐ๋ณธ์ ์ธ ์บ๋ฆฐ๋๋ฅผ ๊ตฌ์ฑํ๋ ๋ฐฉ๋ฒ์ ๋ํด์ ์์๋ณด์์ต๋๋ค. ํ์บ๋ฆฐ๋ ๊ตฌํํ๊ธฐ ๋ ๋ฒ์งธ ๊ฒ์๊ธ์์๋ ์ฒซ ๋ฒ์งธ ๊ฒ์
junesker.tistory.com
@Junesker