영단어 끝말잇기 앱 WordKet
WordKet은 Flutter로 개발한 영어 단어 끝말잇기 게임입니다. 로컬 사전을 기반으로 단어의 유효성을 검사하고, 혼자 연습하는 모드부터 AI 대전, 랭크 1:1, 방 코드 기반 멀티 대전, 근거리 매칭까지 여러 방식으로 플레이할 수 있도록 구성했습니다.
단순한 단어 입력 앱이 아니라, 매치메이킹, 턴 진행, 제한 시간, 점수 계산, 계정 인증, 안전 단어 필터링까지 게임 서비스에 필요한 흐름을 직접 구현한 프로젝트입니다.
프로젝트 개요
- 개발 형태: 개인 프로젝트
- 개발 목적: Flutter 기반의 단어 게임 앱을 만들고, 온라인 대전과 랭크 시스템까지 포함한 서비스형 게임 구조를 구현
- 주요 기능: 회원가입, 랭크 로그인, 랭크 1:1 매칭, AI 연습, 방 코드 멀티 대전, 근거리 매칭, 로컬 단어 사전, 안전 단어 필터링, Android APK 및 Web 배포
- 배포: Web App https://engword.rchcom.kr/, Android APK word-ket.apk
- 사용 기술: Flutter, Dart, Supabase Edge Functions, CodeIgniter 4, PHP, PostgreSQL, Cloudflare Turnstile, Nginx
주요 기능
랭크 1:1 대전
사용자는 이메일과 비밀번호로 가입하고 로그인한 뒤 랭크 큐에 입장할 수 있습니다. 서버는 비슷한 MMR의 상대를 찾아 매치를 생성하고, 앱은 주기적으로 매치 상태를 갱신하며 현재 턴, 남은 시간, 점수, 단어 히스토리를 표시합니다. 경기가 끝나면 승패와 RP, 티어 정보를 갱신할 수 있도록 프로필 조회 기능도 함께 구성했습니다.
AI 및 혼자 연습 모드
연습 모드는 로컬 wordlist를 사용해 사용자가 입력한 단어가 실제 사전에 있는지 검증합니다. AI 대전에서는 이전 단어의 마지막 글자로 시작하는 후보 단어를 찾고, 난이도에 따라 사용할 수 있는 후보 범위를 조절해 AI가 응답하도록 만들었습니다. 입력 중에는 가능한 단어 힌트를 보여주어 혼자서도 자연스럽게 단어를 이어갈 수 있습니다.
방 코드 기반 멀티 대전
온라인 방을 만들면 4자리 방 코드가 생성되고, 다른 플레이어는 해당 코드를 입력해 같은 방에 참가할 수 있습니다. 방장은 참가자 목록을 확인한 뒤 게임을 시작할 수 있고, 게임 중에는 라운드, 제한 시간, 현재 턴, 점수 순위가 갱신됩니다. 플레이어가 이탈하거나 탈락하는 상황도 서버 상태와 UI에 반영되도록 처리했습니다.
근거리 매칭과 설치 흐름
가까운 상대와 바로 대전할 수 있는 근거리 매칭 화면을 두고, Android에서는 APK 다운로드, iOS 웹에서는 홈 화면 추가 안내를 제공했습니다. Web과 Android를 함께 배포하는 흐름을 고려해, 사용자 환경에 따라 설치 안내가 달라지도록 분기했습니다.
로컬 사전과 안전 단어 필터링
앱 내부의 assets/wordlist를 읽어 단어 목록을 캐싱하고, 알파벳 외 입력이나 로마 숫자, 중복 단어를 걸러냅니다. 별도의 assets/unsafe_words 목록을 사용해 부적절한 단어를 숨기거나 마스킹하며, 필요할 때 No safety mode로 표시 방식을 전환할 수 있게 했습니다.
구현 포인트
- 상태 모델링: 랭크 매치, 멀티룸, 플레이어, 프로필, 단어 턴을 모델 클래스로 분리해 서버 응답을 앱 상태로 변환했습니다.
- 서버 폴링: 랭크전과 멀티룸에서 1초 단위 상태 갱신을 사용해 턴 진행과 결과를 동기화했습니다.
- 인증 저장:
flutter_secure_storage로 로그인 세션을 저장하고, 여러 계정을 전환할 수 있게 구성했습니다. - 봇 방지: 회원가입과 로그인 과정에 Cloudflare Turnstile 인증 화면을 연결했습니다.
- 단어 검증: 로컬 사전 캐시와 서버 검증을 함께 사용해 연습 모드와 온라인 매치의 규칙을 유지했습니다.
- 배포 자동화: PowerShell 배포 스크립트로 Web build, Android APK, App Bundle, release metadata 생성을 한 번에 처리했습니다.
기술 스택
- Flutter, Dart, Material UI
- HTTP API 연동, JSON 직렬화, Timer 기반 polling
- Supabase migrations, Edge Functions, PostgreSQL
- CodeIgniter 4, PHP 기반 API 서버 및 관리자 대시보드
- Cloudflare Turnstile 인증
- flutter_secure_storage, nearby_connections, permission_handler, webview_flutter
- Nginx, Android release build, Web deployment
프로젝트를 통해 배운 점
이 프로젝트를 통해 Flutter 화면 구성뿐 아니라, 실제 게임 서비스에 필요한 인증, 매칭, 턴 동기화, 서버 상태 관리, 배포 과정을 함께 경험했습니다. 특히 랭크 1:1과 멀티룸 기능을 구현하면서 클라이언트가 모든 것을 결정하지 않고, 서버 상태를 기준으로 게임 진행을 맞추는 구조의 중요성을 배웠습니다.
또한 단어 게임처럼 규칙이 간단해 보이는 앱도 실제로는 중복 입력, 잘못된 문자, 제한 시간, 탈주, 안전 단어 처리, 네트워크 지연 같은 예외가 많다는 점을 확인했습니다. 이런 예외를 하나씩 상태와 UI에 반영하면서, 작은 게임을 서비스 가능한 형태로 다듬는 경험을 할 수 있었습니다.

