얍!

개발 관련 기록하고 있습니다.

개발 기록/프로젝트

[스물네칸] 스물네칸 안드로이드 앱 (Seumulnekan Android App)

dev.jelee 2026. 10. 3. 20:51

📌 프로젝트 요약

  • 프로젝트(제품) 명: 스물네칸
  • 개발 시작일: 2026-08-03
  • 사용 기술: Flutter, Dart, Kotlin, SQLite, Google Drive API
  • 현재 진행 상태:
    • 비공개 테스트 완료 및 프로덕션 액세스 승인 후, UX 개선과 공개 전환 준비
  • 소개 웹사이트: https://jelee.io/seumulnekan

📢 프로젝트 소개 

1. 어떤 앱인가?

  • 스물네칸은 하루 동안 할 일을 짧게 남기고, 00시부터 24시까지의 타임라인을 보며 하루를 돌아보는 로컬 우선 기록 앱입니다.
  • 완성된 일기를 작성하는 공간보다는 나중에 하루를 떠올릴 수 있도록 기억의 단서를 모으는 디지털 메모지에 가깝습니다.
  • 기록은 최대 50자로 작성하며 시작 시각과 선택적으로 종료 시각을 함께 남길 수 있습니다.

 

2. 누구를 위한 앱인가?

  • 스물네칸은 하루를 돌아보거나 일기를 쓰려 할 때, "오늘 뭐 했더라?" 하며 기억을 더듬는 사람을 위해 만들었습니다. 긴 글을 바로 작성하기는 부담스럽지만, 하루의 순간을 짧게 남겨 두고 싶은 사람을 생각했습니다.
  • 활동한 시각과 짧은 메모를 남기고, 나중에 타임라인으로 확인하며 하루를 떠올리는 데 도움을 주고자 했습니다. 반복되는 일상 속에서도 기록을 통해 자신이 무엇을 했는지 발견하고, 사소한 활동에서도 작은 성취감을 느낄 수 있기를 바랐습니다.

 

3. 시작한 이유와 개발 방식

하루를 돌아보거나 일기를 쓰려 할 때, 무엇을 어느 시간대에 했는지 다시 떠올려야 하는 문제에서 출발하였습니다.
긴 글을 바로 쓰기보다는 활동을 짧게 기록하고, 이후 시간순으로 확인할 수 있는 도구가 있으면 좋겠다는 생각에 기획을 하게 되었습니다.

제품의 아이디어와 기획은 직접 하였으며, AI를 활용하여 아이디어를 빠르게 구체화하고 검증, 그리고 MVP로 연결하여 실제 화면과 동작을 개발하였습니다.

동시에 UX 엔지니어로 커리어를 쌓기 위해, 사용자의 행동을 중심으로 개선해 나가고 있습니다.

 

 

4. 초기에 정의한 문제와 해결 방향

이 프로젝트를 진행하면서 다음과 같은 문제를 어떻게 해결할 것인지를 고민하게 되었으며, 이를 해결하기 위해 다음과 같이 접근하였습니다.

 

하루가 지나면 시간대별 활동을 기억하기 어렵다.

→ 활동을 시각과 함께 남기고 24시간 타임라인에서 확인한다.

 

일기를 쓰기 전에 하루를 다시 떠올리는 부담이 있다.

→ 짧은 기록을 회상의 단어로 제공한다.

 

긴 글을 자주 작성하기는 부담스럽다.

→ 현재 시각 기본값과 최대 50자의 짧은 입력을 제공한다.

 

일반 메모 목록에서는 하루의 흐름을 파악하기 어렵다.

→ 날짜별로 시간을 묶어 활동 순서를 보여준다.

 

매번 앱의 메인 화면을 거쳐 기록하기 번거롭다.

→ Android 위젯과 빠른 실행에서 입력 팝업으로 진입한다.

 

개인 기록을 위해 반드시 가입하거나 서버에 저장하고 싶지 않을 수 있다.

→ 로그인 없는 로컬 기록과 선택적 Google Drive 동기화를 제공한다.


📋 주요 기능

기능명 설명
하루 타임라임 00~24시 시간 축에서 선택 날짜의 기록을 시간순으로 확인한다.
짧은 기록 작성·수정 ·삭제 최대 50자의 내용, 시작 시각, 선택적 종료 시각을 저장한다.
날짜 탐색 주간 스트립, 달력, 오늘로 이동을 통해 기록을 찾는다.
로컬 저장 핵심 기록 기능을 로그인·네트워크 연결 없이 사용한다.
빠른 기록 Android 홈 화면 위젯과 앱 빠른 실행을 통해 네이티브 입력 팝업을 연다.
음성 받아쓰기 지원 기기에서 기기 내 음성 인식으로 텍스트를 입력하고, 사용자가 확인한 뒤 저장한다.
언어·외관 설정 한국어·영어 UI(추후 다양하게 지원 예정), 독립적인 음성 입력 언어 설정, 색상 테마와 시스템 밝기 모드 대응.
하루 공유 선택 날짜의 기록을 텍스트 또는 PNG로 만들어 공유 및 저장한다.
기록 이동 전체·월별·하루 범위의 기록을 .24kan 파일로 보내고 가져온다.
선택적 동기화 Google 게정 연결 후 개인 Google Drive 앱 데이터 영역을 사용해 기기 간 기록을 동기화 한다.
데이터 관리 연결 해제와 기록 삭제를 구분하고, 이 기기만 삭제하는 경우와 Drive를 포함하는 경우의 범위를 안내한다.

📁 사용자 흐름

1. 처음 사용하기

앱 실행 → 최초 안내 확인 → 오늘 타임라인 → 기록 추가 → 현재 시각을 기본으로 내용 입력 → 저장 → 타임라인에서 확인.

회원가입이나 Google 연결을 첫 기록의 선행 조건으로 두지 않는다.

 

2. 앱 안에서 기록하기

오늘 또는 과거 날짜 선택 → 기록 추가 → 내용 입력 → 필요하면 시작·종료 시각 변경 → 저장 → 선택 날짜의 타임라인으로 복귀.

기록 날짜는 선택 날짜에 고정한다. 기존 기록을 선택하면 저장된 시각과 내용을 불러와 수정하거나 삭제할 수 있다.

 

3. 홈 화면에서 빠르게 기록하기

위젯 또는 앱 빠른 실행 → 네이티브 기록 팝업 → 직접 입력 또는 지원 기기의 음성 입력 → 내용 확인·수정 → 저장 → Android 홈 화면으로 복귀.

위젯을 누르거나 말을 마치는 것만으로 기록이 자동 저장되지는 않는다. 빠른 기록도 일반 기록과 같은 저장·검증·동기화 대기열을 사용한다.

 

4. 하루 돌아보기

주간 스트립 또는 달력에서 날짜 선택 → 시간순 기록 확인 → 필요하면 수정·보완 → 일기 작성 등 개인적인 회상에 활용.\\

기록이 있는 날은 첫 기록보다 한 시간 앞선 위치부터 보여준다. 기록이 없는 오늘은 현재 시간대 주변, 기록이 없는 과거 날짜는 00시부터 보여주는 기준을 사용한다.

 

5. 하루 공유하기

날짜 선택 → 공유·저장 진입 → 텍스트 또는 이미지 선택 → 결과 생성 → OS 공유 또는 저장.

PNG는 화면 스크롤을 캡처하는 방식이 아니라 하루 전체를 별도로 그린다. 현재 홈 화면의 밝기·색상 테마와 타임라인 표현을 반영한다.

 

6. 기록 파일 옮기기

보내기: 기록 보내기 → 전체·월별·하루 범위 선택 → `.24kan` 생성 → 저장 위치 또는 전달 대상 선택.
가져오기: 기록 가져오기 → 시스템 파일 선택 → 형식·내용 검증 → 앱에서 제공하는 적용 절차 진행 → 기록 확인.

가져오기 검증 실패 시 기존 기록을 유지한다. 파일 이동과 Drive 동기화는 목적과 적용 규칙이 다른 경로로 다룬다.

 

7. Google Drive 연결하기

설정 → Google 연결 → 계정·권한 확인 → 처음 동기화 → 이후 필요에 따라 자동 동기화 또는 지금 동기화 사용.

재실행 시 기존 연결의 자동 복원과 사용자 확인이 필요한 로그인을 구분한다. 연결·인증 상태를 화면에 전달하고, 인증 중 앱 화면 입력을 차단하는 처리를 추가했다. 연결했던 계정과 다른 계정이 선택되면 동기화를 막아 기록이 섞이지 않도록 처리한다.

🧱 설계 구조

스물네칸은 사용자가 입력한 기록을 기기에 먼저 저장하고, 필요한 경우 Google Drive와 동기화하는 구조로 만들었습니다. 로그인이나 네트워크 연결 없이도 기록을 작성하고 확인할 수 있도록 기본 방향을 잡았습니다.

 

1. 화면과 데이터 처리의 역할 분리

  • 앱의 화면과 공통 기능은 Flutter와 Dart로 구현했습니다. 코드는 크게 화면을 보여주는 부분, 화면의 상태를 관리하는 부분, 데이터를 읽고 저장하는 부분으로 나누었습니다.
  • 예를 들어 사용자가 날짜를 바꾸면 다음 순서로 동작합니다.
사용자가 날짜 선택
        ↓
ViewModel이 선택 날짜를 변경하고 기록 조회 요청
        ↓
Repository가 해당 날짜의 기록을 DB에서 조회
        ↓
ViewModel이 조회 결과를 받아 기록 목록 갱신
        ↓
UI가 갱신된 목록을 타임라인으로 표시
  • 여기서 ViewModel은 화면에 필요한 상태를 관리하는 코드입니다. 선택한 날짜, 보여줄 기록 목록, 데이터를 불러오는 중인지 등을 관리합니다. 실제 글자와 카드의 모양·색상·배치는 UI 코드가 담당합니다.
  • Repository는 기록을 조회하거나 저장하는 기능을 제공하는 코드입니다. RecordRepository에서 어떤 기능을 제공할지 정의하고, DriftRecordRepository에 그 기능을 실제 DB 처리와 연결하는 코드를 작성했습니다.

 

2. 기기 내부에 기록과 설정 저장

  • 실제 데이터는 기기 내부의 SQLite 데이터베이스에 저장합니다. 기록 날짜, 시작·종료 시각, 내용과 함께 색상 테마·언어 등 주요 설정도 보관합니다.
  • SQLite에 접근할 때는 Drift라는 Dart 라이브러리를 사용했습니다. Drfit 자체가 데이터를 보관하는 별도 저장소는 아니며, 앱 코드에서 SQLite의 데이터를 읽고 추가·수정·삭제할 수 있도록 도와주는 도구입니다.
앱의 데이터 처리 코드 → Drift → SQLite 데이터베이스

 

 

3. 앱과 위젯에서 같은 저장 처리 사용

  • 스물네칸에는 앱 안에서 여는 기록 입력창과 Android 홈 화면의 위젯·바로가기에서 여는 빠른 기록 팝업이 있습니다.
  • 빠른 기록 팝업은 앱의 타임라인 화면을 거치지 않고 기록하기 위한 기능입니다. Android 전용 기능은 Kotlin으로 구현하고 Flutter의 공통 저장 처리와 연결했습니다.
  • 두 입력창은 진입 방식과 화면 구현이 다르지만, 저장할 때는 같은 Repository를 사용합니다.
앱 안의 기록 입력창 ─────┐
                        ├→ 입력 검증 → 공통 저장 처리 → SQLite
홈 화면의 빠른 기록창 ───┘
  • 이렇게 구성해 어느 화면에서 작성하더라도 동일한 내용·시간 검증과 저장 규칙을 적용하도록 했습니다.

 

4. 기록과 동기화할 작업을 함께 저장

  • 기록을 추가하거나 수정하면, 실제 기록과 함께 나중에 동기화할 변경 작업도 DB에 남기도록 했습니다.
  • 예를 들어 기록 내용을 수정할 때는 다음 두 작업을 하나로 묶습니다.
    • 활동 기록 테이블의 내용을 수정한다.
    • 동기화 대기 테이블에 해당 기록이 수정됐다는 작업을 추가한다.
  • 이 묶음을 DB 트랜잭션으로 처리하며, 두 작업이 모두 성공해야 확정하고 중간에 실패하면 이번 묶음의 변경을 취소하는 방식입니다. 이유는 기록만 저장되고 동기화할 작업은 누락되는 상황을 방지하기 위해서였습니다.
  • 동기화 대기 작업도 기기에 저장되므로, 앱이 종료되어도 이후 전송에 사용할 수 있습니다. 단, 이 단계에서 Google Drive 업로드까지 함계 완료하는 것은 아닙니다.

 

5. 선택적인 Google Drive 동기화

  • Google Drive 동기화는 로컬 기록과 별도로 선택해서 사용하는 기능입니다. 자체 사용자 서버 대신, 사용자가 연결한 Google 계정의 Drive 앱 데이터 영역을 이용합니다.
  • 동기화할 때는 기기에 남아 있는 변경 작업을 보내고, 다른 기기에서 변경한 기록을 가져와 병합합니다. 같은 작업을 중복 반영하지 않거나, 동시에 수정된 내용과 삭제된 기록을 처리하기 위한 규칙도 적용했습니다.
  • 빠른 기록 팝업이 직접 Drive로 전송하는 구조는 아니며, 어떤 입력창에서 작성했든 기기에 먼저 저장하고, 이후 동기화 조건에 따라 처리합니다.

 

6. 기록 공유와 기록 파일 이동

  • 기록을 앱 밖에서 활용하는 방법도 구분했습니다.
    • 텍스트·PNG 공유: 선택한 하루의 기록을 읽거나 다른 사람에게 전달하기 위한 기능.
    • .24kan 파일 이동: 기록을 파일로 보관하거나 다른 기기의 스물네칸으로 옮기기 위한 기능.
  • PNG는 현재 화면을 그대로 캡처하지 않고, 저장된 기록을 바탕으로 하루 전체 타임라인을 별도로 그리도록 되어 있습니다. 이 공유·파일 이동 기능은 Google Drive 연결 없이도 사용할 수 있습니다.

✍ 느낀 점과 회고

서비스를 직접 기획하고 기능을 정의하는 것부터 구현과 Google Play 배포까지 경험했습니다.

비공개 테스트를 거쳐 프로덕션 액세스 승인을 받았고, 현재는 정식 출시를 준비하고 있습니다.

 

처음부터 끝까지 하나의 서비스를 만들어 보는 과정은 기능 뿐 아니라 사용 흐름과 배포 이후의 운영까지 생각해 보는 계기가 되었습니다.

 

이 과정에서 AI의 도움을 많이 받았습니다. 때로는 이 방식으로 개발하는 것이 맞는지 고민하기도 했습니다. 아이디어와 기획, 사용자 경험의 방향은 제가 정하고, AI를 활용해 빠르게 MVP를 구현하고 수정했습니다. 미처 생각하지 못한 부분을 제안 받기도 했지만, 이를 제품에 반영할지는 직접 판단해야 했습니다. 이를 통해 구현할 내용을 명확하게 설명하고, 결과가 의도한 경험과 맞는지 확인하는 일의 중요성을 배웠습니다.