링크를 체계적으로 관리하고 마감일을 놓치지 않도록 도와주는 앱
Clippy는 링크를 카테고리별로 체계적으로 관리하고, 마감일이 있는 링크에 대해 알림을 제공하는 앱입니다. 웹 링크의 메타데이터를 자동으로 추출하여 썸네일과 제목을 제공하며, 즐겨찾기 기능과 검색 기능을 통해 효율적인 링크 관리를 지원합니다.
- 링크를 카테고리별로 분류하여 체계적으로 관리
- 커스텀 카테고리 생성 및 편집
- 카테고리별 색상 및 아이콘 설정
- 기본 "일반" 카테고리 제공
- URL 입력 시 자동으로 메타데이터 추출 (제목, 썸네일, 설명)
- 링크별 메모 추가 기능
- 마감일 설정 및 관리
- 읽음/안읽음 상태 표시
- 마감일 하루 전 자동 알림
- 로컬 알림 스케줄링 시스템
- 알림 권한 요청 및 관리
- 마감 임박 링크 하이라이트
- 제목, URL, 설명 기반 실시간 검색
- 즐겨찾기 링크만 별도 관리
- 최근 추가순, 제목순, 마감일순 정렬
-
실시간 요약 정보
- 저장된 링크 총 개수
- 마감 임박 링크 개수 (3일 이내)
- 최근 추가된 링크 목록
-
캘린더 뷰
- 날짜별 링크 저장 현황 시각화
- 마감일이 있는 링크 캘린더 표시
- 월간 링크 저장 패턴 분석
-
주간 활동 분석
- 최근 7일간 링크 저장 추이 막대 그래프
- 일별 저장 개수 비교
-
카테고리 분포 차트
- 도넛 차트로 카테고리별 링크 비율 시각화
- 가장 많이 사용하는 카테고리 인사이트 제공
- 앱 최초 실행 시 사용법 안내
- 주요 기능별 가이드 제공
- Safari 및 다른 앱에서 직접 링크 저장
- 공유 시 카테고리, 메모, 마감일 즉시 설정 가능
- 홈 화면에서 바로 링크 확인
- 4가지 위젯 타입: 마감 임박, 최근 추가, 즐겨찾기, 읽지 않음
- Small/Medium 크기 지원
- Swift 5.0+
- UIKit
- SnapKit
- RxSwift/RxCocoa
- Realm
- Firebase
- WidgetKit
- Share Extension
- LinkPresentation
- UserNotifications
- App Groups
- XCTest
- GitHub Actions
- Fastlane
- MVVM + Input/Output
- Repository Pattern
Clippy/
├── AppDelegate.swift # 앱 진입점 및 Firebase 설정
├── SceneDelegate.swift # Scene 생명주기 관리
├── Base/
│ └── BaseViewController.swift # 기본 뷰컨트롤러
├── DataBase/
│ ├── RealmTable.swift # Realm 데이터 모델
│ └── CategoryRepository.swift # 데이터 접근 계층
├── Manager/
│ ├── LinkManager.swift # 링크 관리 로직
│ ├── NotificationManager.swift # 알림 관리
│ └── TooltipManager.swift # 사용자 가이드
├── Model/
│ └── LinkMetadata.swift # 링크 메타데이터 모델
├── View/
│ ├── Category/ # 카테고리 관련 화면
│ ├── EditCategory/ # 카테고리 편집
│ ├── EditLink/ # 링크 편집
│ ├── Like/ # 즐겨찾기 화면
│ ├── LinkDetail/ # 링크 상세 화면
│ ├── LinkList/ # 링크 목록 화면
│ ├── Search/ # 검색 화면
│ ├── Statistics/ # 통계 및 차트 화면
│ └── Tooltip/ # 사용자 가이드
├── Extension/ # 확장 기능
├── Resource/ # 리소스 및 유틸리티
└── Assets.xcassets/ # 앱 아이콘 및 이미지
ClippyShare/ # Share Extension
└── ShareViewController.swift # 공유 확장 UI
ClippyWidget/ # Widget Extension
├── ClippyWidget.swift # 위젯 진입점
├── WidgetConfiguration.swift # 위젯 설정
├── ExpiredLinksProvider.swift # 위젯 데이터 제공
└── ExpiredLinksWidgetView.swift # 위젯 UI
- 문제: URL만으로 제목, 썸네일, 설명을 자동으로 추출해야 함
- 해결: Apple의 LinkPresentation 프레임워크를 활용한 메타데이터 자동 수집
- 결과: 사용자 입력 없이 자동으로 링크 정보 완성
- 문제: 마감일 하루 전 정확한 알림 발송 및 백그라운드 처리
- 해결: 로컬 알림 스케줄링 및 Firebase Messaging 연동 (향후 구현)
- 결과: 앱이 종료되어도 안정적인 알림 제공
- 문제: 다양한 데이터 변화에 따른 실시간 UI 업데이트
- 해결: RxSwift를 활용한 데이터 바인딩 및 상태 관리
- 결과: 사용자 액션에 즉각적인 반응하는 부드러운 UX
- 문제: 대량의 링크 데이터 효율적 저장 및 검색
- 해결: Realm을 활용한 관계형 데이터 모델링 및 인덱싱
- 결과: 빠른 검색 성능과 안정적인 데이터 관리
- 문제: Safari, Chrome 등 외부 앱에서 Clippy로 링크를 빠르게 저장하는 UX 구현
- 해결: Share Extension 타겟 생성 및 App Groups를 통한 메인 앱과 데이터 공유
- 결과: 별도 앱 실행 없이 공유 버튼으로 원터치 링크 저장 가능
- 문제: 메인 앱에서 링크를 추가/삭제할 때 위젯에 즉시 반영
- 해결: App Groups 공유 Realm 컨테이너 및 WidgetCenter 자동 새로고침
- 결과: 앱에서 변경 즉시 홈 화면 위젯 업데이트
- 문제: 복잡한 링크 저장 패턴을 사용자가 쉽게 이해할 수 있도록 시각화
- 해결: 커스텀 캘린더 뷰, 막대 그래프, 도넛 차트 구현
- 결과: 직관적인 통계 정보 제공으로 사용 패턴 분석 가능
- 개발 기간:
- 핵심 개발: 2025.09.24 ~ 2025.10.03 (10일)
- 유지보수: 2025.10.04 ~ 현재 (지속적 개선)
- 개발 인원: 1명 (개인 프로젝트)
- 역할: 기획, 디자인, 개발, 배포 전담
- 최소 지원 버전: iOS 16.0+
- 개발 환경: Xcode 16.4+, Swift 5.0+
- MVVM 패턴: View와 비즈니스 로직 분리
- Repository Pattern: 데이터 접근 계층 추상화
- Observer Pattern: RxSwift를 통한 반응형 프로그래밍
- UIKit: 네이티브 iOS UI 구현
- Auto Layout: SnapKit을 활용한 코드 기반 레이아웃
- UserNotifications: 로컬 알림 시스템 구현
- LinkPresentation: Apple 프레임워크를 활용한 링크 메타데이터 자동 추출
- Share Extension: 외부 앱에서 링크 공유 기능 구현
- WidgetKit: 홈 화면 위젯 개발 (4가지 타입)
- App Groups: 메인 앱과 Extension 간 데이터 공유
- Realm: 로컬 데이터베이스 설계 및 최적화
- 데이터 모델링: 관계형 데이터베이스 설계
- Thread-safe 캐싱: Concurrent Queue를 활용한 이미지 캐시 구현
- 커스텀 캘린더: 날짜별 링크 저장 현황 시각화
- 차트 구현: 막대 그래프, 도넛 차트
- 인사이트 분석: 사용 패턴 분석 및 통계 제공
- Firebase Analytics: 사용자 행동 분석 및 앱 사용 패턴 파악
- Firebase Crashlytics: 앱 크래시 모니터링 및 안정성 개선
- Firebase Messaging: 푸시 알림 서비스 (향후 구현 예정)
- XCTest: iOS 네이티브 테스트 프레임워크를 활용한 단위 테스트
- In-Memory Realm: 테스트 격리를 위한 인메모리 데이터베이스 활용
- DI/DIP: 테스트 가능한 코드 설계
- GitHub Actions: 코드 푸시 시 자동 테스트 실행 (CI)
- Fastlane: iOS 빌드 및 테스트 자동화
프로젝트에 대한 문의사항이 있으시면 언제든 남겨주세요.
Clippy - 링크 관리의 새로운 경험을 제공합니다! 📎✨







