← back to services

live · service · iOS 출시 / Android 비공개 테스트 중

링고루프

문장과 단어를 매일 반복하며 자연스럽게 익히는 언어 학습 앱. 하루 한 번 주어지는 문장으로 발음 · 뜻 · 문법 · 단어를 한 번에 익히고, 퀴즈와 망각곡선 복습으로 다시 만나게 만드는 — "외우는 공부"가 아니라 "계속 마주치는 루프"를 목표로 만든 도구입니다.

Flutter Riverpod GoRouter Dio NestJS TypeScript TypeORM PostgreSQL Firebase FCM JWT StoreKit 2 AdMob

서비스 소개

링고루프는 "단어장 하나를 통째로 외우는" 방식 대신, 매일 한 문장씩 마주치며 그 안의 표현 · 문법 · 단어를 맥락째 익히게 만드는 언어 학습 앱입니다. 하루 목표만큼의 문장을 받아 발음(TTS)을 듣고, 뜻과 상황 · 문법 노트를 확인하고, 모르는 단어는 단어장에 담습니다. 그렇게 익힌 문장과 단어는 퀴즈와 망각곡선 복습을 통해 며칠 뒤 다시 돌아옵니다 — 한 번 보고 끝나지 않도록.

앱은 Flutter + Riverpod + Dio, 서버는 NestJS + TypeORM + PostgreSQL 로 직접 구현했고 한 대의 VPS 안에서 Docker 로 운영합니다. 이메일 · Google · Apple · Kakao 로그인, 사용자 타임존 기준의 데일리 푸시, 홈 위젯, 그리고 App Store / Google Play 구독(월 ₩3,900) 검증까지 — 서버에서 직접 다룹니다. 현재 iOS 는 정식 출시되었고, Android 는 Google Play 비공개 테스트를 진행 중입니다.

Architecture

모바일 앱과 홈 위젯이 같은 API 위에 얹혀 있고, 푸시 · 구독 · 소셜 로그인은 모두 서버에서 검증합니다. 한 대의 VPS 안에서 Docker 로 굴러갑니다.

/ client 링고루프 앱 (iOS / Android) Flutter · Riverpod · Dio · GoRouter 홈 위젯 · 푸시 Home Widget · FCM https / data push · lingo.jiny.shop / edge Nginx · reverse proxy TLS · 랜딩 / 약관 · 정적 서빙 / app NestJS + TypeORM JWT · 소셜 검증 · 구독 검증 · cron 푸시 · 퀴즈 채점 / data & ext PostgreSQL 16 via TypeORM · 문장 / 단어 / 퀴즈 / 구독 Firebase FCM 데일리 / 퀴즈 / silent 푸시 Stores · OAuth App Store · Play Billing · Google·Apple·Kakao single VPS · Docker

Behind the scenes

만들면서 가장 인상 깊었던 두 가지 — "외우기"가 아니라 "다시 마주치기"를 설계한 일, 그리고 구독 검증을 끝까지 파고든 일.

  1. 01

    외우는 앱이 아니라, 다시 만나게 하는 앱

    단어를 외우는 앱은 이미 많았습니다. 정작 제게 필요했던 건 — 한 번 본 표현을 며칠 뒤에 자연스럽게 다시 마주치는 흐름이었습니다. 그래서 데일리 문장 → 단어장 → 퀴즈 → 망각곡선 복습이 하나의 루프로 이어지도록 짰습니다. 맞힌 시점(lastCorrectAt)을 기준으로 다음에 다시 등장할 문장과 단어를 고르고, 오늘 맞힌 문제는 그날은 다시 묻지 않도록. "공부했다"는 느낌보다 "어, 이거 봤던 건데" 하는 순간을 늘리는 게 목표였습니다. 이름을 링고루프(Lingo + Loop)라고 지은 이유이기도 합니다.

  2. 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

지나온 버전과 앞으로 들어갈 항목을 별도 페이지에서 확인할 수 있습니다.