반복 이벤트
반복 이벤트는 이벤트 캘린더 애플리케이션에서 흔히 사용되는 기능으로, 사용자가 지정된 간격으로 반복되는 이벤트를 생성할 수 있게 해줍니다. v7.1부터 Scheduler는 반복 이벤트에 대해 RFC-5545 기반 형식을 사용합니다.
이 문서는 Scheduler에서 반복 이벤트를 사용하는 방법과 이를 데이터베이스에 저장하는 방법을 설명합니다.
레거시 형식의 반복 이벤트에 대한 설명은 여기에서 확인할 수 있습니다.
기본적으로 Scheduler는 반복 이벤트를 직접적으로 지원하지 않습니다. 이러한 기능을 제공하려면 페이지에서 recurring 확장을 활성화해야 합니다:
scheduler.plugins({
recurring: true
});
반복 이벤트에 대한 지원이 활성화되면 라이트박스는 아래와 같이 보이기 시작합니다:

구성 옵션
라이브러리는 반복 이벤트를 구성하기 위한 다음 옵션을 제공합니다:
repeat_date- 'recurring' 라이트박스의 'End by' 필드의 날짜 형식을 설정합니다
scheduler.config.repeat_date = "%m/%d/%Y";
...
scheduler.init('scheduler_here', new Date(2027, 7, 5), "month");
관련 샘플 Recurring events
'Recurring' 라이트박스
기본적으로 반복 확장이 활성화되면 라이트박스에 하나의 추가 섹션인 "Repeat event"가 생깁니다. 그리고 기본적인 'recurring' 라이트박스의 정의는 아래와 같이 시작합니다:
scheduler.config.lightbox.sections = [
{ name: "description", map_to: "text", type: "textarea", focus: true },
{ name: "recurring", type: "recurring", map_to: "rrule" },
{ name: "time", height: 72, type: "time", map_to: "auto" }
];
관련 샘플 Recurring events
형식 설명
반복 이벤트는 일반 이벤트의 모든 필드에 더하여 여러 추가 속성을 포함하는 단일 레코드로 데이터베이스에 저장됩니다:
- start_date - (datetime) 시리즈의 시작 날짜를 정의합니다
- end_date - (datetime) 시리즈의 종료 날짜를 정의합니다
- rrule - (string) 반복 규칙을 정의합니다
- duration - (number) 반복 인스턴스의 지속 시간
- recurring_event_id - (string|number) 상위 시리즈의 ID이며, 수정되었거나 삭제된 시리즈의 발생에 대해서만 채워집니다
- original_start - (datetime) 편집된 인스턴스의 원래 날짜이며, 수정되었거나 삭제된 발생에 대해서만 채워집니다
- deleted - (boolean) 시리즈의 삭제된 인스턴스를 지정하며, 삭제된 발생에 대해서만 채워집니다
rrule 은 RFC-5545에 명시된 iCalendar 형식을 따르며, 반복 패턴을 제어하는 주기, 간격 및 기타 매개변수를 자세히 설명합니다.
iCalendar 형식과의 차이점
저희 형식은 iCalendar 형식과 두 가지 핵심 시점에서 다릅니다:
STDATE와 DTEND의 분리 저장:
iCalendar 형식에서 반복 시리즈의 시작일과 종료일은 일반적으로 RRULE 문자열의 일부로 STDATE와 DTEND 속성으로 포함됩니다. 저희 형식에서는 stdate와 dtend를 별도의 필드로 저장합니다. 이 분리는 RRULE 문자열을 구문 분석하지 않고도 날짜별로 반복 이벤트를 더 쉽게 조작하고 쿼리할 수 있게 해줍니다.
다음은 2027년 6월 1일 시작하여 2027년 12월 1일까지만 반복하도록 설정된 반복 이벤트 시리즈의 예시입니다:
{
"id": 1,
"text": "주간 팀 미팅",
"start_date": "2027-06-03 09:00:00",
"duration": 3600,
"end_date": "2027-12-02 10:00:00",
"rrule": "FREQ=WEEKLY;INTERVAL=1;BYDAY=MO",
"recurring_event_id": null,
"original_start": null
}
예외 처리
예외(시리즈의 수정되었거나 삭제된 발생)는 상위 시리즈와 연결된 별도 이벤트 레코드로 저장됩니다. 예외에는 세 가지 추가 속성이 있습니다: recurring_event_id, original_start, 그리고 deleted. 이러한 속성은 수정되었거나 삭제된 인스턴스의 식별과 상위 시리즈와의 관계를 쉽게 만들어 줍니다.
전통적인 iCalendar 형식과 달리 예외(수정되었거나 삭제된 인스턴스)는 시리즈의 RRULE의 EXDATE 속성에 저장되지 않는다는 점에 주의하십시오.
다음은 하나의 수정된 발생과 하나의 삭제된 발생이 있는 반복 시리즈의 예시입니다:
[
{
"id": 1,
"text": "주간 팀 미팅",
"start_date": "2027-06-03 09:00:00",
"duration": 3600,
"end_date": "2027-12-02 10:00:00",
"rrule": "FREQ=WEEKLY;INTERVAL=1;BYDAY=MO",
"recurring_event_id": null,
"original_start": null
},
{
"id": 2,
"text": "특별 팀 미팅",
"start_date": "2027-06-10 09:00:00",
"end_date": "2027-06-10 11:00:00",
"rrule": null,
"recurring_event_id": 1,
"original_start": "2027-06-10 09:00:00"
},
{
"id": 3,
"text": "삭제된 팀 미팅",
"start_date": "2027-06-17 09:00:00",
"end_date": "2027-06-17 10:00:00",
"rrule": null,
"recurring_event_id": 1,
"original_start": "2027-06-17 09:00:00",
"deleted": true
}
]
2027-06-10 09:00:00에 예정된 반복 이벤트는 Special Team Meeting 레코드로 대체되며, 2027-06-17 09:00:00에 예정된 이벤트는 건너뛰어집니다.
수정되거나 삭제된 발생의 rrule은 무시됩니다.
삭제된 인스턴스의 text, start_date, 및 end_date 역시 무시되며, 이들 필드의 값은 Scheduler의 동작에 영향을 주지 않습니다.
시리즈의 특정 발생을 편집/삭제하기
시리즈의 특정 발생을 삭제하거나 편집하는 것이 가능합니다.
주요 팁
- 반복 이벤트의 각 업데이트마다 DB에 별도 레코드가 생성됩니다.
- 특정 발생은 recurring_event_id 속성으로 상위 이벤트를 참조합니다.
- 시리즈의 특정 발생을 편집한 경우, 이 업데이트에 대해 original_start 필드가 수정되었을 때 원래 발생해야 했던 시점을 저장합니다. 예를 들어 2027년 7월 27일 15:00에 발생한 발생이 7월 30일 15:00으로 이동했다면, 타임스탬프는 첫 날짜를 반영합니다.
서버 측 로직
추가 필드 외에도 서버 측 컨트롤러에 특정 로직이 필요합니다:
- 삭제된 인스턴스가 삽입되었으면 서버 응답은 "deleted" 상태를 가져야 합니다.
- 삭제된 인스턴스는 deleted 속성의 비어 있지 않은 값으로 식별할 수 있습니다.
- 시리즈가 수정되었다면 시리즈의 모든 수정된 및 삭제된 발생은 삭제되어야 합니다.
- 시리즈는 비어 있지 않은 값의 rrule 속성과 비어 있는 값의 recurring_event_id 속성으로 식별됩니다.
- 시리즈의 수정된 발생은 recurring_event_id가 시리즈의 id와 일치하는 모든 레코드입니다.
- 비어 있지 않은 recurring_event_id를 가진 이벤트가 삭제되었다면, 삭제 처리 대신
deleted="true"로 업데이트해야 합니다.
전체 코드 예제는 여기에서 확인할 수 있습니다.
라이트박스의 반복 블록에 대한 사용자 정의 컨트롤
버전 4.2부터 Scheduler는 라이트박스의 반복 블록에 대한 사용자 정의 HTML을 지정할 수 있습니다.