2026년 4월, 낚시일기를 만든 다음 달에 시작했습니다. 개인 기록에서 대회 운영으로 넘어간 셈인데, 기록을 남기는 일과 그 기록을 남이 인정해 주는 일은 완전히 다른 문제였습니다.

사람 수가 모자란다

대회 운영에서 공정성이 문제가 되는 이유는 대개 누가 나빠서가 아닙니다. 볼 사람이 모자라기 때문입니다.

운영자는 한정적입니다. 참가자는 넓은 구역에 흩어져 있고, 각자 다른 시각에 낚습니다. 운영자가 전부를 동시에 볼 방법이 없습니다. 그러면 결국 신고와 신뢰에 기대게 되는데, 그 상태로는 시비가 생겼을 때 판정할 근거가 남지 않습니다.

공정성이 흔들리면 대회 자체가 무의미해집니다. 그래서 사람이 다 볼 수 없는 것을 앱이 보게 만들기로 했습니다.

앱이 대신 보는 것 세 가지

대회장 이탈 여부. 정해진 대회 구역 안에 있는지를 확인합니다. 구역을 벗어난 곳에서 나온 기록은 그 대회의 기록이 아닙니다. 이건 사람이 순찰해서 잡을 수 있는 종류의 일이 아닙니다.

조과물의 진위. 제출된 조과가 그날 그 자리에서 나온 것인지를 확인합니다. 대회에서 가장 다툼이 생기기 쉬운 지점이고, 판정 근거가 남아야 하는 지점이기도 합니다.

실시간 리더보드. 확인된 기록이 바로 순위에 반영됩니다. 이게 중요한 이유는 속도가 아니라 투명성입니다. 모두가 같은 화면을 같은 시각에 보고 있으면 나중에 순위를 두고 설명할 일이 줄어듭니다.

왜 실시간이어야 하는가

집계를 나중에 몰아서 하면 그 사이가 전부 깜깜해집니다. 참가자는 자기가 몇 등인지 모르고, 운영자는 마감 뒤에 밀린 검수를 한꺼번에 처리해야 합니다. 이의가 들어와도 이미 시간이 지난 뒤입니다.

실시간으로 올리면 검수도 흐름 속에서 나눠 처리되고, 참가자는 자기 기록이 인정됐는지를 그 자리에서 압니다. 공정성은 결과를 잘 발표하는 것이 아니라 과정이 보이는 것에 가깝다고 봤습니다.

무엇으로 만들었나

낚시일기와 같은 조합입니다. React 19와 TypeScript, Vite, Tailwind CSS로 만들고 Capacitor로 감싸 Android 앱으로 냅니다. 화면이 여러 개로 갈리는 앱이라 React Router를 붙였고, 위치 확인은 Capacitor의 위치 플러그인, 지도는 Leaflet, 로그인은 Firebase를 씁니다.

두 번째 앱이라 첫 앱에서 배운 것을 거의 그대로 가져올 수 있었습니다. 낚시일기를 만들 때는 화면 하나 짜는 것도 검색해 가며 했는데, 여기서는 그 시간이 규칙을 설계하는 쪽으로 옮겨 갔습니다. 처음 만들며 익힌 것이 실제로 남았다는 것을 이때 느꼈습니다.

지금

Google Play에 나와 있습니다. 참가 접수, 기록 제출과 검수, 실시간 순위와 공지를 한 플랫폼에서 다룹니다.

앞으로는 소규모 친선전부터 지역 대회까지 쓸 수 있도록 운영자 도구와 참가자 화면을 더 분리해 나갈 생각입니다. 두 쪽이 필요한 것이 서로 다르기 때문입니다.

대회에 나가시는 분이라면 낚시 대회 준비물 체크리스트도 같이 보시면 됩니다.