Flutter로 프라이버시 우선 노트 테이킹 앱을 만들었습니다 — 배운 점
Source: Dev.to
번역할 텍스트를 제공해 주시면, 요청하신 대로 한국어로 번역해 드리겠습니다. (코드 블록, URL 및 마크다운 형식은 그대로 유지됩니다.)
🔗 링크
- Google Play Store –
- GitHub (Open Source) –
Why Another Note‑Taking App?
I know what you’re thinking — the world doesn’t need another notes app. But here’s the thing: most note apps either sacrifice privacy for features or sacrifice features for privacy. I wanted both.
The goals were simple
- End‑to‑end encryption that actually works
- Beautiful, modern UI (not just functional)
- Multiple note types beyond just text
- Cloud sync without compromising privacy
- A sustainable freemium model
기술 스택
핵심 프레임워크
- Flutter 3.6+ – 크로스‑플랫폼의 장점
- Dart – 현대적이며 타입‑안전한 언어
- Material 3 – 최신 Material Design 가이드라인
로컬 데이터베이스
- Drift 2.24 – 반응형 쿼리를 지원하는 타입‑안전 SQLite (실시간 업데이트에 혁신적인 변화)
보안
- AES‑256 Encryption –
encrypt패키지를 사용 - Flutter Secure Storage – 안전한 키 관리
- Local Auth – 생체 인증 (지문/Face ID)
상태 관리 및 아키텍처
- Riverpod 3.0 – 현대적인 반응형 상태 관리
- Go Router – 선언형 네비게이션
- GetIt – 의존성 주입
클라우드 및 백엔드
- Firebase Authentication – Google 로그인
- Custom FastAPI Backend – 클라우드 동기화 및 사용량 추적
제가 가장 자랑스러워하는 기능들
1. 다양한 노트 유형
단순 텍스트만이 아닙니다. Pinpoint는 다음을 지원합니다:
- 리치 텍스트 노트 (서식 포함)
- 오디오 녹음 (재생 컨트롤 포함)
- 할 일 목록 (실시간 자동 저장)
- 리마인더 (시간대 인식 알림)
2. 글래스모피즘 UI
이 부분에 너무 많은 시간을 투자했지만, 앱 전반에 걸친 서리 유리 효과가 딱 맞는 느낌입니다. 다섯 가지 강조 색상 테마(민트, 아이리스, 로즈, 앰버, 오션)와 부드러운 애니메이션이 결합돼 사용감이 정말 쾌적합니다.
// Example: Glassmorphism container
Container(
decoration: BoxDecoration(
color: Colors.white.withOpacity(0.1),
borderRadius: BorderRadius.circular(24),
border: Border.all(color: Colors.white.withOpacity(0.2)),
),
child: BackdropFilter(
filter: ImageFilter.blur(sigmaX: 10, sigmaY: 10),
child: /* content */,
),
);
3. 실제 종단 간 암호화
노트는 기기 내에서 암호화되어 휴대폰을 떠나기 전에 보호됩니다. 암호화 키는 마스터 비밀번호에서 파생되어 안전하게 저장됩니다 — 저는 여러분의 노트를 절대 볼 수 없습니다.
4. OCR 및 음성 전사
Google ML Kit을 사용하면 이미지에서 텍스트를 추출할 수 있습니다. 음성‑텍스트 변환을 통해 타이핑이 불편할 때 빠르게 노트를 받아쓸 수 있습니다.
5. 프리미엄 모델
공정한 사용량 기반 모델:
| 기능 | 무료 | 프리미엄 |
|---|---|---|
| 동기화된 노트 | 50 | 무제한 |
| OCR 스캔 | 20 /월 | 무제한 |
| 내보내기 | 10 /월 | 무제한 |
| 음성 녹음 | 2 분 | 무제한 |
| 폴더 | 5 | 무제한 |
사용량은 로컬과 백엔드 모두에서 추적되어 제한을 우회하는 것을 방지합니다.
Architecture Decisions
Clean Architecture with Service Layer
A service‑based architecture keeps business logic separate from UI:
lib/
├── screens/ # UI screens
├── components/ # Reusable UI components
├── services/ # Business logic layer
├── database/ # Drift database
├── entities/ # Database tables
├── design_system/ # Colors, typography, theme
└── navigation/ # Go Router config
Database Schema (Drift)
The schema supports many‑to‑many folder relationships:
# Simplified schema
tables:
- notes:
columns: [id, title, content, type, encryption, timestamps]
- note_folders:
columns: [id, title]
- note_folder_relations:
columns: [note_id, folder_id]
- note_todo_items:
columns: [id, note_id, title, is_done]
- note_attachments:
columns: [id, note_id, file_path, type]
Stream‑Based Reactivity
Drift’s watch queries make real‑time updates trivial:
Stream<List<Note>> watchAllNotes() {
return (select(notes)
..orderBy([(t) => OrderingTerm.desc(t.updatedAt)]))
.watch();
}
내가 직면한 도전 과제
- Google Play Billing 통합 – 인앱 구독을 설정하는 것이 고통스러웠습니다. 기본 플랜, 오퍼, 태그 등을 이해하는 데 일주일 내내 시간을 보냈습니다. 팁: 코딩을 시작하기 전에 Google 문서를 세 번 읽어보세요.
- 클라우드 동기화 충돌 – 동일한 메모를 두 기기에서 오프라인 상태로 편집하면 어느 버전이 최종적으로 적용될까요? 저는 타임스탬프를 이용한 “마지막 쓰기 우선” 전략을 구현했지만, 아직 개선이 필요한 영역입니다.
- Todo List 자동 저장 – 사용자의 커서 위치를 잃지 않거나 레이스 컨디션을 만들지 않으면서 todo 항목을 자동 저장하는 것이 예상보다 까다로웠습니다. 결국 임시 ID와 디바운싱을 사용해 저장되지 않은 항목을 처리했습니다.
다음은 무엇인가?
- Collaboration – 다른 사람과 노트 공유
- Tags System – 폴더를 넘어서는 기능
- Markdown Editor – 전체 마크다운 지원
- iOS Release – 앱 스토어 배포
- Web Clipper – 브라우저에서 직접 콘텐츠 저장
직접 사용해 보기!
프라이버시를 존중하면서도 기능을 포기하지 않는 노트‑테이킹 앱을 찾고 있다면 Pinpoint를 사용해 보세요:
Pinpoint
앱은 오픈 소스이므로 코드를 살펴보거나, 이슈를 열거나, 기여해도 됩니다. 여러분의 피드백을 듣고 싶어요!
Wrapping Up
Pinpoint을 만들면서 Flutter, 암호화, 클라우드 아키텍처, 그리고 실제 제품을 출시하는 데 필요한 것들에 대해 많이 배웠습니다. 직접 앱을 만들고 싶다면 제 조언은 간단합니다: 그냥 시작하세요. 배움은 실천 속에서 이루어집니다.
읽어주셔서 감사합니다! 구현에 대한 질문이 있거나 특정 부분을 더 깊게 다루었으면 하는 경우 댓글을 남겨 주세요.
Tags: #flutter #dart #mobile #opensource #privacy