SoriShelf Android 진행 정리 - 말로 남긴 기록을 문서로 보관하기까지

2026년 7월 7일 기준 SoriShelf Android 프로젝트의 문서, Pencil 디자인, Flutter 구현, 남은 문제를 정리한 기록

프로젝트 정리

SoriShelf는 한국어 이름으로 말서랍이다.

말서랍은 사용자가 직접 말을 녹음하고, 그 내용을 정리해서, 나중에 다시 꺼내 볼 수 있는 문서로 보관하는 AI 기록 앱을 목표로 한다.

처음 아이디어는 단순한 녹음기에서 출발하지 않았다. 핵심은 녹음 자체보다 녹음이 끝난 뒤 바로 읽을 수 있는 문서가 남는 것이었다. 회의, 강의, 인터뷰, 상담, 아이디어 메모처럼 말로 흘러가 버리기 쉬운 내용을 원본 음성과 함께 보관하고, 필요할 때 회의록이나 정리된 노트 형태로 다시 확인할 수 있게 만드는 방향이다.

2026년 7월 7일 기준으로 프로젝트는 기획 문서, Pencil 화면 설계, Flutter Android 기본 구현까지 한 차례 이어진 상태다. 아직 MVP가 완성됐다고 보기는 어렵지만, “무엇을 만들 것인가”와 “어떤 흐름으로 만들 것인가”는 꽤 선명해졌다.

이번 작업은 Codex를 통해 진행했다. 단순히 코드를 작성하는 것보다, 문서와 디자인, 구현을 계속 맞춰보는 방식에 가까웠다. 처음에는 제품 방향을 문서로 고정하고, 그다음 Pencil에서 화면 흐름을 그린 뒤, Flutter 프로젝트로 실제 녹음과 로컬 저장 흐름을 붙여갔다.

현재 기준선

프로젝트의 기본 정체성은 문서에 고정해두었다.

  • KR 이름: 말서랍
  • EN 이름: SoriShelf
  • 저장소: sorishelf-android
  • 패키지명: com.moa.sorishelf
  • 플랫폼: Android
  • 프레임워크: Flutter
  • 한 줄 설명: 말을 녹음하고, 정리해서, 문서로 보관하는 AI 기록 앱

이 기준선은 docs/decisions/0001-initial-project-identity.md에 의사결정 기록으로 남겨두었다. 앱 이름과 패키지명, 제품 설명이 먼저 정리되어 있으니 Flutter 프로젝트 생성, README 작성, 화면 문구 정리, 나중의 스토어 문구까지 같은 방향을 바라볼 수 있다.

초기에는 전사, 번역, 요약, 문서화까지 넓은 기능을 상상했지만, 현재 MVP는 범위를 줄였다. 첫 번째 버전은 녹음부터 회의록 형태의 문서 생성까지 한 흐름을 끝까지 확인하는 데 집중한다.

현재 방향에서 특히 중요한 결정은 이것이다.

녹음 파일을 외부 서버에 업로드해서 전사하지 않는다.

대신 Android 기기의 음성 인식 기능을 사용해 녹음 중 실시간으로 받아쓴 텍스트를 저장한다. 녹음이 끝난 뒤 저장된 텍스트를 기반으로 회의록을 만든다. 이 결정은 개인정보와 신뢰 설계를 우선한 선택이다. 품질 높은 클라우드 AI를 바로 붙이면 결과는 좋아질 수 있지만, 녹음 앱에서는 사용자가 자신의 음성이 어디로 가는지 이해하고 통제할 수 있어야 한다.

문서로 정리한 내용

이번 프로젝트에서 문서는 단순한 부속물이 아니라 작업의 중심에 가깝다. docs/ 아래에 제품 방향, 화면 흐름, 디자인 기준, 기술 메모, 용어 기준, 로드맵을 나누어 정리했다.

제품 개요

docs/product-brief.md에는 앱의 핵심 콘셉트와 사용자 가치를 정리했다.

말서랍의 차별점은 “녹음”보다 “정리된 문서”에 있다. 기존 녹음기 앱처럼 파일을 저장하는 것에 그치지 않고, 녹음이 끝난 뒤 사용자가 바로 읽을 수 있는 회의록, 강의노트, 인터뷰 기록, 상담 기록 같은 형태로 바꾸는 것이 목표다.

문서에서 정리한 핵심 가치는 다음과 같다.

  • 말로 남긴 생각을 잃어버리지 않게 보관한다.
  • 긴 녹음을 사람이 다시 정리하지 않아도 문서화한다.
  • 회의, 아이디어, 일기, 인터뷰, 학습 기록을 구조화된 노트로 바꾼다.
  • 원본 음성과 텍스트 기록을 함께 관리한다.
  • 나중에 검색 가능한 개인 기록 자산으로 축적한다.

처음 기획에는 번역, 화자 구분, 노션 연동, PDF 내보내기 같은 기능도 포함되어 있었다. 하지만 MVP에서는 번역, 고급 화자 분리, 노션 자동 연동, 캘린더 연동, 팀 협업 기능은 제외하기로 했다. 기능을 넓히기보다 녹음, 저장, 녹음 내용 생성, 회의록 정리, 기록 목록 관리라는 기본 흐름을 먼저 완성하는 쪽이 맞다고 봤다.

로드맵

docs/roadmap.md는 현재 상태를 가장 잘 보여주는 문서다.

Phase 0에서는 방향을 확정했다. 패키지명, 앱 표시명, MVP 문서 형식, 언어 기준, 로그인 없이 로컬 앱으로 시작하는 방향이 정리됐다. MVP 기본 문서 형식은 회의록으로 두고, 번역은 이후 기능으로 미뤘다.

Phase 1에서는 Flutter 프로젝트를 생성하고 Android application id와 앱 표시명을 맞췄다. 아직 기본 앱 아이콘과 스플래시는 임시 상태로 남아 있다.

Phase 2에서는 홈 화면, 기록 목록, 기록 상세 화면, 녹음/전사/회의록 데이터 모델, 로컬 저장 구조를 잡았다. 녹음이 없더라도 앱의 전체 이동 흐름과 저장된 기록 UI를 확인할 수 있는 상태가 됐다.

Phase 3에서는 마이크 권한 요청, 녹음 시작/정지, 녹음 파일 저장, 녹음 시간 표시, 녹음 완료 후 목록 추가까지 구현했다.

Phase 4는 아직 남아 있다. Android 백그라운드 녹음을 위해 Foreground Service를 연동하고, 녹음 중 지속 알림과 알림에서의 정지/일시정지 액션을 구현해야 한다. 녹음 앱에서 이 단계는 중요하다. 사용자가 화면을 꺼도 녹음이 유지되어야 하고, 동시에 Android 정책상 녹음 중임을 명확히 알려야 하기 때문이다.

Phase 5에서는 전사 방향을 바꾸었다. 녹음 파일을 나중에 서버로 올려 처리하는 대신, 녹음 중 Android SpeechRecognizer로 텍스트를 받아두는 방식이다. 전사 서비스 인터페이스, 가짜 전사 결과, 전사 결과 저장/불러오기, Android 음성 인식 브릿지, 녹음 종료 시 텍스트 저장 흐름이 들어갔다. 다만 실제 기기에서 짧은 녹음과 긴 녹음이 얼마나 안정적으로 저장되는지는 더 검증해야 한다.

Phase 6에서는 회의록 문서화의 틀을 만들었다. 현재는 실제 LLM 연결이 아니라 저장된 녹음 내용을 규칙 기반으로 정리하는 구현이 들어가 있다. 제목, 한 줄 요약, 핵심 포인트, 결정사항, 할 일, 질문/이슈 같은 회의록 구조는 잡혔지만, 실제 요약 품질을 어떻게 만들지는 아직 결정이 필요하다.

Phase 7에서는 개인정보와 신뢰 설계를 일부 구현했다. 클라우드 AI 처리 동의, 원본 음성 삭제, 텍스트만 보관, 기록 전체 삭제 흐름이 들어갔다. 다만 개인정보 처리방침, 민감한 기록 숨김, 앱 잠금 같은 부분은 아직 남아 있다.

화면과 라우팅

docs/navigation.md에는 화면 목록과 이동 흐름을 정리했다.

문서상 주요 화면은 다음과 같다.

  • Home / Recordings
  • Recording
  • Recording Saved
  • Processing
  • Recording Detail - Meeting Note
  • Recording Detail - Recording Content
  • Recording Detail - Original Info
  • Settings / Privacy
  • Search
  • Search Results
  • Search Empty
  • Filter

상세 화면은 하나의 기록을 기준으로 회의록, 녹음 내용, 원본 정보 탭으로 나누는 방향이다. 사용자 화면에서는 전사라는 표현을 쓰지 않고, 녹음 내용 또는 음성을 글로 바꾸기를 사용하기로 했다.

이 용어 정리는 작지만 중요하다. 개발자 입장에서는 transcription이라는 단어가 자연스럽지만, 사용자가 보는 화면에서 전사는 딱딱하고 기술적으로 느껴질 수 있다. 말서랍은 생산성 도구이면서 개인 기록장 같은 앱이기 때문에, 사용자에게는 “녹음 내용”이라는 표현이 더 자연스럽다.

UI 가이드

docs/ui-guide.md에는 Pencil 디자인을 Flutter 구현으로 옮길 때의 기준을 적었다.

디자인 방향은 다음 문장으로 정리할 수 있다.

차분한 생산성 앱과 개인 기록장 사이의 느낌.

말서랍은 AI 기능을 과시하는 앱보다, 기록을 안전하게 정리해주는 도구에 가깝다. 그래서 과하게 화려한 AI 앱 느낌, 마케팅 페이지 같은 장식, 너무 많은 컬러와 그림자는 피하기로 했다. 대신 녹음 중, 저장됨, 처리 중, 삭제 같은 상태를 명확하게 보여주는 데 집중한다.

Pencil 기준 색상도 정리해두었다.

  • 기본 배경: #FBFCF9
  • 카드 배경: #FFFFFF
  • 부드러운 안내 배경: #F4F8F2
  • 주요 텍스트: #1E3322
  • 보조 텍스트: #6B7B6B
  • 주요 액션 색상: #2D6B3F
  • 경계선: #DDE5DA
  • 주의 배경: #FBF4EA
  • 주의 텍스트: #6B4E2E

이 팔레트는 녹음 앱의 긴장감을 낮추는 쪽에 가깝다. 사용자가 민감한 음성을 다루는 앱을 열었을 때, 너무 공격적인 색이나 과한 애니메이션보다 조용하고 확실한 상태 표시가 더 중요하다고 봤다.

기술 메모

docs/app-notes.md에는 Android와 Flutter 구현에서 계속 봐야 할 부분을 정리했다.

현재 기술 방향은 다음과 같다.

  • Flutter 기반 Android 앱
  • 녹음 패키지 후보 및 구현은 record 사용
  • 마이크 권한은 permission_handler로 요청
  • 로컬 저장은 앱 문서 디렉터리의 recordings/ 아래 파일과 JSON 인덱스 사용
  • 녹음 인덱스는 recordings.json
  • 전사 결과는 recordings/transcripts/{recordingId}.json
  • 회의록 결과는 recordings/notes/{recordingId}.json
  • 설정은 recordings/settings.json
  • 녹음 중 Android SpeechRecognizer로 텍스트를 받아 저장
  • 원본 음성은 필요하면 삭제하고, 텍스트와 회의록만 보관할 수 있음

이 구조는 아직 간단하지만 MVP에는 충분하다. 데이터베이스를 먼저 붙이지 않고 파일과 JSON으로 시작한 것도 좋은 선택이었다. 앱의 데이터 모델이 계속 바뀌는 초기 단계에서는 저장소를 무겁게 만들기보다, 녹음 파일과 메타데이터의 관계를 빨리 확인하는 것이 더 중요했다.

Pencil로 작업한 내용

Pencil 파일은 designs/sorishelf.pen에 있다. 2026년 7월 7일 기준으로 단순 와이어프레임을 넘어서 꽤 많은 화면이 들어가 있다.

상단에는 핵심 앱 화면들이 Android 모바일 프레임 기준으로 배치되어 있다.

  • SoriShelf Home Screen
  • SoriShelf Recording Screen
  • SoriShelf Recording Saved Screen
  • SoriShelf Processing Screen
  • SoriShelf Meeting Note Screen
  • SoriShelf Recording Content Screen
  • SoriShelf Original Info Screen
  • SoriShelf Settings Privacy Screen

홈 화면은 기록 목록과 녹음 시작을 함께 보여주는 구조다. 앱을 열었을 때 사용자가 바로 녹음을 시작할 수 있어야 하므로, 큰 녹음 액션이 화면의 중심 역할을 한다. 동시에 최근 기록 목록을 보여줘서 이 앱이 단순 버튼 하나짜리 녹음기가 아니라, 기록을 쌓고 다시 꺼내 보는 도구라는 느낌을 준다.

녹음 중 화면은 타이머와 상태 표시가 중심이다. 이 화면에서 중요한 것은 예쁜 파형보다 “지금 실제로 녹음 중인가”, “저장되고 있는가”, “화면을 꺼도 괜찮은가”를 사용자가 바로 이해하는 것이다. 그래서 디자인 문서에서도 녹음 중 상태의 신뢰감을 가장 중요한 감각으로 잡았다.

녹음 저장 완료 화면은 사용자를 다음 단계로 이어준다. 녹음이 끝났다는 사실을 확인시켜주고, 바로 음성을 글로 바꾸기를 실행하거나 나중에 처리할 수 있게 한다. 이 단계는 사용자의 불안을 줄이는 화면이다. 녹음 파일이 저장됐는지, 원본은 보관되는지, 다음 작업이 무엇인지가 명확해야 한다.

처리 중 화면은 음성 파일 저장, 음성을 글로 변환, 핵심 내용 요약, 회의록 생성 같은 단계를 보여준다. 실제 구현에서는 현재 기기 음성 인식 기반으로 방향이 바뀌었기 때문에, 이 화면은 나중에 실제 처리 방식과 다시 맞춰야 한다. 그래도 사용자에게 “지금 무엇을 기다리는 중인지” 알려주는 화면으로 필요하다.

회의록 화면은 MVP의 핵심 결과물이다. 한 줄 요약, 핵심 포인트, 결정사항, 할 일, 질문/이슈가 읽기 쉬운 순서로 배치되어야 한다. 이 화면은 카드만 많이 늘어놓으면 오히려 문서처럼 읽기 어렵기 때문에, 섹션 위계와 본문 가독성이 중요하다.

녹음 내용 화면은 음성을 글로 바꾼 내용을 보여주는 곳이다. 여기서도 전사라는 표현은 피하고, 사용자에게는 녹음 내용으로 보이게 한다. 내부 구현은 Transcript 모델을 쓰더라도 화면 문구는 다르게 가져간다.

원본 정보 화면은 신뢰 설계와 연결된다. 원본 음성의 보관 여부, 처리 방식, 파일 정보, 원본 음성 삭제 같은 액션이 들어간다. 녹음 앱에서는 사용자가 데이터를 지울 수 있다는 사실을 명확히 보여주는 것이 기능만큼 중요하다.

설정/개인정보 화면은 클라우드 AI 처리 동의, 원본 음성 보관, 텍스트만 보관, 전체 삭제, 민감한 기록 숨김 같은 기능의 진입점으로 설계되어 있다. 현재 코드에는 일부 보관/삭제 설정이 들어갔지만, 화면 전체가 완성된 것은 아니다.

Pencil 섹션 구조

Pencil 캔버스에는 핵심 화면 외에도 여러 섹션이 나뉘어 있다.

  • Section 01 Core Screens
  • Section 02 Interaction Wireframes
  • Section 03 User Flow Map
  • Section 04 High Fidelity Screens

그리고 별도 프레임으로 첫 실행 권한/동의 시트, 액션 다이얼로그, 검색/필터 관련 화면, 개인정보와 설정 관련 화면들이 들어가 있다.

특히 SoriShelf First Launch Permission Sheets에는 첫 실행 또는 첫 녹음 시점에 필요한 안내 화면들이 들어가 있다. 마이크 권한, 알림 권한, AI 처리 동의, 원본 음성 보관 안내 같은 화면은 녹음 앱에서 그냥 지나칠 수 없는 부분이다. 사용자가 앱을 신뢰하려면 “왜 이 권한이 필요한지”와 “내 데이터가 어떻게 처리되는지”가 초반에 설명되어야 한다.

SoriShelf Action Dialogs에는 녹음 정지 확인, 처리 실패, 원본 음성 삭제 같은 확인/오류 흐름이 들어간다. 성공 화면만 그리면 앱이 좋아 보이지만, 실제 사용에서는 실패와 삭제가 더 중요할 때가 많다. 특히 원본 음성 삭제는 되돌릴 수 없는 액션이므로 별도의 확인 흐름이 필요하다.

Pencil 작업에서 좋은 점은 화면이 많아지면서 앱의 빠진 부분이 보인다는 것이다. 문서로는 “개인정보와 신뢰 설계”라고 쓰기 쉽지만, 실제 화면으로 그리면 권한 안내, 동의 시트, 삭제 확인, 처리 실패, 빈 상태, 검색 결과 없음 같은 세부 상태가 필요하다는 것이 드러난다.

아직 남은 정리도 있다. 현재 Pencil 레이아웃에는 일부 큰 섹션에서 클리핑 경고가 보인다. 즉, 화면들이 계속 확장되는 과정에서 몇몇 프레임은 높이와 내부 요소 정리가 더 필요하다. 디자인을 Flutter 구현 기준으로 옮기기 전에는 각 화면별로 텍스트가 잘리지 않는지, 버튼이 겹치지 않는지, 상태별 화면이 실제 앱 흐름과 맞는지 다시 점검해야 한다.

지금까지 구현된 부분

현재 Flutter 구현은 완성된 앱이라기보다 MVP의 골격을 확인하는 단계다. 그래도 녹음 앱의 핵심 흐름 중 많은 부분이 실제 코드로 들어가 있다.

Flutter 프로젝트와 앱 구조

Flutter 프로젝트가 생성되어 있고, Android 패키지명은 com.moa.sorishelf로 맞춰져 있다. 앱은 lib/app/sorishelf_app.dart, lib/main.dart, lib/core/theme/app_theme.dart 같은 기본 구조를 갖고 있다.

기능 코드는 lib/features/recording/ 아래로 모았다.

  • data/recording_service.dart
  • data/speech_recognition_service.dart
  • data/audio_playback_service.dart
  • data/transcription_service.dart
  • data/note_generation_service.dart
  • domain/recording_entry.dart
  • domain/transcript.dart
  • domain/structured_note.dart
  • domain/processing_status.dart
  • presentation/home_screen.dart
  • presentation/recording_detail_screen.dart

아직 라우팅이 문서처럼 완전히 분리되어 있지는 않다. 현재는 홈 화면과 상세 화면 중심으로 동작을 검증하는 단계다.

홈 화면과 녹음 흐름

홈 화면에서는 저장된 기록 목록을 불러오고, 녹음 시작/정지 버튼을 제공한다.

녹음을 시작할 때는 마이크 권한을 요청하고, 권한이 있으면 RecordingService가 녹음 파일을 만든다. 파일은 앱 문서 디렉터리 아래 recordings/recording_yyyyMMdd_HHmmss.m4a 형태로 저장된다.

동시에 Android 기기 음성 인식도 시작한다. DeviceSpeechRecognitionService는 Flutter MethodChannelEventChannel을 통해 Android 네이티브의 SpeechRecognizer와 연결된다. 녹음 중 partial/final 결과를 받아서 화면에 보여주고, 녹음을 멈추면 모아둔 텍스트를 Transcript로 저장한다.

이 흐름 덕분에 녹음 파일을 서버에 보내지 않아도, 녹음 중 생성된 텍스트를 상세 화면에서 볼 수 있다.

Android 네이티브 브릿지

MainActivity.kt에는 두 가지 네이티브 브릿지가 들어가 있다.

첫 번째는 원본 음성 재생이다. Android MediaPlayer를 사용해서 저장된 오디오 파일을 재생하고, 정지하고, 위치를 이동하고, 현재 위치와 전체 길이를 Flutter 쪽으로 전달한다.

두 번째는 음성 인식이다. Android SpeechRecognizer를 사용하고, 가능하면 Android S 이상에서 on-device speech recognizer를 우선 사용한다. 실패 유형에 따라 일반 speech recognizer로 fallback하거나, ERROR_NO_MATCH, ERROR_SPEECH_TIMEOUT 같은 재시작 가능한 오류에서는 다시 인식을 시작한다.

이 부분은 말서랍의 현재 방향을 잘 보여준다. 클라우드 전사를 붙이기 전에, 우선 기기에서 가능한 방식으로 녹음 중 텍스트를 남기는 구조를 만든 것이다.

상세 화면

상세 화면에서는 하나의 녹음 기록에 대해 여러 정보를 보여준다.

  • 원본 음성 파일 존재 여부
  • 원본 음성 재생/정지
  • 재생 위치와 전체 길이
  • 저장된 녹음 내용
  • 녹음 내용 생성 버튼
  • 회의록 만들기
  • 저장된 회의록 결과
  • 원본 음성 삭제
  • 텍스트만 보관 설정
  • 기록 전체 삭제

현재 DeviceOnlyTranscriptionService를 사용하는 경우, 상세 화면에서 나중에 녹음 파일을 다시 전사하는 것이 아니라 “기기 음성 인식은 녹음 중에 저장된다”는 안내를 보여준다. 이 흐름은 제품 방향과 맞다. 이미 저장된 음원을 뒤늦게 서버에 올리는 앱이 아니라, 녹음 중 받아쓴 내용을 저장하는 앱으로 방향을 잡았기 때문이다.

회의록 생성은 현재 RuleBasedNoteGenerationService가 맡는다. 녹음 내용을 문장 단위로 나누고, 앞부분을 핵심 포인트로 사용하며, 결정, 하기로, 확정, 해야, 담당, 검토 같은 키워드로 결정사항, 할 일, 질문/이슈 후보를 뽑는다. 아직 진짜 AI 요약은 아니지만, 회의록 데이터 구조와 화면 흐름을 검증하기에는 충분하다.

로컬 저장과 삭제

로컬 저장은 파일과 JSON으로 구성되어 있다.

  • 녹음 파일: recordings/*.m4a
  • 기록 인덱스: recordings/recordings.json
  • 녹음 내용: recordings/transcripts/*.json
  • 회의록: recordings/notes/*.json
  • 설정: recordings/settings.json

사용자는 원본 음성만 삭제할 수 있고, 텍스트만 보관 설정을 켜면 처리 성공 후 원본 음성을 자동 삭제할 수 있다. 또한 기록 전체 삭제 시 원본 음성, 녹음 내용 JSON, 회의록 JSON을 함께 삭제한다.

이 흐름은 개인정보 관점에서 중요하다. 녹음 앱은 단순히 저장 기능만 있으면 부족하다. 사용자가 언제든 원본 음성을 지울 수 있고, 텍스트만 남기는 선택을 할 수 있어야 한다.

테스트와 빌드

테스트는 test/widget_test.dart에 집중되어 있다.

확인하는 내용은 다음과 같다.

  • 한국어 OS 환경에서 말서랍 홈 화면이 보이는지
  • 영어 OS 환경에서 SoriShelf UI가 보이는지
  • 녹음 종료 후 기기 음성 인식 텍스트가 저장되는지
  • 상세 화면에서 원본 음성, 녹음 내용, 회의록 흐름이 보이는지
  • 원본 음성 재생/정지와 위치 이동이 동작하는지
  • 영어 녹음에서 영어 UI와 결과가 보이는지
  • 저장된 녹음 내용과 회의록을 상세 진입 시 불러오는지
  • 텍스트만 보관과 원본 음성 삭제 흐름이 동작하는지

문서 기준으로는 Flutter 정적 분석, 위젯/모델 테스트, Android debug APK 빌드가 통과한 상태로 정리되어 있다. 실제 기기 SM F711N 무선 디버그 설치와 실행도 확인했다. 다만 실제 기기에서 녹음 파일 저장과 녹음 내용 자동 저장을 같은 세션에서 검증하는 작업은 아직 남아 있다.

진행 흐름을 커밋으로 보면

커밋 이력은 프로젝트가 어떤 순서로 자라났는지 잘 보여준다.

처음에는 Initial commit으로 저장소를 만들었다.

그다음 문서 및 펜슬 내용 추가 단계에서 README, 제품 문서, 로드맵, UI 가이드, Pencil 파일이 들어갔다. 이때 프로젝트의 정체성과 화면 방향이 잡혔다.

이후 기본 파일 내용 등록, UI 관련 및 정리 내용 등록 단계에서 Flutter 프로젝트, Android 구조, 홈 화면, 기본 녹음 서비스, 기록 모델, navigation 문서가 들어갔다. 문서가 실제 프로젝트 구조로 이어진 단계다.

그다음 add local recording privacy and AI processing flow 단계에서 로컬 저장, 개인정보 설정, 전사/회의록 모델, 상세 화면, 원본 음성 삭제, 텍스트만 보관, 가짜 회의록 서비스가 붙었다.

마지막으로 Update recording flow 단계에서 Android 네이티브 음성 인식 브릿지, 오디오 재생 서비스, 홈 화면 녹음 흐름, 상세 화면 재생 진행바, 앱 문구, 테스트가 크게 보강됐다.

이 흐름을 보면, 말서랍은 문서에서 시작해서 디자인을 거쳐 실제 녹음 앱으로 내려오는 순서로 진행됐다. 급하게 기능부터 붙인 것이 아니라, 제품의 기준과 사용자의 신뢰를 먼저 생각한 점이 좋았다.

문제 있는 부분

현재 가장 큰 미완성 영역은 백그라운드 녹음이다.

문서에서는 Android Foreground Service를 통해 화면이 꺼지거나 다른 앱을 사용해도 녹음이 유지되어야 한다고 정리했다. 하지만 코드 기준으로는 아직 Foreground Service와 지속 알림, 알림에서의 정지/일시정지 액션이 구현되지 않았다. 녹음 앱으로서 MVP를 말하려면 이 부분은 반드시 확인해야 한다.

두 번째는 긴 녹음에서 Android 음성 인식이 안정적으로 유지되는지다.

현재 구현은 SpeechRecognizer 오류에 따라 재시작하는 로직을 갖고 있지만, Android 기기 음성 인식은 기기 상태, OS 버전, Google 음성 인식 설정, 네트워크/오프라인 모델 상태에 영향을 받을 수 있다. 짧은 녹음에서는 괜찮아 보여도 긴 회의에서는 중간에 끊기거나 일부 문장이 누락될 수 있다.

세 번째는 실제 회의록 품질이다.

현재 회의록 생성은 규칙 기반이다. 키워드가 들어간 문장을 결정사항이나 할 일로 분류하는 방식이라, 구조 검증에는 좋지만 사용자가 기대하는 “AI가 정리해준 회의록” 품질과는 거리가 있다. 이후에는 규칙 기반으로 계속 갈지, 온디바이스 모델을 검토할지, 클라우드 AI를 선택 옵션으로 둘지 결정해야 한다.

네 번째는 Pencil과 Flutter 구현의 차이다.

Pencil에는 Recording Saved, Processing, Settings, Search, Filter, 권한/동의 시트, 여러 다이얼로그가 있지만, Flutter 구현은 아직 홈과 상세 중심이다. 디자인이 더 앞서간 상태다. 이 자체는 나쁘지 않지만, 다음 단계에서는 실제 구현할 화면과 나중 아이디어를 분리해야 한다. 그렇지 않으면 MVP 범위가 다시 커질 수 있다.

다섯 번째는 개인정보 문서와 정책이다.

코드에는 삭제와 보관 설정이 일부 들어갔지만, 사용자가 이해할 수 있는 개인정보 처리방침, 클라우드 처리 동의 문구, 원본 음성 보관 정책은 더 정리해야 한다. 특히 녹음 앱은 민감한 데이터를 다루므로 “나중에 쓰자”로 미루기 어렵다.

여섯 번째는 현재 sorishelf-android 작업트리에 아직 커밋되지 않은 수정 파일들이 있다는 점이다. 2026년 7월 7일 기준 정리에서는 커밋 이력과 문서 기준을 중심으로 보되, 실제 작업 중인 변경사항은 별도로 검증하고 정리해야 한다.

앞으로 고려해야 할 부분

가장 먼저 해야 할 일은 실제 기기에서 핵심 녹음 흐름을 끝까지 확인하는 것이다.

앱에서 녹음을 시작하고, 말을 하고, 녹음을 멈춘 뒤, 원본 음성 파일이 저장되었는지 확인한다. 그다음 같은 세션에서 Android 음성 인식으로 받아쓴 텍스트가 Transcript로 저장되는지 확인해야 한다. 이 검증이 끝나야 현재 방향이 실제 기기에서도 유효하다고 말할 수 있다.

그다음은 백그라운드 녹음이다. Android Foreground Service를 붙이고, 녹음 중 지속 알림을 보여주고, 알림에서 정지/일시정지 액션을 제공해야 한다. 이때 Android 권한과 정책 문구도 같이 점검해야 한다.

회의록 생성 방식도 결정해야 한다.

선택지는 크게 세 가지다.

  1. 규칙 기반 템플릿을 먼저 고도화한다.
  2. 온디바이스 모델 후보를 검토한다.
  3. 클라우드 AI를 사용자 동의 기반 옵션으로 둔다.

개인정보를 우선하면 1번 또는 2번이 자연스럽다. 품질을 우선하면 3번이 필요하다. 다만 말서랍의 현재 제품 방향은 “외부 업로드가 기본 흐름이 아니다”이므로, 클라우드 AI를 붙이더라도 기본값이 아니라 선택 옵션으로 다루는 것이 맞아 보인다.

Pencil 디자인은 구현 기준으로 한 번 정리해야 한다.

핵심 화면, 상태 화면, 나중 아이디어 화면을 분리하고, Flutter에 바로 옮길 화면부터 다시 우선순위를 잡아야 한다. 특히 권한 요청, 녹음 중, 녹음 저장 완료, 녹음 내용 없음, 처리 실패, 원본 음성 삭제 확인은 MVP에서 빠지기 어렵다.

용어도 계속 유지해야 한다.

내부 코드에서는 Transcript, TranscriptionService를 써도 괜찮다. 하지만 사용자 화면에서는 전사 대신 녹음 내용, 음성을 글로 바꾸기, 녹음 내용 보기를 써야 한다. 이런 작은 용어 차이가 앱의 인상을 바꾼다.

Codex로 작업하면서 느낀 점

이번 프로젝트에서 Codex는 코드를 한 번에 만들어주는 도구라기보다, 생각을 단계별로 고정하는 데 더 크게 쓰였다.

아이디어 단계에서는 기능이 쉽게 넓어진다. 녹음 앱을 생각하다 보면 전사, 요약, 번역, 화자 분리, 노션 연동, 캘린더 등록, PDF 내보내기, 자연어 검색까지 금방 이어진다. 하지만 실제 앱을 만들려면 지금 해야 할 것과 나중에 해야 할 것을 나눠야 한다.

Codex와 작업하면서 가장 도움이 된 부분은 그 구분이었다.

먼저 제품 문서로 앱의 정체성을 고정했다. 그다음 Pencil에서 사용자가 지나갈 화면을 만들었다. 그리고 Flutter 코드에서는 녹음, 저장, 녹음 내용, 회의록, 삭제라는 핵심 흐름부터 붙였다.

물론 아직 빈틈은 많다. 백그라운드 녹음은 남아 있고, 긴 녹음 안정성도 검증해야 하며, 회의록 품질도 아직 초기 수준이다. 하지만 프로젝트가 흩어지지 않고 한 방향으로 움직이고 있다는 점은 분명하다.

말서랍은 아직 완성된 앱이 아니다. 그래도 지금까지의 진행을 보면, 단순 녹음기가 아니라 사용자의 말을 안전하게 보관하고 다시 읽을 수 있는 문서로 바꾸는 앱으로 갈 수 있는 뼈대는 잡혔다.

“말을 저장하는 앱이 아니라, 나중에 다시 읽을 수 있는 기록을 만드는 앱.”

지금 기준으로 말서랍의 방향은 이 문장에 가장 가깝다.


2026.07.07 정리

  1. 제품 정체성: 말서랍/SoriShelf, Android Flutter 앱, com.moa.sorishelf
  2. 문서: 제품 개요, 로드맵, 화면 흐름, UI 가이드, 기술 메모, 용어 기준 정리
  3. Pencil: 홈, 녹음 중, 저장 완료, 처리 중, 회의록, 녹음 내용, 원본 정보, 설정/개인정보, 권한/동의 시트, 다이얼로그, 검색/필터 화면 설계
  4. 구현: 로컬 녹음, 파일/JSON 저장, Android 음성 인식 브릿지, 원본 음성 재생, 녹음 내용 저장, 규칙 기반 회의록 생성, 삭제/보관 설정
  5. 남은 문제: Foreground Service, 긴 녹음 안정성, 실제 회의록 품질, 개인정보 정책, Pencil 화면과 Flutter 구현의 범위 정리