프로젝트로 돌아가기

App Store 출시

PolyLog

일본어 학습에서 발견한 쓰기→첨삭→복습의 흐름을, 12시간 MVP에서 App Store 공개까지 발전시킨 앱입니다.

일본어로 일기를 쓰면 Gemini 첨삭을 받고, 모르는 단어를 저장해 바로 복습할 수 있는 앱입니다. 스터디 부원들에게 들은 첨삭 대기와 단어 기록의 번거로움을 바탕으로 12시간 만에 MVP를 만들고 혼자 App Store에 출시했습니다.

기간
2025.10 - 2025.12
담당 범위
앱 전체 · AI feedback · App Store 배포
개인 개발
저장소
비공개 리포지토리

글을 쓴 직후 자연스러운 표현을 확인하기까지의 문제

일본어 스터디 부원들에게 일기를 써도 자연스러운 표현인지 바로 확인하기 어렵고, 모르는 단어를 따로 검색해 기록하는 일도 번거롭다는 이야기를 들었습니다. 글쓰기와 단어 복습이 서로 끊어진 작업이었던 셈입니다.

12시간 해커톤에서는 커뮤니티 기능을 넓히기보다 일기→AI 첨삭→단어 저장→복습으로 이어지는 하나의 흐름에 집중했습니다.

학습 루프

일기를 쓴 순간부터 다음 복습까지 연결

  1. 01

    일기 쓰기

    학습자의 글

  2. 02

    AI 피드백

    Gemini 문장 수정·설명

  3. 03

    기록 저장

    Firebase 일기·단어 저장

  4. 04

    기기에서 복습

    Hive 단어장·복습 상태

자유로운 AI 응답 앞에 화면을 지키는 경계를 세웠습니다

Gemini 응답에서 항목이 빠지거나 형식이 바뀌면 첨삭 결과 화면이 필요한 필드를 읽지 못해 표시할 수 없었습니다.

12시간 안에 MVP를 만들면서도 API 키를 클라이언트에 넣지 않고, Flutter 화면이 성공·실패·재시도 상태를 구분할 수 있어야 했습니다.

Gemini 요청은 Firebase Functions를 거치게 하고 JSON mode로 응답 형식을 제한한 뒤 JSON.parse로 화면 모델에 매핑했습니다. runtime schema·자동 재시도·에러 로깅은 구현하지 않았습니다.

  • 프롬프트와 JSON mode로 필수 필드 지정했습니다.
  • Firebase Functions에서 Gemini API 키 관리했습니다.
  • JSON.parse 결과를 Flutter 피드백 모델로 변환했습니다.

이 구성을 포함한 v1.0.1을 App Store에 출시했습니다. 배포는 확인됐지만 파싱 성공률·지연 시간·필드 누락률은 측정하지 않았습니다.

JSON 형식을 요구하는 것만으로는 계약이 아니며 runtime 검증·재시도·로깅까지 있어야 실패를 관리할 수 있다는 점을 배웠습니다.

PolyLog 일기 작성 화면

빠른 복습을 위한 Firestore와 Hive의 역할 분담

단어장은 짧은 항목을 연속해서 읽고 복습 상태를 자주 바꾸는 화면입니다. 단어를 넘길 때마다 Firestore 응답을 기다리면 짧은 학습 흐름이 네트워크 상태에 좌우됩니다.

12시간 MVP에서 시작한 개인 앱이라 복잡한 오프라인 우선 동기화 체계를 새로 만들 여유는 없었습니다. 반대로 기기만 원본으로 두면 로그인 기반 사용자 데이터를 Firebase에서 관리하는 구조와 맞지 않았습니다.

Firestore를 원격 원본으로 유지하고 로그인·초기 동기화 때 단어를 Hive에 저장했습니다. 평소 목록과 복습은 Hive에서 읽고 변경 시에는 원격 데이터와 로컬 캐시를 함께 갱신하도록 구성했습니다.

  • 로그인 후 Firestore 단어 데이터를 Hive로 동기화했습니다.
  • 단어 목록과 복습 순서를 로컬 데이터에서 구성했습니다.
  • 추가·복습 상태 변경을 Firestore와 Hive에 함께 반영했습니다.

이 데이터 흐름을 포함한 앱을 App Store에 출시했습니다. 요청 수나 화면 표시 시간의 전후 비교는 측정하지 않았고, 오프라인 변경 충돌 규칙도 아직 문서화하지 않았습니다.

로컬 캐시를 추가하는 일은 조회를 빠르게 하는 데서 끝나지 않고, 어떤 데이터를 원본으로 삼고 언제 동기화할지 정하는 설계라는 점을 배웠습니다.

PolyLog 단어 학습 화면

App Store에 버전 1.0.1을 공개했습니다. 사용자가 제공한 집계 기준으로 총 다운로드는 약 30회입니다.

처음 만든 서비스를 App Store에 출시해 큰 성취감과 자신감을 얻었습니다. 첫 Flutter 작품에서 요청 전 로딩 표시, 백엔드 응답을 화면 상태로 변환하는 처리, 실패 후 재시도 안내를 직접 구현했습니다. 이후 API를 설계할 때도 화면이 이 상태들을 구분할 수 있는 응답 형식과 오류 정보를 함께 고려하게 됐습니다.

JLPT 합격과의 인과관계는 주장하지 않습니다. Gemini 응답을 올바르게 해석한 비율(parsing success), 응답 시간(latency), 성능 개선값도 측정하지 않았습니다.

  • Gemini 응답 runtime schema 검증·재시도·에러 로그 추가
  • Firestore/Hive 동기화와 오프라인 변경 정책 문서화
  • 현재 앱의 측정과 유지보수 정책 결정