Skip to content

Commit 54164ae

Browse files
Merge pull request #8 from taetae98coding/develop
1.8.0
2 parents f36bec7 + ff6b6de commit 54164ae

89 files changed

Lines changed: 2633 additions & 750 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

.claude/docs/prd/feature-routine.md

Lines changed: 0 additions & 418 deletions
This file was deleted.

.claude/docs/specs/memo.md

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66

77
Memo는 **단발성 일정/노트**를 표현하는 도메인이다. 반복되는 일정은 `Routine`이 담당한다.
88

9-
- 각 Memo는 제목/설명/시간 범위/색상으로 구성된다.
9+
- 각 Memo는 제목/설명/시간 범위/색상으로 구성된다. 시간 범위(`localDateTimeRange`)는 **nullable**이며, 시간 정보 없는 메모를 허용한다.
1010
- 단일 `primaryTag`로 분류할 수 있다 (선택적). 다중 태그 연결은 범위 밖이다.
1111
- 완료 상태(`isFinished`)와 논리 삭제(`isDeleted`)를 독립적으로 추적한다.
1212

@@ -24,6 +24,8 @@ Memo는 물리적으로 삭제하지 않고 `isDeleted` 플래그로만 논리
2424

2525
전체 `Memo`가 아닌 경량 `CalendarMemo`를 조회 모델로 사용한다. 캘린더 렌더링 성능 확보가 목적이며, 상세 정보가 필요한 시점에만 전체 Memo를 로드한다.
2626

27+
`CalendarMemo``localDateTimeRange`**non-null**이다. 시간 범위가 없는 Memo는 캘린더 뷰 대상에서 제외된다 (`MemoDetail.localDateTimeRange`는 nullable인 것과 비대칭).
28+
2729
## 3. 핵심 개념
2830

2931
| 용어 | 구분 | 의미 |
@@ -35,4 +37,8 @@ Memo는 물리적으로 삭제하지 않고 `isDeleted` 플래그로만 논리
3537

3638
## 4. 참고
3739

38-
- 관련 모듈: `core/model/memo`, `domain/memo`, `data/memo`, `feature/memo`
40+
- 관련 모듈
41+
- 모델: `core/model` (패키지 `...core.model.memo`)
42+
- 도메인/데이터: `domain/memo`, `data/memo`
43+
- UI: `feature/memo`, `presenter/memo`
44+
- 클라이언트(서버 연동): `client/feature/memo`, `client/presenter/memo`

.claude/docs/specs/routine.md

Lines changed: 23 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -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

3548
RFC 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`

.claude/docs/specs/tag.md

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,4 +28,7 @@ Tag는 `isFinished` 상태를 가지며 **재시작(restart)** 을 통해 완료
2828

2929
## 4. 참고
3030

31-
- 관련 모듈: `core/model/tag`, `domain/tag`, `data/tag`, `feature/tag`
31+
- 관련 모듈
32+
- 모델: `core/model` (패키지 `...core.model.tag`)
33+
- 도메인/데이터: `domain/tag`, `data/tag`
34+
- UI: `feature/tag`, `presenter/tag`

Diary/Diary.xcodeproj/project.pbxproj

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -315,7 +315,7 @@
315315
"$(inherited)",
316316
"@executable_path/Frameworks",
317317
);
318-
MARKETING_VERSION = 1.7.0;
318+
MARKETING_VERSION = 1.8.0;
319319
OTHER_LDFLAGS = "";
320320
PRODUCT_BUNDLE_IDENTIFIER = io.github.taetae98coding.diary.dev;
321321
PRODUCT_NAME = "$(TARGET_NAME)";
@@ -413,7 +413,7 @@
413413
"$(inherited)",
414414
"@executable_path/Frameworks",
415415
);
416-
MARKETING_VERSION = 1.7.0;
416+
MARKETING_VERSION = 1.8.0;
417417
OTHER_LDFLAGS = "";
418418
PRODUCT_BUNDLE_IDENTIFIER = io.github.taetae98coding.diary;
419419
PRODUCT_NAME = "$(TARGET_NAME)";
@@ -518,7 +518,7 @@
518518
"$(inherited)",
519519
"@executable_path/Frameworks",
520520
);
521-
MARKETING_VERSION = 1.7.0;
521+
MARKETING_VERSION = 1.8.0;
522522
OTHER_LDFLAGS = "";
523523
PRODUCT_BUNDLE_IDENTIFIER = io.github.taetae98coding.diary;
524524
PRODUCT_NAME = "$(TARGET_NAME)";

Diary/Diary/Info.plist

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@
22
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
33
<plist version="1.0">
44
<dict>
5+
<key>NSLocationWhenInUseUsageDescription</key>
6+
<string>날씨 정보를 가져오기 위해 현재 위치를 사용합니다.</string>
57
<key>NSAppTransportSecurity</key>
68
<dict>
79
<key>NSAllowsArbitraryLoads</key>

README.md

Lines changed: 4 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -2,12 +2,6 @@
22

33
Kotlin Multiplatform 기반의 다이어리 앱입니다.
44

5-
> Vibe coding으로 만들어가는 중입니다.
6-
7-
<p align="center">
8-
<img src="docs/vibe-chart.svg" alt="코딩 10% : 바이브 코딩 90%" width="200">
9-
</p>
10-
115
<p align="center">
126
<a href="https://taetae98coding.github.io/Diary/">
137
<img src="https://img.shields.io/badge/GitHub%20Pages-Visit%20Site-6366f1?style=for-the-badge&logo=github" alt="GitHub Pages">
@@ -22,11 +16,13 @@ Kotlin Multiplatform 기반의 다이어리 앱입니다.
2216

2317
## Features
2418

25-
- 메모 작성
19+
- 메모 작성 / 복사
2620
- 캘린더
21+
- 루틴
2722
- Google 로그인
2823
- Supabase 동기화
29-
- 날씨
24+
- 오프라인 모드
25+
- 날씨 (현재 위치 기반)
3026
- 태그
3127
- 공휴일
3228
- 황금연휴 찾기

app/android/dependencies/realReleaseRuntimeClasspath.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -193,6 +193,7 @@ com.google.android.gms:play-services-base:18.5.0
193193
com.google.android.gms:play-services-basement:18.9.0
194194
com.google.android.gms:play-services-fido:21.0.0
195195
com.google.android.gms:play-services-identity-credentials:16.0.0-alpha08
196+
com.google.android.gms:play-services-location:21.3.0
196197
com.google.android.gms:play-services-measurement-api:23.2.0
197198
com.google.android.gms:play-services-measurement-base:23.2.0
198199
com.google.android.gms:play-services-measurement-impl:23.2.0

app/android/src/main/AndroidManifest.xml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
xmlns:tools="http://schemas.android.com/tools">
44

55
<uses-permission android:name="android.permission.INTERNET" />
6+
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
67

78
<application
89
android:dataExtractionRules="@xml/data_extraction_rules"

app/shared/build.gradle.kts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ kotlin {
2222
implementation(projects.core.holidayDatabase.impl)
2323
implementation(projects.core.holidayNetwork.impl)
2424
implementation(projects.core.ipNetwork.impl)
25+
implementation(projects.core.location.impl)
2526
implementation(projects.core.navigation)
2627
implementation(projects.core.network.impl)
2728
implementation(projects.core.weatherNetwork.impl)

0 commit comments

Comments
 (0)