시스템 창립기념일 일정 자동 생성 설계
목적
매년 5월 23일 장단콩 클럽 창립기념일 게임 일정을 시스템이 자동으로 생성한다. 생성된 일정은 일반 게임 일정 게시판과 캘린더에서 보이며, 회원은 최대 20명까지 참가 신청할 수 있다.
일정 생성
Firebase Cloud Scheduler가 Asia/Seoul 기준 매일 자정에 실행된다. 실행 시점의 날짜가 5월 23일 이후이고 해당 연도 창립기념일 문서가 없으면 새 문서를 생성한다. 따라서 정기 실행 실패, 함수 최초 배포 시점, 또는 과거 누락으로 인해 빠진 해당 연도 일정도 다음 실행에서 복구된다.
문서 ID는 anniversary-YYYY로 고정한다. 생성 전 해당 ID를 확인하고 없을 때만 만들므로, 재시도와 동시 실행에도 연도별로 한 건만 생성된다.
생성 문서의 필드는 다음과 같다.
type:eventisAnniversary:trueauthorUid:systemauthorName:시스템title:장단콩 클럽 N주년 기념일 🎉(N = 연도 - 2023)content: 빈 문자열eventDate: 해당 연도 5월 23일 00:00,Asia/Seoul기준maxAttendees:20attendees: 빈 배열games: 빈 배열createdAt,updatedAt: 서버 시간
게시판과 상세 화면
게임 일정 게시판은 isAnniversary 일정도 불러와 캘린더와 목록에 표시한다. 게시글 상세 화면에서는 authorName이 있으면 이를 우선 표시하므로, 자동 일정의 작성자는 알 수 없음이 아니라 시스템으로 보인다.
참가 신청은 일반 일정과 동일하게 동작한다. 시스템 UID와 일치하는 실제 회원은 없으므로 작성자 전용 확정·수정·삭제 권한은 관리자에게만 있다.
통계 및 삭제
창립기념일 일정은 참가 신청을 받을 수 있지만 시스템의 일정 등록 횟수, 일정 메이커 랭킹, 등록 횟수 기반 트로피에는 포함하지 않는다. 통계 재계산은 isAnniversary === true 일정에서 postCount를 증가시키지 않으며, 참석자에 대한 attendCount는 계속 증가시킨다.
관리자가 창립기념일 일정을 삭제해도 시스템의 postCount를 변경하지 않는다. 일반 일정의 등록 횟수 차감 동작은 바꾸지 않는다.
오류 처리와 검증
- 스케줄 함수는 5월 22일 이전에는 아무 작업도 하지 않는다.
- 같은 연도의 문서가 이미 있으면 아무 작업도 하지 않는다.
- 문서 생성 실패는 오류 로그로 남기고 다음 날 다시 시도한다.
- 순수 함수 테스트로 생성 대상 날짜, N주년 제목, 문서 ID, 이미 생성된 문서의 중복 방지 조건을 검증한다.
- 게시판 선별 테스트는 창립기념일 일정이 표시됨을 검증한다.
- 통계 재계산 및 삭제 테스트는 창립기념일의
postCount제외와 참석 횟수 유지 여부를 검증한다.