FullCalendar

  • 12 minutes to read

FullCalendar를 ASP.NET Core MVC 프로젝트에서 jQuery를 사용하여 순수 웹 버전으로 통합하려면 다음 단계를 따르세요.

  1. FullCalendar 라이브러리와 필요한 종속성 설치: FullCalendar, jQuery 및 Moment.js를 프로젝트에 설치하려면 CDN을 사용할 수 있습니다. 프로젝트의 HTML 파일 (예: _Layout.cshtml)에 다음 코드를 추가합니다.
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/fullcalendar/3.10.2/fullcalendar.min.css" />
<script src="https://code.jquery.com/jquery-3.6.0.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.29.1/moment.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/fullcalendar/3.10.2/fullcalendar.min.js"></script>
  1. FullCalendar를 사용하려는 뷰에 캘린더 요소 추가: 뷰 파일 (예: Index.cshtml)에 캘린더를 표시할 요소를 추가합니다.
<div id="calendar"></div>
  1. FullCalendar 설정 및 초기화: 뷰 파일에 <script> 태그를 추가하여 FullCalendar를 설정하고 초기화합니다. 다음은 기본 설정을 사용한 예입니다.
<script>
    $(document).ready(function() {
    $('#calendar').fullCalendar({
        header: {
        left: 'prev,next today',
        center: 'title',
        right: 'month,agendaWeek,agendaDay'
        },
        defaultView: 'month',
        navLinks: true, // can click day/week names to navigate views
        editable: true,
        eventLimit: true // allow "more" link when too many events
    });
    });
</script>
  1. 이벤트 및 추가 설정 적용 (선택 사항): 필요한 경우 FullCalendar에 이벤트를 추가하거나 추가 설정을 적용할 수 있습니다. 예를 들어, 서버에서 이벤트 데이터를 가져오려면 다음과 같이 events 속성을 사용할 수 있습니다.
events: '/api/events' // 이벤트 데이터를 반환하는 서버 API 경로

이제 FullCalendar가 ASP.NET Core MVC 프로젝트에 통합되었습니다. 위의 예제와 문서를 참조하여 필요한 기능과 설정을 추가할 수 있습니다. 자세한 정보와 예제는 FullCalendar 공식 문서에서 확인할 수 있습니다: https://fullcalendar.io/docs/v3

Web API로 캘린더 구현하기

아래의 단계를 따라 ASP.NET Core Web API를 만들고 FullCalendar를 사용하여 일단위 스케줄러를 표현하고 각각의 셀에 해당 날짜의 이벤트를 출력하고 해당 셀을 더블 클릭했을 때 이벤트를 생성하는 코드를 작성할 수 있습니다.

  1. ASP.NET Core Web API 컨트롤러 생성

먼저, 새로운 API 컨트롤러를 만들어 모델과 DbContext 클래스를 사용합니다. Controllers 폴더에 AppointmentController.cs 파일을 생성하고 아래 코드를 추가하세요.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using KodeeOne.Appointments.Data;
using KodeeOne.Appointments.Models;
using Microsoft.AspNetCore.Mvc;
using Microsoft.EntityFrameworkCore;

namespace KodeeOne.Appointments.Controllers
{
    [Route("api/[controller]")]
    [ApiController]
    public class AppointmentController : ControllerBase
    {
        private readonly AppointmentDbContext _context;

        public AppointmentController(AppointmentDbContext context)
        {
            _context = context;
        }

        // GET: api/Appointment
        [HttpGet]
        public async Task<ActionResult<IEnumerable<Appointment>>> GetAppointments()
        {
            return await _context.Appointments.ToListAsync();
        }

        // POST: api/Appointment
        [HttpPost]
        public async Task<ActionResult<Appointment>> CreateAppointment(Appointment appointment)
        {
            _context.Appointments.Add(appointment);
            await _context.SaveChangesAsync();

            return CreatedAtAction(nameof(GetAppointments), new { id = appointment.Id }, appointment);
        }
    }
}
  1. FullCalendar 설정 및 이벤트 처리 업데이트

이제, FullCalendar를 사용하여 일단위 스케줄러를 표현하고 각각의 셀에 해당 날짜의 이벤트를 출력하고 해당 셀을 더블 클릭했을 때 이벤트를 생성하는 코드를 작성합니다. 뷰 파일 (예: Index.cshtml)에 아래 코드를 추가하세요.

<!DOCTYPE html>
<html>
<head>
  <meta charset="utf-8">
  <title>FullCalendar - Day View Scheduler</title>
  <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/fullcalendar/3.10.2/fullcalendar.min.css" />
  <script src="https://code.jquery.com/jquery-3.6.0.min.js"></script>
  <script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.29.1/moment.min.js"></script>
  <script src="https://cdnjs.cloudflare.com/ajax/libs/fullcalendar/3.10.2/fullcalendar.min.js"></script>
  <script>
    $(document).ready(function() {
      var calendar = $('#calendar').fullCalendar({
        header: {
          left: 'prev,next today',
          center: 'title',
          right: 'agendaDay'
        },
        defaultView: 'agendaDay',
        navLinks: true,
        editable: true,
        eventLimit: true,
        events: '/api/Appointment',
        selectable: true,
        selectHelper: true,
        select: function(start, end) {
          var title = prompt('Event Title:');
          if (title) {
            var eventData = {
              title: title,
              start: start,
              end: end
            };
            calendar.fullCalendar('renderEvent', eventData, true);
            $.ajax({
              type: 'POST',
              url: '/api/Appointment',
              contentType: 'application/json',
              data: JSON.stringify({
                title: title,
                startTime: start.toISOString(),
                endTime: end.toISOString()
              }),
              success: function (response) {
                console.log('Event created:', response);
              },
              error: function (error) {
                console.error('Error creating event:', error);
              }
            });
          }
          calendar.fullCalendar('unselect');
        }
      });
    });
  </script>
</head>
<body>
  <div id="calendar"></div>
</body>
</html>

위의 코드는 FullCalendar를 사용하여 일단위 스케줄러를 표현하고 이벤트를 불러오는 설정을 적용합니다. 또한, 셀을 더블 클릭하여 이벤트를 생성하고 해당 이벤트를 서버에 저장하는 기능을 구현합니다. 이벤트를 생성할 때 startTime과 endTime을 사용하고 있는데, 이는 Appointment 모델에 있는 Start와 End에 매핑됩니다. 여기서 필요한 추가 필드를 자유롭게 추가할 수 있습니다.

좀 더 자세한 모양의 이벤트 등록 폼

FullCalendar에서 이벤트를 등록하는 Bootstrap 5 모달 폼을 구현하려면 다음 단계를 따르세요.

  1. FullCalendar 라이브러리와 필요한 종속성 설치:

HTML 파일의 태그 안에 아래의 코드를 추가하거나, 프로젝트에 필요한 파일들을 추가해주세요.

<!-- FullCalendar dependencies -->
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/fullcalendar/5.10.0/main.min.css" integrity="sha512-RlGItx9qaGz5r3Cx5rJxnjwG7Hn5xYeZgg7UuTY6U8Vn9pB6GdV6UuB6Urg2w+uCV6VQZ0d6YRakD5P/0j9/3g==" crossorigin="anonymous" referrerpolicy="no-referrer" />
<script src="https://cdnjs.cloudflare.com/ajax/libs/fullcalendar/5.10.0/main.min.js" integrity="sha512-6LVuZgtGndnEYf7Gn8T+9XyjTqmlfwwanMnD8gJv+L3TR4di4KzYXDZt8v4zXGyEORJyRjWkF8bsSfC3/4M4jYg==" crossorigin="anonymous" referrerpolicy="no-referrer"></script>
  1. FullCalendar 초기화 및 이벤트 핸들러 추가:

HTML 파일에 아래 코드를 추가하여 FullCalendar를 초기화하고, 이벤트를 클릭하거나 새 이벤트를 만들 때 모달 폼을 보여주도록 이벤트 핸들러를 추가하세요.

<div id="calendar"></div>
<script>
document.addEventListener('DOMContentLoaded', function () {
  var calendarEl = document.getElementById('calendar');

  var calendar = new FullCalendar.Calendar(calendarEl, {
    initialView: 'dayGridMonth',
    headerToolbar: {
      left: 'prev,next today',
      center: 'title',
      right: 'dayGridMonth,timeGridWeek,timeGridDay'
    },
    eventClick: function (info) {
      // 이벤트 클릭 시, 이벤트 수정 모달 폼을 여기에 표시하세요.
    },
    dateClick: function (info) {
      // 새 이벤트를 만들려면 여기에서 모달 폼을 표시하세요.
    }
  });

  calendar.render();
});
</script>
  1. 이벤트 등록 모달 폼 추가:

ModalForm.razor 및 ModalForm.razor.cs 파일에 작성된 코드를 참조하여 모달 폼을 구현해주세요. 위의 코드에 이벤트 클릭 및 날짜 클릭 이벤트 핸들러에서 이 모달 폼을 표시하도록 설정하세요.

<!-- 이벤트 등록 모달 폼 -->
<div class="modal" tabindex="-1" id="eventModal">
  ...
</div>
  1. 이벤트 클릭 및 날짜 클릭 이벤트 핸들러 수정:

이벤트를 클릭하거나 새 이벤트를 만들 때 이벤트 등록 모달 폼을 보여주도록 이벤트 핸들러를 수정하세요. 이를 위해 eventClick 및 dateClick 이벤트 핸들러를 아래와 같이 수정합니다.

eventClick: function (info) {
  // 이벤트 클릭 시, 이벤트 수정 모달 폼을 표시하세요.
  showModalForm(info.event); // info.event 객체를 사용하여 모달 폼을 표시하세요.
},
dateClick: function (info) {
  // 새 이벤트를 만들려면 여기에서 모달 폼을 표시하세요.
  showModalForm(); // 새 이벤트를 위한 빈 모달 폼을 표시하세요.
}
  1. 모달 폼을 표시하는 함수 추가:

showModalForm 함수를 추가하여 이벤트 정보를 기반으로 모달 폼을 표시하고, 모달 폼의 입력란을 채우세요.

function showModalForm(event) {
  var eventModal = new bootstrap.Modal(document.getElementById('eventModal'));

  if (event) {
    // 이벤트 수정 모드
    // 모달 폼의 입력란에 이벤트 정보를 채우세요.
    // 예: document.getElementById('inputTitle').value = event.title;
  } else {
    // 새 이벤트 생성 모드
    // 모달 폼의 입력란을 비워주세요.
    // 예: document.getElementById('inputTitle').value = '';
  }

  eventModal.show(); // 모달 폼을 표시하세요.
}
  1. 모달 폼 저장 버튼 클릭 이벤트 핸들러 추가:

모달 폼의 "저장" 버튼이 클릭되면, 이벤트를 생성하거나 수정하는 함수를 호출하세요. 이를 위해 버튼에 클릭 이벤트 리스너를 추가하세요.

<button type="button" class="btn btn-primary" onclick="saveEvent()">저장</button>
  1. 이벤트 생성 및 수정 함수 추가:

이벤트를 생성하거나 수정하는 함수인 saveEvent를 추가하세요. 이 함수는 FullCalendar 인스턴스에 이벤트를 추가하거나 수정하고, 모달 폼을 숨깁니다.

function saveEvent() {
  // 이벤트 정보를 입력란에서 가져오세요.
  // 예: var title = document.getElementById('inputTitle').value;

  if (event) {
    // 이벤트 수정
    // 수정된 이벤트 정보로 이벤트 객체를 업데이트하세요.
    // 예: event.setProp('title', title);
  } else {
    // 새 이벤트 생성
    // 새 이벤트 객체를 생성하고, 이벤트 정보를 설정하세요.
    // 예: var newEvent = { title: title, start: selectedDate };

    // FullCalendar 인스턴스에 새 이벤트를 추가하세요.
    // 예: calendar.addEvent(newEvent);
  }

  // 모달 폼을 숨기세요.
  var eventModal = new bootstrap.Modal(document.getElementById('eventModal'));
  eventModal.hide();
}

이제 FullCalendar에서 이벤트를 클릭하거나 날짜를 클릭하면 Bootstrap 5 모달 폼이 표시되고, 이벤트를 생성하거나 수정할 수 있습니다. 위 코드는 기본 구조이며, 실제 구현에서는 추가적인 유효성 검사, 입력란 초기화 및 서버와의 통신을 고려해야 합니다.

전체 소스 코드

아래는 1단계부터 7단계까지의 과정을 완료한 Index.cshtml 페이지의 전체 소스입니다. 이 예제는 HTML, JavaScript, CSS를 모두 포함하고 있습니다.

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>FullCalendar with Bootstrap 5 Modal</title>
    
    <!-- Bootstrap CSS -->
    <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0-alpha1/dist/css/bootstrap.min.css" rel="stylesheet" crossorigin="anonymous">
    <!-- FullCalendar CSS -->
    <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/fullcalendar/3.10.2/fullcalendar.min.css" />

    <style>
        /* 여기에 추가적인 CSS 스타일을 적용하세요. */
    </style>
</head>
<body>
    <div class="container">
        <div id="calendar"></div>
    </div>

    <!-- Event Modal -->
    <div class="modal fade" id="eventModal" tabindex="-1" aria-labelledby="eventModalLabel" aria-hidden="true">
        <div class="modal-dialog">
            <div class="modal-content">
                <div class="modal-header">
                    <h5 class="modal-title" id="eventModalLabel">New Event</h5>
                    <button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
                </div>
                <div class="modal-body">
                    <!-- 여기에 이벤트 정보 입력란을 추가하세요. 예: -->
                    <div class="mb-3">
                        <label for="inputTitle" class="form-label">Title</label>
                        <input type="text" class="form-control" id="inputTitle">
                    </div>
                </div>
                <div class="modal-footer">
                    <button type="button" class="btn btn-secondary" data-bs-dismiss="modal">Close</button>
                    <button type="button" class="btn btn-primary" onclick="saveEvent()">Save</button>
                </div>
            </div>
        </div>
    </div>

    <!-- jQuery, Popper.js, Bootstrap JS -->
    <script src="https://code.jquery.com/jquery-3.6.0.min.js" crossorigin="anonymous"></script>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/2.11.6/umd/popper.min.js" crossorigin="anonymous"></script>
    <script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0-alpha1/dist/js/bootstrap.min.js" crossorigin="anonymous"></script>

    <!-- FullCalendar JS -->
    <script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.29.1/moment.min.js" crossorigin="anonymous"></script>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/fullcalendar/3.10.2/fullcalendar.min.js" crossorigin="anonymous"></script>

    <script>
        // 여기에 JavaScript 코드를 작성하세요.

        // 변수 선언
        var calendar;
        var event;

        // FullCalendar 초기화
        $(document).ready(function () {
            calendar = $('#calendar').fullCalendar({
                // FullCalendar 옵션 설정
                header: {
                    left: 'prev,next today',
                    center: 'title',
                    right: 'month,agendaWeek,agendaDay'
                },
                navLinks: true,
                selectable: true,
                selectHelper: true,
                editable: true,
                eventLimit: true,

                // 이벤트 클릭 이벤트 처리
                eventClick: function (calEvent, jsEvent, view) {
                    event = calEvent;
                    $('#inputTitle').val(calEvent.title);
                    $('#eventModalLabel').text('Edit Event');
                    $('#eventModal').modal('show');
                },

                // 날짜 클릭 이벤트 처리
                dayClick: function (date, jsEvent, view) {
                    event = null;
                    $('#inputTitle').val('');
                    $('#eventModalLabel').text('New Event');
                    $('#eventModal').modal('show');
                },
            });
        });

        // 이벤트 생성 및 수정 함수 추가
        function saveEvent() {
            var title = $('#inputTitle').val();

            if (title) {
                var eventData = {
                    title: title,
                    start: event ? event.start : $('#calendar').fullCalendar('getDate'),
                    end: event ? event.end : null,
                };

                if (event) {
                    // 이벤트 수정
                    event.title = title;
                    $('#calendar').fullCalendar('updateEvent', event);
                } else {
                    // 이벤트 생성
                    $('#calendar').fullCalendar('renderEvent', eventData, true);
                }
                $('#eventModal').modal('hide');
            } else {
                alert('Title is required');
            }
        }
    </script>
</body>
</html>

위의 소스코드에서 FullCalendar 초기화 부분에 이벤트 클릭 이벤트 처리, 날짜 클릭 이벤트 처리, 이벤트 생성 및 수정 함수 추가 등이 포함되어 있습니다. 이제 이 코드를 사용하여 이벤트를 추가, 편집할 수 있는 Bootstrap 5 모달 폼을 FullCalendar와 함께 사용할 수 있습니다.

VisualAcademy Docs의 모든 콘텐츠, 이미지, 동영상의 저작권은 박용준에게 있습니다. 저작권법에 의해 보호를 받는 저작물이므로 무단 전재와 복제를 금합니다. 사이트의 콘텐츠를 복제하여 블로그, 웹사이트 등에 게시할 수 없습니다. 단, 링크와 SNS 공유, Youtube 동영상 공유는 허용합니다. www.VisualAcademy.com
박용준 강사의 모든 동영상 강의는 데브렉에서 독점으로 제공됩니다. www.devlec.com