투자킹을 만들 때 “코인 가격 보고 매수/매도하는 기능”보다 더 중요하게 생각한 게 하나 있었다.
모의투자 자체가 금방 질리지 않게 만드는 것.
실제로 대부분의 모의투자 서비스가 겪는 문제가 있다.
- 가짜 돈이라 긴장감이 없고
- 며칠 계산하다가 질리면 바로 떠나고
- 몰빵 몇 번 하고 끝나는 구조로 흘러가기 쉽다
이걸 해결하지 못하면 아무리 UI를 잘 만들어도 사용자가 오래 남지 않는다.
그래서 초반부터 게임적 성장 구조를 넣는 걸 목표로 정했고,
그 결과 퀘스트–레벨–티어 구조가 자연스럽게 생겼다.
여기서는 이 세 가지 시스템을 어떤 생각으로 설계했고
백엔드에서 어떻게 굴러가게 만들었는지 흐름 위주로 설명한다.


왜 퀘스트 시스템을 넣었나
가장 먼저 떠올린 건 매일 접속할 이유를 만들어야 한다는 점이었다.
그걸 해결해주는 게 퀘스트였다.
퀘스트는 단순히 “일일 미션”이 아니라,
사용자의 행동을 자연스럽게 유도하는 장치다.
내가 의도한 건 크게 세 가지였다.
- 매일 접속할 이유 제공
- “일일 로그인 → 보상” 정도로 단순한 구조여도 효과는 크다.
- 처음 들어온 사람에게 명확한 방향 제공
- “이걸 먼저 해보라”는 안내 없이 그냥 차트만 보여주면 이탈률이 높다.
- 투자 공부를 강요하지 않고 자연스럽게 반복시키기
- 코인을 여러 개 눌러보게 만들고
- 작은 매수/매도를 해보게 하고
- 차트도 보게 하는 구조
퀘스트를 설계하면서 가장 신경 쓴 건
“투자 공부를 억지로 시키지 않는 것”이었다.
그냥 자연스럽게 써보다 보면
어느 순간 기능들이 익숙해지는 식을 의도했다.
퀘스트 타입은 어떻게 나눴나
퀘스트를 너무 많이 만들어도 복잡해지고
너무 적으면 금방 질린다.
그래서 처음에는 핵심 행동 중심으로 6~7개만 잡았다.
- 로그인
- 특정 코인 매수
- 가격 예측
- 피드 글 작성
- 댓글 작성
- 특정 시간 접속
- 한 번의 거래로 일정 수익/손실 만들기
- 소셜 관련 보상(좋아요 등)
이 정도면
“로그인 → 거래 → 예측 → 소셜”
이런 일일 루프가 자연스럽게 생긴다.
유저 행동마다 백엔드에서 이벤트를 발행한다.
trade_completed
feed_created
comment_created
login_completed
퀘스트 시스템은 이런 이벤트만 듣고 있다가
해당하는 퀘스트의 진행도를 업데이트한다.
즉, 퀘스트 서비스가 다른 기능을 직접 호출하지 않는다.
→ 이건 뒤집어 말하면 이벤트 기반 설계가 아주 깔끔하게 맞아떨어졌다는 뜻이다.
퀘스트 코드가 어디에도 얽히지 않고 독립적으로 유지된다.
레벨 시스템은 왜 필요했나
레벨을 넣은 이유는 단순하다.
- 성장하는 느낌
- 보상이 쌓이는 구조
- 레버리지 해금 등 기능 제한을 자연스럽게 붙일 수 있음
특히 레버리지 같은 기능은
처음부터 100배를 열어두면 밸런스가 무너진다.
(모의투자 서비스라도 폭망 체험을 남발하면 UX가 엉망이 된다.)
그래서 레벨 구조를 이용해
투자 난이도를 점진적으로 높이는 방향으로 갔다.
레벨업에 필요한 경험치는 일정하게 두지 않고,
퀘스트에서 주는 경험치도 너무 적지도 많지도 않도록 조절했다.
내가 설정한 흐름은 이런 느낌이다:
- 1일차 유저
- 현물 거래 위주
- 2~5배 정도의 저레버리지만 사용 가능
- 며칠 사용한 유저
- 경험치로 레벨이 오르면서
- 10배, 20배, 30배 레버리지가 순서대로 열림
- 장기 사용자
- 최고 100배까지 해금
- 거래 수수료 할인
- 로그인 보상 증가
- 소소한 이자 보너스
즉, 레벨은 기능 잠금 해제 + 보상 확대 역할을 동시에 한다.
유저에게는 “실력”처럼 느껴지고
서비스 관점에서는 자연스러운 난이도 조절 장치가 된다.
특성(Trait) 시스템으로 보상 차별화
레벨이 올랐을 때 단순히 “축하합니다!” 하고 끝내면 의미가 없다.
그래서 특성 시스템을 붙였다.
- 수수료 할인
- 레버리지 단계 해금
- 이자 보너스
- 로그인 보상 증가
이 특성들은 단순히 장식이 아니라 실제 플레이 방식을 바꾼다.
특성 때문에 “퀘스트 → 경험치 → 레벨 → 특성” 이 연결되면서
루프가 명확해진다.
티어 시스템은 왜 만들었나
레벨은 “노력 기반 보상”이고,
티어는 “자산 기반 랭킹”이다.
두 개를 분리한 이유는 아주 단순하다.
- 레벨이 높다고 해서 돈을 많이 벌었는 건 아니다
- 수익률이 높다고 해서 활동을 많이 한 것도 아니다
둘은 완전히 다른 개념이고
서로 섞으면 이상한 구조가 된다.
그래서 티어는 그냥 총 자산 기준으로만 계산했다.
알고리즘은 단순하다.
- 총 자산이 일정 기준 넘으면 티어UP
- 기준은 기하급수 형태 (1.2배, 1.3배 이런 식으로 증가)
- 랭킹은 티어 → 레벨 → 경험치 순으로 정렬
여기서 중요한 건
티어 계산을 별도로 저장하지 않고 실시간 계산으로 만든 점이다.
이유는 간단하다.
- 별도로 저장하고 업데이트하면 레이스 컨디션이 발생하기 쉽고
- 비동기 환경에서 값 불일치 가능성이 생기고
- 실시간 계산해도 부담이 거의 없다
티어는 단순한 산술 연산이기 때문에
“계산된 컬럼”처럼 취급해도 충분했다.
전체 시스템을 하나의 루프로 묶기
퀘스트, 레벨, 특성, 티어를 각각 따로 만들면
서로 따로 놀게 된다.
이게 제일 별로다.
내가 의도한 건 하나의 루프다.
퀘스트 → 경험치 → 레벨업 → 특성 해금 → 더 많은 거래/활동 → 티어 상승
이 루프가 완성되면
사용자는 자연스럽게 다음 단계로 넘어가고 싶어진다.
- 경험치 조금 남았네 → 퀘스트 하나 더 해봐?
- 레벨 오르면 레버리지 또 열리네
- 티어 바뀌면 프로필도 더 멋져보이네
- 피드 활동하면 소셜 보상도 생기네
이런 식으로 서비스 자체가 플레이가 되는 구조를 목표로 했다.
백엔드 구조는 어떻게 되어 있나
퀘스트 시스템을 처음 구현할 때 고민이 많았다.
퀘스트 완료 혹은 확인 로직이 코드 곳곳에 퍼져있으면 퀘스트가 많아질수록 점점 관리하기가 힘들어질 것 같아서였다.
그래서 채택한 방식은 이벤트 버스 구조이다.
1) 이벤트 기반 구조
각 기능은 그냥 이벤트만 던진다.
event_bus.emit("trade_completed", { user_id, pnl, ... })
event_bus.emit("feed_created", { user_id })
event_bus.emit("login_completed", { user_id })
퀘스트/레벨 관련 로직은
이벤트만 받아서 처리한다.
이렇게 분리하면
퀘스트가 다른 도메인 로직을 건드릴 필요가 없다.
2) 퀘스트 초기화는 백그라운드 작업
- 자정마다 퀘스트 초기화
- 타임드 로그인 퀘스트 만료 체크
- 가격 예측 퀘스트 평가
- 소셜 보상 정산
이런 건 Worker 프로세스에서 주기적으로 처리한다.
이 구조 덕분에
API 서버는 순수하게 요청 처리만 담당하고
Worker가 상태 변화를 모두 담당한다.
정리
투자킹의 퀘스트/레벨/티어 시스템은
코인 모의투자라는 지루한 구조를 조금이라도 덜 지루하게 만들기 위해
서비스 초반부터 가장 신경 썼던 부분이다.
이 시스템 덕분에 사용자는
- 무작정 차트를 보는 게 아니라
- ‘목표 → 보상 → 성장’이라는 흐름을 타게 되고
- 자연스럽게 기능을 탐색하면서
- 장기적으로 투자 감각까지 익히게 된다
모의투자 커뮤니티 1인 개발기
투자킹 링크
코인 모의투자 | 투자킹 - 실시간 암호화폐 모의투자 플랫폼
실시간 시세로 가상 투자 경험. 투자킹은 초보자도 쉽게 시작할 수 있는 암호화폐 모의투자 플랫폼입니다.
twojaking.com
'모의투자 개발기' 카테고리의 다른 글
| 모의투자 커뮤니티 1인 개발기 (5) – 무중단 배포 구현하기 (0) | 2025.11.25 |
|---|---|
| 모의투자 커뮤니티 1인 개발기 (4) – 커뮤니티 기능 개발 (0) | 2025.11.25 |
| 모의투자 커뮤니티 1인 개발기 (2) – 실시간 가격 업데이트 구현 (0) | 2025.11.25 |
| 모의투자 커뮤니티 1인 개발기 (1) – 서비스 구조 설계 (0) | 2025.11.25 |
| 모의투자 커뮤니티 1인 개발기 (프롤로그) – 왜 모의투자 커뮤니티 인가? (0) | 2025.11.25 |