live · service · iOS 출시 / Android 비공개 테스트 중
링고루프
문장과 단어를 매일 반복하며 자연스럽게 익히는 언어 학습 앱. 하루 한 번 주어지는 문장으로 발음 · 뜻 · 문법 · 단어를 한 번에 익히고, 퀴즈와 망각곡선 복습으로 다시 만나게 만드는 — "외우는 공부"가 아니라 "계속 마주치는 루프"를 목표로 만든 도구입니다.
서비스 소개
링고루프는 "단어장 하나를 통째로 외우는" 방식 대신, 매일 한 문장씩 마주치며 그 안의 표현 · 문법 · 단어를 맥락째 익히게 만드는 언어 학습 앱입니다. 하루 목표만큼의 문장을 받아 발음(TTS)을 듣고, 뜻과 상황 · 문법 노트를 확인하고, 모르는 단어는 단어장에 담습니다. 그렇게 익힌 문장과 단어는 퀴즈와 망각곡선 복습을 통해 며칠 뒤 다시 돌아옵니다 — 한 번 보고 끝나지 않도록.
앱은 Flutter + Riverpod + Dio, 서버는 NestJS + TypeORM + PostgreSQL 로 직접 구현했고 한 대의 VPS 안에서 Docker 로 운영합니다. 이메일 · Google · Apple · Kakao 로그인, 사용자 타임존 기준의 데일리 푸시, 홈 위젯, 그리고 App Store / Google Play 구독(월 ₩3,900) 검증까지 — 서버에서 직접 다룹니다. 현재 iOS 는 정식 출시되었고, Android 는 Google Play 비공개 테스트를 진행 중입니다.
- 데일리 문장하루 한 번 주어지는 문장 — 발음(TTS) · 번역 · 사용 상황 · 단어 분해 · 문법 노트를 한 화면에. 사용자 타임존의 자정에 맞춰 새 문장으로 갱신.
- 단어장문장에서 모르는 단어를 담고, 활용형 · 품사 · 예문까지 정리. 단어 카드를 이미지로 내보내 공유 / 사진 저장도 가능.
- 퀴즈객관식 · 빈칸 · 단어 배열 · 듣고 고르기(음성 인식). 문장 / 단어 / 오늘 / 배열 탭으로 나뉘어 풀이 기록까지 남습니다.
- 망각곡선 복습학습 이력과 숙련도 기반의 SRS 복습 — 맞힌 시점을 기준으로 다시 만날 문장 · 단어를 골라줍니다.
- 학습 통계완료한 문장 / 익힌 단어 / 퀴즈 점수와 일별 활동 히트맵 · 주간 리포트로 꾸준함을 눈으로.
- 푸시 리마인더타임존 기준 데일리 문장 푸시, 프리미엄 퀴즈 푸시, 그리고 홈 위젯을 채우는 silent 푸시까지.
- 소셜 로그인이메일 · Google · Apple · Kakao. 콜드 스타트 시 로그인 화면 깜빡임을 없애는 UserInfo 캐시까지 다듬었습니다.
- 프리미엄 구독월 ₩3,900 — 전체 퀴즈 해제 · 광고 제거 · 퀴즈 리마인더. StoreKit 2 / Play Billing 영수증을 서버에서 검증.
Architecture
모바일 앱과 홈 위젯이 같은 API 위에 얹혀 있고, 푸시 · 구독 · 소셜 로그인은 모두 서버에서 검증합니다. 한 대의 VPS 안에서 Docker 로 굴러갑니다.
Behind the scenes
만들면서 가장 인상 깊었던 두 가지 — "외우기"가 아니라 "다시 마주치기"를 설계한 일, 그리고 구독 검증을 끝까지 파고든 일.
-
01
외우는 앱이 아니라, 다시 만나게 하는 앱
단어를 외우는 앱은 이미 많았습니다. 정작 제게 필요했던 건 — 한 번 본 표현을 며칠 뒤에 자연스럽게 다시 마주치는 흐름이었습니다. 그래서 데일리 문장 → 단어장 → 퀴즈 → 망각곡선 복습이 하나의 루프로 이어지도록 짰습니다. 맞힌 시점(lastCorrectAt)을 기준으로 다음에 다시 등장할 문장과 단어를 고르고, 오늘 맞힌 문제는 그날은 다시 묻지 않도록. "공부했다"는 느낌보다 "어, 이거 봤던 건데" 하는 순간을 늘리는 게 목표였습니다. 이름을 링고루프(Lingo + Loop)라고 지은 이유이기도 합니다.
-
02
구독 검증은 클라이언트를 믿지 않는다
프리미엄(월 ₩3,900)을 붙이면서 가장 오래 붙든 건 결제였습니다. iOS 는 StoreKit 2 의 JWS 트랜잭션을 App Store Connect API 로, Android 는 Play Billing 토큰을 Google API 로 — 모두 서버에서 검증하도록 했고, 환불 / 취소 / 자동갱신 상태는 App Store 의 webhook 과 Google Pub/Sub(RTDN, OIDC 검증)으로 받아 구독 이벤트를 따로 기록합니다. "클라이언트가 프리미엄이라고 말해도 믿지 않는다"는 원칙을 지키려다 보니 감사(audit) 라운드를 열 번 넘게 돌렸고, 덕분에 페이월 우회 · 정산 드리프트 · 푸시 게이팅 같은 구멍을 출시 전에 메울 수 있었습니다.
Screenshots
카드를 누르면 큰 이미지로 볼 수 있습니다.
More
지나온 버전과 앞으로 들어갈 항목을 별도 페이지에서 확인할 수 있습니다.