프로젝트

TODO Slayer (구 QuestKeeper)

할 일은 퀘스트가 되고 마감은 던전 조우가 되어, 제때 끝내면 용사가 몬스터를 단칼에 처치하는 픽셀 RPG 투두 앱입니다. SwiftUI와 SwiftData로 만든 네이티브 iOS 앱이며, 계정과 광고 없이 데이터를 기기 안에만 보관합니다.

한눈에 보기

항목 내용
출시 1.0.0 (2026-07-24) · 1.3.0에서 Quest Keeper → TODO Slayer로 이름 변경 (2026-08-17) · 최신 1.4.0 (2026-09-04)
링크 App Store
기술 스택 SwiftUI · SwiftData · WidgetKit (App Group으로 앱과 데이터 공유) · App Intents (단축어로 퀘스트 만들기) · StoreKit · Swift 6
구조 퀘스트에는 마감 시각과 완료 시각 같은 사실만 저장합니다. 긴급도, 몬스터의 세기, 그날의 임시 무덤은 화면을 그릴 때마다 순수 함수로 계산합니다.
품질 관리 1.4.0 머지 커밋 기준 단위 테스트 430개, UI 테스트 55개가 CI에서 실패 없이 통과
수익 모델 광고 없음 · 3단계 팁 인앱 결제(Tip Jar)
App Store 지표 노출 603 · 제품 페이지 조회 54 · 다운로드 약 4 (2026-09-28 확인)

프로젝트 이야기

프로젝트를 어떻게 시작하게 되었나요?

예전에 "QUEST"라는 아이폰 앱을 재미있게 쓴 적이 있는데, 그보다 게이미피케이션에 더 집중한 앱을 만들고 싶었습니다. 동시에 Siri 통합, 단축어, iCloud, 위젯과 Live Activities, Quick Actions처럼 iOS 네이티브 개발의 핵심적인 부분을 직접 구현해 보고 싶었습니다. 그 기능들을 담으면서 제가 실제로 쓸 수 있는 앱을 구상하니 자연스럽게 투두 앱이 떠올랐고, 할 일을 퀘스트로 다루는 구조도 자연스럽게 따라왔습니다.

React Native나 Flutter 없이 SwiftData, WidgetKit, App Group, Swift 6 strict concurrency 같은 네이티브 경계를 직접 다루는 학습 프로젝트이기도 합니다.

진행하며 만난 가장 큰 문제는 무엇이었으며, 어떻게 해결했나요?

위젯에서 퀘스트를 완료했는데, 앱을 다시 열어도 그 퀘스트가 완료되지 않은 채로 보이는 문제였습니다. 앱과 위젯은 App Group 안의 SwiftData 저장소 하나를 함께 씁니다. 앱을 새로 실행하면 완료 상태가 제대로 보였지만, 백그라운드에 있던 앱을 다시 앞으로 가져오면 위젯이 그사이 저장한 내용이 반영되지 않았습니다.

추측으로 코드를 고치는 대신, 같은 프로세스를 백그라운드로 보낸 뒤 저장소에 완료 시각을 외부에서 기록하고 다시 앞으로 가져와 화면을 캡처하는 실험 코드를 만들었습니다. 처음 떠올린 modelContext.rollback()은 같은 SQLite 연결과 스냅샷을 그대로 써서 여전히 옛 데이터를 보여 주었습니다. 반면 앱이 다시 활성화될 때 ModelContainer를 새로 만들면, 새 연결이 디스크의 최신 상태를 읽어 앱을 새로 실행했을 때와 같은 결과가 나왔습니다.

고치는 과정에서 두 가지를 더 확인했습니다. 제어 센터를 잠깐 내렸다 올리는 것처럼 백그라운드를 거치지 않은 전환에서는 컨테이너를 바꾸지 않아야 편집 중인 화면이 닫히지 않았습니다. 또 알림 재예약과 위젯 스냅샷 기록은 새 컨테이너를 기준으로 실행해야 했습니다. 옛 데이터를 기준으로 실행하면 위젯에서 이미 완료한 퀘스트의 알림을 다시 예약하고, 위젯이 써 둔 올바른 스냅샷을 덮어썼습니다.

재현 방법도 한 번 바로잡았습니다. 한 프로세스 안에서 컨테이너 두 개로 재현했을 때는 첫 번째 컨테이너가 두 번째 컨테이너의 기록을 볼 수 있어서 잘못된 통과가 나왔습니다. 그래서 이후에는 실제 프로세스 두 개가 저장소 하나를 쓰는 실험으로 바꿨고, 40번의 경쟁 실행에서 명시적으로 다시 조회한 값은 한 번도 옛 값이 아니었다는 것을 확인했습니다.

이름은 왜 바꾸었나요?

영어 스토어에서는 Quest Keeper라는 이름을 등록할 수 없었습니다. 한국어 스토어에서는 QuestKeeper를 쓸 수 있어서 그대로 둘까도 생각했지만, 이 이름이 앱의 실제 기능은 감추고 게임적인 부분만 보여 주는 것 같아서 두 스토어 모두 TODO Slayer로 바꿨습니다.

지금 사용자는 얼마나 되나요?

아직 다운로드는 4명 정도입니다. 노출 603회, 제품 페이지 조회 54회로 앱이 보이는 횟수 자체는 적지 않은데, 조회가 다운로드로 이어지지 않고 있습니다. 어떤 점이 유입을 막고 있는지 분석하고 있으며, 스토어 스크린샷 첫 장에 무엇을 보여 줄지 후보를 만들어 비교하고 있습니다.