iOS · React Native · TypeScript · App Store

logit — Log of the Day

"쓰기"가 아닌 "남기기"에 집중한 미니멀 데일리 로깅 iOS 앱. 카드 한 장이 로그 하나 — 기분 · 이벤트 · 사진 · 코멘트를 빠르게 남기면 자동 타임라인이 쌓이고, 데이터가 모이면 감정·요일·시간대 분석까지 제공한다. App Store에 출시되어 있다.

역할
1인 개발 — 기획 · 설계 · UI · RN 코드 · iOS/Android 빌드 · 출시에 이르는 전 과정
플랫폼
iOS (1차) · iOS 15.1+ · iPhone · iPod touch · Mac (Apple Silicon) · visionOS 호환
환경
React Native 0.81 · React 19 · TypeScript · React Navigation 7
UI 라이브러리
react-native-paper (Material Design 3) · react-native-svg · react-native-chart-kit
저장
AsyncStorage 기반 로컬 저장 (오프라인 우선, 클라우드 없음)
배포
App Store
레포
a7garden/logit (private)

1. 앱 화면

아래 다섯 장은 App Store와 실제 앱에서 가져온 화면이다. 타임라인 → 활동 통계 → 감정 분석 → 입력 폼 → 설정/테마 순서로 한 사이클을 보여준다.

logit 타임라인 — 일별 카드 리스트, 기분/이벤트 태그와 짧은 코멘트
타임라인 — 오늘이 항상 위에, 7개 칩으로 요일 선택. 카드는 기분·이벤트 해시태그 + 시각 + 짧은 코멘트의 집합.
logit Activity 통계 — Overall / Monthly, 첫 로그·평균 일일·총 로그·활성 일수·기분/이벤트 분포
Activity / Overall — 첫 로그 / 평균 일일 2.9개 / 총 40개 / 활성 14일 / 가장 활발한 요일·시간대 / 연속 일수까지 한 화면에.
logit 감정 분석 — Arousal×Valence 레이더, 요일별 라인 차트, 월별 분석 진입
감정 분석 — Arousal(에너지) × Valence(무드) 2차원 레이더 + 요일별 라인 차트로 패턴을 한눈에.
logit 입력 폼 — Satisfaction(기분) + Meal(이벤트) 선택 + 'What are you doing?' 자유 코멘트
입력 폼 — 기분 칩(Satisfaction / Peace / Anxiety / …) + 이벤트 칩(Meal / Bedtime / Go to Work / …) + 한 줄 코멘트. 한 탭에 끝.
logit 설정 — 언어 / 다크 모드 / 주 시작 요일 + Moods 토글 리스트
설정 — 언어(영어/한국어), 다크 모드, 주 시작 요일(Monday/Sunday), 그리고 사용자별 기분 on/off 토글. 최근 30일 사용 횟수가 함께 표시된다.

2. 문제 — 일기 작성의 심리적·시간적 마찰

전통적 일기는 시간과 에너지를 많이 요구한다. 그 결과 일기 앱의 이탈률은 매우 높다. 시간은 비가역적이고 기억은 휘발성이므로, 간단한 기록이라도 남길 수 있는 도구가 실제로는 없다. 목표는 "기록 습관화를 방해하는 마찰을 제거"하는 것.

3. 설계 — 카드 한 장이 로그 하나

모든 데이터는 LogCard 한 타입으로 정규화된다. 시점(createdAt)에 기분·이벤트·사진·코멘트가 묶이고, 그 묶음이 곧 카드다.

interface LogCard {
  id: string;            // uuid
  createdAt: number;     // epoch ms
  mood?: string[];       // 기분 태그 (복수 선택 가능)
  eventType?: EventType[]; // 이벤트 태그 (복수 선택 가능)
  comment?: string;      // 한 줄 메모 (선택)
  image?: string;        // 사진 URI (선택)
}

3.1 데이터 입력

사용자가 길게 쓰지 않아도 되도록 모든 필드는 탭으로 선택한다. 기분과 이벤트는 사용자가 설정에서 직접 추가·삭제·활성/비활성화할 수 있다.

3.2 자동 타임라인

카드는 createdAt 내림차순, 즉 오늘이 가장 위로 정렬된다. 7개 칩의 요일 선택기는 date-fns로 주차 경계를 계산하고, 카드는 선택한 날짜에 해당하는 것만 필터링된다. react-native-calendars의 캘린더 모달로 임의 날짜 점프도 제공한다.

3.3 통계 / 감정 분석

누적된 LogCard에서 다음을 계산한다. 모든 차트는 react-native-chart-kit + react-native-svg로 렌더링.

3.4 다국어 · 테마

UI 문자열은 src/utils/translations.ts(20KB)에 영어/한국어 키-값으로 들어 있고 LanguageContext가 현재 언어와 t() 함수를 제공한다. 테마 프리셋이 도입되어 색·표면·강조를 테마 단위로 전환한다. 설정의 Mood 토글과 함께 나만의 작업 공간을 만든다.

4. 기술 스택과 결정

4.1 왜 React Native인가

iOS 1차 출시에 Android도 옵션 빌드로 가져가고 싶었다. 같은 TypeScript 코드 베이스로 iOS · Android · macOS(Apple Silicon) · visionOS를 한 번에 가져갈 수 있는 현실적 선택지는 RN 0.81 + New Architecture뿐이었다. 0.81은 React 19와 짝을 이루며 동작하고, Hermes 기본 활성화로 cold start가 짧다.

4.2 UI 라이브러리: react-native-paper (Material Design 3)

MD3로의 마이그레이션을 시작했다. PaperProviderpaperTheme(primary / secondary / surface / onSurface / outline …)을 주입하면 Button, Text, IconButton이 일관된 표면·타이포로 자동 정렬된다. 테마 프리셋은 이 paperTheme 객체를 갈아끼우는 방식으로 구현.

4.3 데이터는 AsyncStorage

MVP는 로컬 우선이다. 서버 비용 없이 iOS 위젯·오프라인 환경에서도 작동한다. src/storage/index.ts(getAllLogs / saveLogs / migrateExistingLogs)는 키 하나("logs")에 JSON 배열로 직렬화하고, 시작 시 tagMigration으로 구버전 태그 키를 신버전으로 변환한다. 개인정보 처리방침에도 명시했듯 앱이 어떤 데이터도 수집하지 않는다.

4.4 비동기 데이터 처리

모든 화면은 두 훅(useLogs, usePreferences)을 통해 AsyncStorage와 통신한다. useAsync로딩/에러/성공 상태를 통합해, 화면마다 같은 fetch 패턴을 반복하지 않도록 했다.

4.5 디바이스 통합

5. 디자인 — 미니멀과 콘텐츠 우선

본 프로젝트는 Material Design 3로의 디자인 시스템 재정비를 진행 중이다. 그 결과는 두 가지로 나타난다.

색상 결정도 미니멀리즘 원칙을 따른다. 기본 블루(CTA/링크)와 그린(이벤트 강조), 라이트 배경 + 옅은 회색 표면이 일관되게 반복된다. 테마 프리셋은 같은 구조를 다른 팔레트로 표현한 변주다.

6. 한계와 다음 단계

7. 배포 & 링크