Flutter로 프라이버시 우선 노트 테이킹 앱을 만들었습니다 — 배운 점

발행: (2026년 1월 10일 오전 01:39 GMT+9)
8 min read
원문: Dev.to

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 Encryptionencrypt 패키지를 사용
  • 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();
}

내가 직면한 도전 과제

  1. Google Play Billing 통합 – 인앱 구독을 설정하는 것이 고통스러웠습니다. 기본 플랜, 오퍼, 태그 등을 이해하는 데 일주일 내내 시간을 보냈습니다. : 코딩을 시작하기 전에 Google 문서를 세 번 읽어보세요.
  2. 클라우드 동기화 충돌 – 동일한 메모를 두 기기에서 오프라인 상태로 편집하면 어느 버전이 최종적으로 적용될까요? 저는 타임스탬프를 이용한 “마지막 쓰기 우선” 전략을 구현했지만, 아직 개선이 필요한 영역입니다.
  3. 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

Back to Blog

관련 글

더 보기 »