diff --git a/README.md b/README.md index a4dc824..91cc7ec 100644 --- a/README.md +++ b/README.md @@ -1,24 +1,155 @@ -# SwiftUI_DevLog - -손쉽게 사용할 수 있는 개발 일지 및 Todo 관리 앱 - -## 사용된 패턴 -- MVVM - -## 최소 iOS 버전 -- iOS 16 - -특징 -- 구글, 깃헙, 애플 로그인 및 계정 연동 -- FirebaseAuth를 이용해 사용자 인증 -- Firestore를 이용해 데이터 저장 및 동기화 -- Firebase Cloud Functions를 이용해 각 소셜 로그인 시 각종 토큰 발급 및 저장 -- 사용자가 원하는 앱 로고 선택 가능 - -기술 스택 -- Swift -- SwiftUI -- Firebase - - FirebaseAuth - - Firestore - - Firebase Cloud Functions +# DevLog + +> 개발 기록과 Todo를 한 곳에서 관리하는 SwiftUI 기반 앱 +> 저장한 링크, 작업 메모, 마감 일정, 개인 활동 흐름을 하나의 앱 안에서 정리하는 구조 + + + + + + + + + + + + + + +
+ + + + + + + +
HomeMarkdownTodo 상세푸시 알림
+ +## 앱 사용해보기 + +iOS 17 이상 환경에서 TestFlight 베타 테스트 가능 + + + + + +## 프로젝트 개요 + +개발 과정에서 해야 할 일, 참고 링크, 진행 기록이 여러 곳에 흩어지기 쉬운 문제 해결 목적 +Todo, 저장 링크, 오늘 할 일, 받은 알림, 누적 활동을 하나의 화면 흐름 안에서 함께 관리할 수 있도록 구성한 앱 + +- Todo 유형별 정리 및 빠른 탐색 +- Markdown, 태그, 마감일, 중요 표시를 포함한 Todo 작성 +- 웹 페이지 저장 및 재열람 +- 오늘 기준 우선 확인 Todo 요약 +- 받은 푸시 알림 확인 및 Todo 연계 +- 분기별 활동 히트맵 및 주간 추이 차트 제공 +- Google, GitHub, Apple 로그인 및 계정 연동 + +## 주요 기능 + +### 로그인 및 계정 관리 + +- Google, GitHub, Apple 로그인 지원 +- 설정 화면에서 계정 연동 및 해제 관리 +- 앱 내부 로그아웃 및 회원 탈퇴 흐름 제공 +- Firebase Authentication 기반 사용자 세션 관리 + +### Home + +- 작업 성격별 Todo 유형 진입점 제공 +- Home에서 Todo 유형 노출 여부 및 순서 편집 +- 최근 수정 Todo 별도 섹션 제공 +- 저장한 웹 페이지 목록 확인 및 즉시 열람 +- URL 입력 시 메타데이터 수집 후 제목과 썸네일 저장 + +### Todo 관리 + +- 8개 Todo 유형별 목록, 정렬, 완료 상태, 중요 표시 필터 지원 +- Todo 목록 내 검색과 페이지네이션 기반 로드 +- 스와이프 액션을 통한 중요 표시, 완료 처리, 삭제 지원 +- Markdown, 태그, 마감일, 중요 표시 기반 Todo 작성 및 수정 +- 상세 화면에서 생성일, 완료일, 마감일, 태그 확인 + +### Today + +- 남은 일, 집중 Todo, 지연 Todo, 7일 내 마감 Todo 요약 카드 제공 +- 집중할 일, 지난 마감, 나중 일정, 일정 미정 등 기한 기준 섹션 분류 +- 보기 범위와 중요 표시 조건 기반 빠른 필터링 +- 항목별 스와이프 액션을 통한 중요 표시 및 완료 처리 + +### 알림 + +- 받은 푸시 알림 목록 확인 +- 정렬, 기간, 읽지 않음 기준 필터링 +- 알림 선택 시 연결된 Todo 상세 확인 및 읽음 처리 +- 페이지네이션 및 실시간 동기화 기반 알림 목록 갱신 +- 사용자 설정 시각 기준으로 다음 날 마감 Todo 리마인드 푸시 발송 + +### 검색 + +- Home 화면 검색 버튼을 통한 통합 검색 진입 +- Todo와 저장한 웹 페이지 통합 검색 +- 디바운스 기반 검색 처리 +- 최근 검색어 저장, 개별 삭제, 전체 삭제 지원 + +### 프로필 및 설정 + +- 상태 메시지 직접 수정 +- 분기 이동 및 직접 선택, 생성/완료 활동 필터 기반 히트맵과 주간 추이 차트 제공 +- 테마 변경, 푸시 알림 시간 설정, 캐시 정리 기능 제공 +- 설정 화면에서 앱 버전, 개인정보 처리방침, 베타 테스트 링크 확인 + +--- + +## 기술 스택 + +| 구분 | 스택 | +| --- | --- | +| Deployment Target | iOS 17+ | +| Architecture | MVVM, MVI-inspired state flow, Clean Architecture, Repository Pattern, DI Container | +| UI | SwiftUI, Charts, MarkdownUI | +| State & Async | Observable, Combine, async/await | +| Backend | FirebaseAuth, FirebaseFirestore, Firebase Cloud Functions, FirebaseMessaging | +| Apple Frameworks | AuthenticationServices, UserNotifications, LinkPresentation, Network | +| Utility | GoogleSignIn, OrderedCollections | +| Tooling | Xcode, Swift Package Manager, SwiftLint, Fastlane | + +## 아키텍처 + +MVVM을 기반으로 하되, ViewModel 상태 관리에는 MVI 형태의 단방향 흐름을 차용한 구조 +화면, 상태, 비즈니스 로직, 외부 의존성 분리를 위한 `MVVM + Clean Architecture` 기반 구성 + + + + + + + + + + +
+ architecture + + Store +
앱 계층Store 프로토콜
+ +## 프로젝트 구조 + +```text +SwiftUI_DevLog/ +├── DevLog/ +│ ├── App/ # 앱 진입점, DI, Assembler, Root 구성 +│ ├── Data/ # DTO, Mapper, Repository 구현 +│ ├── Domain/ # Entity, Protocol, UseCase +│ ├── Infra/ # Firebase 및 시스템 서비스 +│ ├── Presentation/ # ViewModel, 화면용 구조체와 프로토콜 +│ ├── Storage/ # 로컬 저장소 및 사용자 설정 영속성 처리 +│ ├── UI/ # SwiftUI 화면 +│ └── Resource/ # plist, asset, 이미지 리소스 +├── Firebase/ +│ └── functions/ # 인증 보조, 푸시 발송, 정리 작업용 Cloud Functions +└── README.md +``` diff --git a/docs/architecture.d2 b/docs/architecture.d2 new file mode 100644 index 0000000..7dde954 --- /dev/null +++ b/docs/architecture.d2 @@ -0,0 +1,30 @@ +direction: down + +style: { + fill: transparent +} + +app: "App\nDevLog/App" +ui: "UI\nDevLog/UI" +presentation: "Presentation\nDevLog/Presentation" +domain: "Domain\nDevLog/Domain" +data: "Data\nDevLog/Data" +infra: "Infra\nDevLog/Infra" +storage: "Storage\nDevLog/Storage" +external: "External\nFirebase / Google / GitHub / Apple / Web" + +app -> ui: "DI provision, ViewModel composition" +ui -> app: "DI container resolve" + +ui -> presentation: "ViewModel ownership" +presentation -> ui: "state, action flow" + +presentation -> domain: "UseCase execution, Observe publisher" +domain -> data: "Repository protocol" +data -> infra: "Service call" +data -> storage: "Store call" + +infra -> external: "Firebase SDK, social login, metadata fetch" + +app -> domain: "exception, Handler -> UserDataRepository" +presentation -> infra: "exception, NWPathConnectivityProvider" diff --git a/docs/architecture.png b/docs/architecture.png new file mode 100644 index 0000000..da5b66f Binary files /dev/null and b/docs/architecture.png differ diff --git a/docs/home.png b/docs/home.png new file mode 100644 index 0000000..73761e0 Binary files /dev/null and b/docs/home.png differ diff --git a/docs/markdown.png b/docs/markdown.png new file mode 100644 index 0000000..234424b Binary files /dev/null and b/docs/markdown.png differ diff --git a/docs/metadata.png b/docs/metadata.png new file mode 100644 index 0000000..da979ec Binary files /dev/null and b/docs/metadata.png differ diff --git a/docs/notification.png b/docs/notification.png new file mode 100644 index 0000000..e51e76c Binary files /dev/null and b/docs/notification.png differ diff --git a/docs/store-protocol.d2 b/docs/store-protocol.d2 new file mode 100644 index 0000000..bfae50d --- /dev/null +++ b/docs/store-protocol.d2 @@ -0,0 +1,34 @@ +direction: down + +style: { + fill: transparent +} + +view: "View" + +store: { + label: "Store Protocol" + direction: down + style: { + fill: transparent + } + + action: "Action" + send: "send(action)" + reduce: "reduce(with: action)\n-> [SideEffect]" + side_effect: "SideEffect" + run: "run(effect)" + state: "State" +} + +effect_result: "Effect result\nTask / network / timer / callback" + +view -> store.action: "user event" +store.action -> store.send: "input" +store.send -> store.reduce: "dispatch" +store.reduce -> store.state: "update state" +store.reduce -> store.side_effect: "return effects" +store.side_effect -> store.run: "iterate" +store.run -> effect_result: "perform side effect" +effect_result -> store.action: "emit next action" +store.state -> view: "render" diff --git a/docs/store-protocol.png b/docs/store-protocol.png new file mode 100644 index 0000000..3a3d6f4 Binary files /dev/null and b/docs/store-protocol.png differ