반응형

Strike Log 배지와 출석 streak를 표현한 대표 이미지
Strike Log 배지와 출석 streak를 표현한 대표 이미지

볼링 점수 기록 앱은 한 번 입력하고 끝나면 쉽게 잊힙니다. 그래서 Strike Log에는 “기록을 남겼다”에서 멈추지 않고, 사용자가 다시 앱을 켜고 싶어지는 장치를 넣고 싶었습니다.

이번 편에서는 Strike Log에 넣은 배지 시스템과 출석 streak를 정리해보겠습니다. 핵심은 단순합니다. 사용자가 게임을 저장하거나, 시리즈를 끝내거나, 클럽에 참여했을 때 앱이 작은 성취를 즉시 알려주는 구조입니다.

왜 배지가 필요했나

처음에는 평균 점수, 최고점, 최근 경기 기록만 있어도 충분하다고 생각했습니다. 하지만 실제로 앱을 계속 쓰게 만들려면 “내가 조금씩 쌓아가고 있다”는 느낌이 필요했습니다.

볼링은 점수가 오르락내리락합니다. 매번 최고점을 갱신하기 어렵고, 어떤 날은 기록을 남기는 것 자체가 성과일 때도 있습니다. 그래서 Strike Log의 배지는 고득점만 보상하지 않도록 설계했습니다.

  • 꾸준히 기록한 사람
  • 높은 점수를 낸 사람
  • 스트라이크를 많이 친 사람
  • 시리즈 경기를 완료한 사람
  • 클럽 활동에 참여한 사람
  • 연속 출석을 유지한 사람

이렇게 하면 초보자도 받을 수 있는 배지가 있고, 숙련자에게는 도전할 만한 배지가 생깁니다.

25개 배지 카탈로그로 성취를 쪼개기

Strike Log에는 총 25개의 배지를 준비했습니다. 카테고리는 마일스톤, 점수, 스트라이크, 시리즈, streak, 클럽으로 나눴습니다.

중요하게 본 부분은 “배지가 너무 뜬금없이 나오지 않아야 한다”는 점이었습니다. 사용자가 방금 한 행동과 배지 획득 이유가 자연스럽게 이어져야 합니다.

예를 들어 게임을 저장했는데 갑자기 클럽 관련 배지가 나오면 어색합니다. 반대로 첫 게임을 저장한 직후 “첫 기록 완료” 같은 배지가 나오면 사용자는 바로 이해할 수 있습니다.

  • 게임 저장 후 평가
  • 시리즈 완료 후 평가
  • 클럽 가입 또는 활동 후 평가
  • 출석 기록 갱신 후 평가

보상은 많을수록 좋은 것이 아니라, 납득 가능한 타이밍에 나오는 것이 더 중요했습니다.

게임 저장 후 배지 평가와 신규 배지 표시 흐름 이미지

게임 저장과 배지 평가 연결하기

Strike Log에서는 사용자가 게임을 저장하면 서버가 기록을 저장한 뒤 새로 획득한 배지를 함께 응답합니다.

앱 쪽에서는 이 응답의 newly_earned_badges 값을 확인합니다. 새 배지가 있으면 저장 완료 후 배지 모달을 띄워 사용자가 바로 성취를 확인할 수 있게 했습니다.

이 방식의 장점은 앱이 배지 조건을 전부 들고 있지 않아도 된다는 점입니다. 배지 조건은 서버에서 관리하고, 앱은 결과를 받아 보여주는 역할에 집중합니다.

덕분에 나중에 배지 조건을 바꾸거나 새 배지를 추가할 때도 앱 업데이트 부담을 줄일 수 있습니다.

출석 streak는 KST 기준으로 기록하기

출석 streak에서 가장 조심한 부분은 날짜 기준이었습니다.

서버가 Railway 같은 환경에서 동작하면 기본 시간대가 UTC일 수 있습니다. 그런데 사용자는 한국 시간 기준으로 앱을 사용합니다. 밤 11시 50분에 기록한 게임과 다음 날 0시 10분에 기록한 게임이 UTC 기준으로는 같은 날처럼 보일 수도 있습니다.

그래서 출석 로그는 attendance_logs.ymd_kst처럼 KST 기준 날짜 문자열을 따로 저장하는 방식으로 잡았습니다.

출석 streak는 단순 기능처럼 보이지만, 날짜 경계가 틀어지면 사용자가 바로 불편함을 느낍니다. “분명 어제도 기록했는데 streak가 끊겼다”는 경험은 재방문 동기를 크게 떨어뜨립니다.

KST 기준 출석 streak 캘린더 이미지

신규 배지는 모달과 알림으로 보여주기

배지를 만들었다면 보여주는 방식도 중요합니다.

Strike Log에서는 새 배지를 획득했을 때 앱 안에서 모달로 보여주고, 필요한 경우 FCM 알림으로도 연결할 수 있게 구성했습니다. 사용자가 게임 저장을 마친 직후 배지를 보면 기록 행위가 보상으로 이어졌다는 느낌이 분명해집니다.

다만 모든 보상을 과하게 띄우면 피로해질 수 있습니다. 그래서 핵심은 “새로 얻은 것만” 보여주는 것입니다. 이미 획득한 배지를 반복해서 강조하지 않고, 이번 행동으로 추가된 성취만 알려주는 식입니다.

단순 기록 앱에서 다시 켜는 앱으로

이번 기능을 만들면서 느낀 점은, 배지와 streak가 단순한 장식이 아니라는 것입니다.

기록 앱에서 가장 어려운 부분은 첫 사용이 아니라 재사용입니다. 사용자가 앱을 다시 열 이유가 있어야 기록이 쌓이고, 기록이 쌓여야 평균·최고점·성장 추이 같은 기능도 의미가 생깁니다.

Strike Log의 배지와 출석 streak는 그 반복 사용을 돕기 위한 장치입니다. 고득점 유저만을 위한 보상이 아니라, 오늘도 한 게임을 기록한 사람에게 작은 이유를 만들어주는 기능에 가깝습니다.

다음 편에서는 이 흐름을 이어서, FCM 푸시와 인앱 알림을 어떻게 연결했는지 정리해보겠습니다. 알림 타입을 앱 화면 라우팅과 맞추고, 미읽음 뱃지와 FCM 토큰 관리까지 붙이는 과정입니다.

반응형