@@ -6,16 +6,26 @@ Routine은 **반복되는 일정**을 표현하는 도메인이다. RFC 5545 (iC
66
77- 단발성 일정은 ` Memo ` 가 담당한다. Routine은 "규칙에 따라 여러 번 발생하는" 이벤트다.
88- Routine은 ** 규칙(RRULE)** , ** 명시적 포함(RDATE)** , ** 명시적 제외(EXDATE)** 세 가지로 실제 발생일 집합을 결정한다.
9+ - 하나의 Routine은 ** 여러 개의 RRULE을 OR 결합** 할 수 있다 (` Routine.rRules: List<RoutineRRule> ` ).
910
1011## 2. 설계 원칙
1112
1213### RFC 5545 호환 구조 (모델 레벨)
1314
14- ` RoutineRRule ` 등 도메인 모델은 ** RFC 5545의 호환 구조** (필드명, 타입 관례)를 따른다. 스펙을 따르는 외부 시스템(iCalendar 파일 등)과의 호환성 확보 및 향후 확장 시 스펙 충돌 방지가 목적이다.
15+ ` RoutineRRule ` 등 도메인 모델은 ** RFC 5545의 호환 구조** (필드명, 타입 관례)를 기본으로 따른다. 스펙을 따르는 외부 시스템(iCalendar 파일 등)과의 호환성 확보 및 향후 확장 시 스펙 충돌 방지가 목적이다.
1516
16- - 필드명은 RFC 5545 표기( ` byDay ` , ` byMonthDay ` 등)를 따른다 .
17+ - RFC 의미를 그대로 보존하는 필드는 RFC 표기를 따른다 (예: ` byMonthDay ` ) .
1718- 단, ** 실제로 사용하는 필드만** 모델에 둔다. 필드 존재 여부는 "RFC 스펙 전체 표현"이 아닌 "앱 사용 여부"가 기준이다.
1819
20+ ### RFC와 의미가 다른 필드는 도메인 명칭을 사용
21+
22+ RFC 5545의 표기를 그대로 쓰면 ** 의미가 달라 오해를 부르는 필드** 는 ` diary* ` 접두 등 도메인 명칭으로 명명한다.
23+
24+ - ` RoutineRRule.diaryByDay: RRuleDiaryByDay ` — RFC 5545의 ` BYDAY ` 와 표기는 닮았지만 의미가 다르다.
25+ - RFC ` BYDAY ` ordinal: "그 발생 주기 내 N번째 발생"
26+ - Diary ` RRuleDiaryByDay.ordinal ` : ** 일요일 시작 캘린더의 N번째 주** (` null ` =매주, ` >0 ` =N번째 주, ` <0 ` =끝에서 N번째 주)
27+ - 자세한 의미는 ` RRuleDiaryByDay ` 의 KDoc 참고.
28+
1929### 미사용 규칙은 구현하지 않음
2030
2131실제 앱에서 사용하지 않는 규칙은 ** 모델/계산/유효성 검증/UI** 어느 레이어에도 구현하지 않는다.
@@ -27,15 +37,21 @@ Routine은 **반복되는 일정**을 표현하는 도메인이다. RFC 5545 (iC
2737
2838| 용어 | 구분 | 의미 |
2939| ---| ---| ---|
30- | ** RRULE** | RFC 5545 | 반복 규칙 (e.g. "매주 월/수/금"). ` RoutineRRule ` 데이터 클래스. |
31- | ** RDATE** | RFC 5545 | RRULE 외에 추가로 포함할 명시적 날짜 집합. ` Routine.rDates ` . |
32- | ** EXDATE** | RFC 5545 | RRULE에서 제외할 명시적 날짜 집합. ` Routine.exDates ` . |
33- | ** routineCount** | 앱 특화 | ** 발생일 1회당 수행 횟수** . 예: "매일 물 8회 마시기" → ` 8 ` . RRULE이 발생일을, ` routineCount ` 가 발생일 내 반복 횟수를 결정한다. |
40+ | ** RRULE** | RFC 5545 | 반복 규칙 (e.g. "매주 월/수/금"). ` RoutineRRule ` 데이터 클래스. ` Routine.rRules ` 는 List이며 여러 규칙을 OR 결합한다. |
41+ | ** RDATE** | RFC 5545 | RRULE 외에 추가로 포함할 명시적 날짜 집합. ` Routine.rDates: Set<LocalDate> ` . |
42+ | ** EXDATE** | RFC 5545 | RRULE에서 제외할 명시적 날짜 집합. ` Routine.exDates: Set<LocalDate> ` . |
43+ | ** diaryByDay** | 앱 특화 | RFC ` BYDAY ` 와 다른 도메인 표현. 요일 집합 + "월 내 N번째 주" ordinal. ` RRuleDiaryByDay ` . |
44+ | ** byMonthDay** | RFC 5545 | RFC ` BYMONTHDAY ` 와 동일. ` RoutineRRule.byMonthDay: Set<Int> ` . |
45+ | ** routineCount** | 앱 특화 | ** 발생일 1회당 수행 횟수** . 예: "매일 물 8회 마시기" → ` 8 ` . RRULE이 발생일을, ` routineCount ` 가 발생일 내 반복 횟수를 결정한다. ` RoutineDetail.routineCount ` . |
46+ | ** isCalendarVisible** | 앱 특화 | 캘린더 뷰에 노출할지 여부. ` true ` (기본값)면 ` CalendarRoutine ` 산출 대상이고, ` false ` 면 캘린더 쿼리에서 제외된다. ` Routine.isCalendarVisible ` . |
3447
3548RFC 5545 참고: < https://datatracker.ietf.org/doc/html/rfc5545 >
3649
3750## 4. 참고
3851
3952- RFC 5545: < https://datatracker.ietf.org/doc/html/rfc5545 >
4053- 이전 구현: ` git show 9ffa1a4e ` 및 그 이전 커밋들 (RoutineV2 이전)
41- - 관련 모듈: ` core/model/routine ` , ` domain/routine ` , ` data/routine `
54+ - 관련 모듈
55+ - 모델: ` core/model ` (패키지 ` ...core.model.routine ` )
56+ - 도메인/데이터: ` domain/routine ` , ` data/routine `
57+ - UI: ` feature/routine `
0 commit comments