최근에 캘린더 기능을 만들게 되면서, 구현하다 보면 반드시 만나게 되는 것이 있습니다. 그건 바로 iCal(iCalendar) 문법이라는건데, 연동을 생각하는 캘린더 서비스를 만든다면 무조건 알아야 할 내용입니다. 각 캘린더 서비스들이 서로 연동을 위해 iCal이라는 특별한 형식의 데이터를 주고 받습니다. 실제로 많은 문법과 기능들이 있는데, 이번 포스트에는 가볍게 다뤄보겠습니다. 나중에 기회되면 더 자세하게 다뤄보겠습니다.
왜 iCal을 알아야 할까?
- 대부분의 캘린더 시스템이 iCal 형식으로 데이터를 주고받습니다. 다른 형식도 있지만 대체적으로 iCal을 사용합니다.
- 구글 캘린더, 애플 캘린더 등과의 연동이 필요한 경우 필수적입니다.
- 표준화된 포맷으로, 한 번 익혀두면 다양한 프로젝트에서 활용할 수 있습니다.
- CalDAV, iTIP 등의 프로토콜과 연동이 가능합니다.
iCal의 기본 구조
처음 iCal 문법을 접하면 조금 복잡해 보일 수 있습니다. 이건 뭐 json도 xml 형식도 아니고.. 좀 자기만의 특별한 형식을 가지고 있습니다. 하지만 기본 구조만 이해하면 생각보다 단순합니다. 가장 기본이 되는 구성 요소들을 하나씩 살펴보겠습니다.
1. VCALENDAR
모든 iCal 데이터는 VCALENDAR로 시작합니다. 이것은 마치 HTML의 <html>
태그와 비슷한 역할을 한다고 보면 됩니다.
그런데 앞에 왜 V가 붙는지는 모르겠네요.. 앞으로 나올 애들도 다 V로 시작하는데 이유를 모르겠슴다.
BEGIN:VCALENDAR
VERSION:2.0
PRODID:-//hacksw/handcal//NONSGML v1.0//EN
... 캘린더 내용 ...
END:VCALENDAR
2. 주요 구성 요소
캘린더 안에는 다양한 종류의 일정 정보를 담을 수 있습니다:
- VEVENT: 가장 많이 사용되는 요소로, 회의나 약속 같은 일정을 표현.
- VTODO: 할 일 목록을 관리할 때 사용.
- VALARM: 알림 설정을 담당.
- VJOURNAL: 일지나 메모 같은 정보를 기록할 때 사용.
- VFREEBUSY: 일정 가능한 시간대를 관리할 때 사용.
다양한 형식이 있는데, 저는 VEVENT와 VALARM만 사용할 것 같습니다. TODO 앱 같은 다양한 서비스를 만드는데 필요한 다른 형식도 제공해주는 것 같습니다.
날짜와 시간 표현
캘린더에서 가장 중요한 것이 바로 날짜와 시간을 정확하게 표현하는 것입니다. iCal에서는 이를 매우 체계적으로 관리합니다.
기본 형식
YYYYMMDDTHHmmSSZ
이렇게 생긴 형식은 처음 보면 이해하기 어려울 수 있습니다. 하나씩 뜯어보면:
- YYYY: 연도
- MM: 월
- DD: 일
- T: 시간 구분자
- HH: 시
- mm: 분
- SS: 초
- Z: UTC 시간대
예시
20240315T143000Z // 2024년 3월 15일 14시 30분 (UTC)
시간대 처리
개인적으로 캘린더 개발에서 가장 까다로웠던 부분이 바로 시간대 처리였습니다. 특히 글로벌 서비스를 개발할 때는 더욱 신경써줘야 합니다.
1. UTC와 로컬 시간
예를 들어, 한국에서 열리는 회의를 등록할 때는 이렇게 표현할 수 있습니다:
BEGIN:VEVENT
DTSTART;TZID=Asia/Seoul:20240316T180000
DTEND;TZID=Asia/Seoul:20240316T190000
SUMMARY:로컬 시간 이벤트
END:VEVENT
2. 시간대 정의
각 시간대에 대한 정보도 명확하게 정의할 수 있습니다:
BEGIN:VTIMEZONE
TZID:Asia/Seoul
BEGIN:STANDARD
DTSTART:19700101T000000
TZOFFSETFROM:+0900
TZOFFSETTO:+0900
END:STANDARD
END:VTIMEZONE
반복 규칙 (RRULE)
반복 규칙은 iCal의 가장 강력한 기능 중 하나입니다. 단순한 반복부터 복잡한 패턴까지 거의 모든 종류의 반복 일정을 표현할 수 있습니다.
1. 기본적인 반복 패턴
# 매주 월요일마다 반복
RRULE:FREQ=WEEKLY;BYDAY=MO
# 매월 15일마다 반복
RRULE:FREQ=MONTHLY;BYMONTHDAY=15
# 매년 1월 1일마다 반복
RRULE:FREQ=YEARLY;BYMONTH=1;BYMONTHDAY=1
2. 복잡한 반복 패턴
실제 업무에서는 이런 복잡한 패턴도 자주 사용됩니다:
# 매월 마지막 금요일
RRULE:FREQ=MONTHLY;BYDAY=-1FR
# 분기별 첫 번째 월요일 (1,4,7,10월)
RRULE:FREQ=MONTHLY;INTERVAL=3;BYDAY=1MO
# 평일마다 반복 (월-금)
RRULE:FREQ=WEEKLY;BYDAY=MO,TU,WE,TH,FR
처음에는 복잡해 보이는 iCal 문법이지만, 체계적인 구조를 가지고 있고 많은 기능들이 있습니다. 이 문법을 이해하고 있으면 다양한 캘린더 시스템과의 연동이 가능합니다.
참고 자료
'개발 아카이브 > 개발 관련 지식' 카테고리의 다른 글
REST (Representational State Transfer)란 무엇인가? (1) | 2023.07.31 |
---|---|
V8 Liftoff와 웹 어셈블리: 웹 성능을 향상시키는 강력한 조합 (0) | 2023.04.20 |
[노션 API] 노션 API 연동으로 데이터베이스 사용하기 (3) | 2023.04.09 |
자바스크립트 엔진인 V8에 대해 알아보자 (1) | 2023.02.26 |
정규식을 이용한 공격 - ReDos (0) | 2022.12.24 |