๐Ÿ“Œ FullCalendar + Google Calendar ์—ฐ๋™

My Pale Blue Dotยท2025๋…„ 5์›” 14์ผ
0

SPRING BOOT

๋ชฉ๋ก ๋ณด๊ธฐ
30/40
post-thumbnail

๐Ÿ“… 2025-05-14

๐Ÿ“ ํ•™์Šต ๋‚ด์šฉ

โœ… 1. ๋ชฉํ‘œ

  • HTML ํŽ˜์ด์ง€์— FullCalendar๋ฅผ ๋„์šฐ๊ณ 
  • Google Calendar์—์„œ ๊ณต๊ฐœํ•œ ์ผ์ •์„ ๋ถˆ๋Ÿฌ์™€ ์—ฐ๋™
  • ์ผ์ • ํด๋ฆญ ์‹œ ์‚ฌ์šฉ์ž ์ •์˜ ๋™์ž‘ ์‹คํ–‰

โœ… 2. ์ „์ฒด ํ๋ฆ„

  1. FullCalendar ๊ณต์‹ ๋ฌธ์„œ ์ฐธ๊ณ 
  2. GCP(Google Cloud Platform)์—์„œ ์ƒˆ ํ”„๋กœ์ ํŠธ ์ƒ์„ฑ
  3. Google Calendar API ์‚ฌ์šฉ ์„ค์ •
  4. API Key ๋ฐœ๊ธ‰ + ์ œํ•œ ์„ค์ •
    • ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ œํ•œ: ์›น์‚ฌ์ดํŠธ (http://localhost:8090/*)
    • API ์ œํ•œ: Google Calendar API
  5. Google Calendar์—์„œ ํ…Œ์ŠคํŠธ์šฉ ์บ˜๋ฆฐ๋” ์ƒ์„ฑ
    • โ€œ๊ณต๊ฐœ๋กœ ์„ค์ •โ€ ์ฒดํฌ
    • ์บ˜๋ฆฐ๋” ID ๋ณต์‚ฌ
  6. HTML ์ฝ”๋“œ์—์„œ FullCalendar์™€ Google Calendar ํ”Œ๋Ÿฌ๊ทธ์ธ ์—ฐ๊ฒฐ

โœ… ๐Ÿ’ก ํŒ: ๊ณต์‹ ๋ฐ๋ชจ์ฒ˜๋Ÿผ ๊ตฌ์„ฑํ•˜๋Š” ๋ฒ•

๐Ÿ”— ๊ณต์‹ ๋ฐ๋ชจ ํŽ˜์ด์ง€

  1. ํŽ˜์ด์ง€ ์šฐํด๋ฆญ โ†’ "๊ฒ€์‚ฌ" (F12)
  2. <head> ์•ˆ <link>์™€ <script> ํƒœ๊ทธ ๋ณต์‚ฌ
  3. ๋™์ผํ•œ ๋ฆฌ์†Œ์Šค๋ฅผ ๋‚ด ํ”„๋กœ์ ํŠธ์— ๋ถ™์—ฌ๋„ฃ๊ธฐ
<link href="https://cdn.jsdelivr.net/npm/fullcalendar@6.1.17/index.global.min.css" rel="stylesheet" />
<script src="https://cdn.jsdelivr.net/npm/fullcalendar@6.1.17/index.global.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/@fullcalendar/google-calendar@6.1.17/index.global.min.js"></script>

โœ… 3. ์ „์ฒด HTML ์ฝ”๋“œ ์˜ˆ์‹œ

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>FullCalendar + Google Calendar ์—ฐ๋™</title>

    <link href="https://cdn.jsdelivr.net/npm/fullcalendar@6.1.17/index.global.min.css" rel="stylesheet" />
    <script src='https://cdn.jsdelivr.net/npm/fullcalendar@6.1.17/index.global.min.js'></script>
    <script src='https://cdn.jsdelivr.net/npm/@fullcalendar/google-calendar@6.1.17/index.global.min.js'></script>

    <script>
        document.addEventListener('DOMContentLoaded', function() {
          var calendarEl = document.getElementById('calendar');
          var calendar = new FullCalendar.Calendar(calendarEl, {
            initialView: 'dayGridMonth',
            googleCalendarApiKey: 'AIzaSyA***********************wDw', // โ† ์‹ค์ œ API ํ‚ค
            events: {
              googleCalendarId: '64a6...f5229f@group.calendar.google.com' //  โ† ๊ณต๊ฐœ ์บ˜๋ฆฐ๋” ID
            },
            eventClick: function(info) {
              info.jsEvent.preventDefault(); // ๊ธฐ๋ณธ ์ด๋™ ๋™์ž‘ ๋ฐฉ์ง€
              console.log(info); // ์ „์ฒด ์ด๋ฒคํŠธ ์ •๋ณด ์ถœ๋ ฅ
              console.log(info.event._def.title); // ์ด๋ฒคํŠธ ์ œ๋ชฉ ์ถœ๋ ฅ
              info.el.style.borderColor = 'red'; // ํด๋ฆญ ์‹œ ํ…Œ๋‘๋ฆฌ ์ƒ‰์ƒ ๋ณ€๊ฒฝ
            }
          });
          calendar.render();
        });
    </script>
</head>
<body>
  <h1>FULLCALENDAR + GOOGLE CALENDAR ์—ฐ๋™</h1>
  <div id='calendar'></div>
</body>
</html>

๐Ÿ”— ์ฐธ๊ณ  ์ž๋ฃŒ


๋А๋‚€ ์ 

  • ๊ตฌ๊ธ€ ์บ˜๋ฆฐ๋” ์—ฐ๋™ ์ž์ฒด๋Š” ๋น„๊ต์  ๊ฐ„๋‹จํ•˜์ง€๋งŒ API ํ‚ค ๋ณด์•ˆ ์„ค์ •, ๊ณต๊ฐœ ์„ค์ •, ์บ˜๋ฆฐ๋” ID ๊ด€๋ฆฌ ๋“ฑ์ด ์ค‘์š”ํ•˜๋‹ค.
  • eventClick์„ ํ™œ์šฉํ•˜๋ฉด ์‚ฌ์šฉ์ž์˜ ์ธํ„ฐ๋ž™์…˜์„ ์„ธ๋ฐ€ํ•˜๊ฒŒ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ์–ด ์‹ค๋ฌด ํ™œ์šฉ๋„๊ฐ€ ๋†’๋‹ค.
  • ์ฝ˜์†” ๋กœ๊ทธ๋‚˜ ์Šคํƒ€์ผ ์กฐ์ž‘ ์™ธ์—๋„ ํด๋ฆญ ์‹œ ์ƒ์„ธํŽ˜์ด์ง€๋กœ ์ด๋™, ๋ชจ๋‹ฌ ์—ด๊ธฐ ๋“ฑ ๋‹ค์–‘ํ•œ ํ™•์žฅ์ด ๊ฐ€๋Šฅํ•˜๋‹ค.

์š”์•ฝ (Summary)

ํ•ญ๋ชฉ๋‚ด์šฉ
API ํ”Œ๋žซํผGoogle Calendar API
ํ”„๋ก ํŠธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌFullCalendar v6
์—ฐ๋™ ๋ฐฉ์‹API ํ‚ค + ๊ณต๊ฐœ ์บ˜๋ฆฐ๋” ID
์ฃผ์š” ๊ธฐ๋Šฅ์ผ์ • ํ‘œ์‹œ, ํด๋ฆญ ์ด๋ฒคํŠธ ์ฒ˜๋ฆฌ
๊ฒฐ๊ณผHTML์—์„œ Google Calendar ์ผ์ • ์ถœ๋ ฅ + ํด๋ฆญ ๊ธฐ๋Šฅ ๊ตฌํ˜„ ์™„๋ฃŒ

โœ… ๋งˆ๋ฌด๋ฆฌ ํŒ

Google Calendar์— ์ƒˆ๋กœ์šด ์ผ์ •์„ ์ถ”๊ฐ€ํ•˜๋ฉด, ์—ฐ๋™๋œ FullCalendar์—์„œ๋„ ์ž๋™์œผ๋กœ ๋ฐ˜์˜๋œ๋‹ค!

๊ฑฐ์˜ ์‹ค์‹œ๊ฐ„์œผ๋กœ ์—ฐ๋™๋˜๋ฉฐ ์‚ฌ์šฉ์ž์—๊ฒŒ ์ตœ์‹  ์ผ์ •์„ ์ œ๊ณตํ•  ์ˆ˜ ์žˆ๋‹ค.


profile
Here, My Pale Blue.๐ŸŒ

0๊ฐœ์˜ ๋Œ“๊ธ€