불편함으로부터 시작한 서비스

단톡방에서 점수를 세고, 순위를 기다리고, 기록을 찾느라 다시 채팅을 뒤져야 했던 배드민턴 클럽을 위해 만든 서비스의 18개월 기록.

#system-design #microservices #spring-boot #flutter #fastapi #software-architecture

RV Badminton은 내가 실제로 다니는 배드민턴 클럽을 위해 만든 서비스다. 처음에는 단톡방과 수작업 정산에서 오는 불편을 줄이고 싶었다. 그러다 보니 매치 기록, 실시간 리더보드, 개인 통계, 커뮤니티까지 필요해졌다. 이 글에서는 무엇이 불편했는지, 그래서 무엇을 만들기로 했는지부터 이야기한다.


불편함은 코트 밖에 있었다

나는 주말마다 RV Badminton이라는 소모임에서 배드민턴을 친다. 정모가 열리면 여러 코트에서 남복, 여복, 혼복이 계속 돌아간다. 모임은 2022년 여름부터 시작했고, 나는 2023년 1월부터 시작했다.

가입 당시만 해도 20여명이었던 모임이었지만, 사람이 점점 모이면서 현재는 단톡방 인원이 100명이 훌쩍 넘고, 매 정모마다 30-40명의 사람이 모인다.

모임 대장인 김상우 형은 이 클럽을 체계적으로 관리하고자 노력한다. 우리 모임은 특히 초기에 상우형의 자본과 노력이 없었으면 유지되지 않았을 것이다.

모임 초기부터 유지하는 것이 있는데, 모든 회원들의 게임 점수를 기록해서, 이걸 개인 포인트로 환산하는 시스템이 있다. 상우 형은 점수·상대·참여도를 반영하여 회원마다 포인ㅌ트를 부여하고, 매 시즌마다 상위 랭커에게 라켓이나 상품권 같은 상품이 주어진다.

우리 RV 배드민턴만의 특별한 차별점이고, 회원들은 1등을 차지하기 위해서 매 정모마다 엄청난 열정을 보인다.

그런데 기록을 남기고 순위를 계산하는 방식은 한동안 꽤 불편했다.


단톡방으로는 부족했던 것들

1년 전만 하더라도, 정모 중에 한 게임이 끝날 때마다 선수들은 결과를 카카오톡 단톡방에 입력했다. 다른 모든 대화가 오가는 그 카톡방에, 정모마다 모두가 모여 게임 기록을 했다.

김상우 이소현 백태민 김기주 21 19

하루가 끝나면 상우님은 몇 시간치 메시지를 거슬러 올라가며 메세지를 복사하고, 오타를 고치고, 형식을 조금씩 틀리게 쓴 사람의 기록을 바로잡은 다음, 전부 본인의 C# 애플리케이션에 붙여 넣었다. 프로그램은 누적된 데이터를 계산해 상우님의 점수 체계를 적용하고 리더보드를 뽑아냈다.

이것이 파이프라인의 전부였다. 사람이 메시지를 읽어 옮기고, 한 대의 노트북에서 직접 만든 데스크톱 앱을 돌렸다. 이 방식은 상우 형이 매주 시간을 들였기 때문에 유지될 수 있었다.

단톡방과 C# 프로그램만으로도 사실 운영은 됐다. 다만 그 2년 동안 매주 같은 불편이 반복됐다.

불편 1: 수동적인 알고리즘. 상우 형의 C# 시스템에는 리그 포인트, 승패 가중치 등등으로 점수를 계산하는 알고리즘이 있었다. 하지만 상우 형이 직접 돌려야 했다. 카톡 메세지를 복사하고, 형식에서 벗어나거나 사람 이름에 대한 오타는 상우 형이 고치고, 엑셀 파일로 포맷하는 방식이다. 심지어 그 알고리즘은 돌릴때마다 모임 첫 게임부터 다시 계산되는 알고리즘이었다. 메시지를 읽고, 해석하고, 정리해 입력하는 일에는 시간과 집중력이 들었다.

불편 2: 리더보드는 늘 몇 시간 늦었다. 정모 중에는 모두가 깜깜이 상태로 경기를 했다. 상우님이 하루가 끝나고, 혹은 그보다 더 늦게 프로그램을 돌리기 전까지는 자기 위치를 알 수 없었다. 정모가 끝나고 뒤풀이 인원끼리 술자리에서 떠들다가 자정 즈음에 누군가가 “점수 올라왔다” 하면 다들 공지를 읽으며 자기의 점수와 순위를 확인했다.

불편 3: 쉬는 사람까지 알림에 파묻혔다. 게임 결과는 모든 클럽 회원이 들어 있는 바로 그 단톡방에 입력되었다. 그날 경기하지 않은 회원까지 포함해서 말이다. 한 주 쉬어도 경기가 끝날 때마다 휴대폰이 쉰 번씩 울렸다. 좋게 말해도 유쾌한 경험은 아니었다. 사람들이 채팅방을 음소거하기 시작했고, 그 결과 정작 중요한 공지까지 놓치게 되었다.

불편 4: 데이터 접근성의 부족. “오늘 나 몇 게임 쳤지?” 같은 단순한 의문을 해결하기 위해서는 채팅을 거슬러 올라가서 하나하나 세어야 한다. “이번 시즌에 누구랑 제일 많이 파트너 했지?” 알 수 없다. “석 달 전보다 내가 나아지고 있나?” 이 또한 알기 어렵다. 질 좋은 데이터가 채팅 기록 내에서 천천히 누적되고 있었고, 상우형이 그걸 엑셀 파일로 관리까지 했지만, 일반 회원들에게 그 데이터의 접근은 쉽지 않았다.


그래서 내가 앱을 만들기로 했다

상우 형한테 이렇게 제안했다. 규칙은 정해 주세요. 기록하고 계산하고 보여주는 일은 제가 앱으로 만들겠습니다. 경기 결과는 바로 입력하고, 점수는 자동으로 계산하고, 리더보드를 정모 중에도 실시간으로 볼 수 있게 하자. 기록 알림은 단톡방을 도배하지 않고 게임을 친 사람한테만 보내자.

상우님은 좋다고 했다.

RV Badminton 회원 로그인 화면

한 달짜리 pet project는 18개월의 개발로 이어졌다. 계획했던 일은 아니었다. 그래도 정모 중에 회원이 자신의 기록을 확인하는 모습을 볼 때면 계속 손볼 이유가 분명해졌다.

지금 RV Badminton에는 약 1000개 넘는 커밋, 세 언어로 만든 네 개의 서비스, 배포 런북, 그리고 오류를 바로 알려 줄 실제 사용자가 있다. 회원들이 불편한 점이 생길 때마다 하나씩 고쳤고, 그 결과가 지금의 구성이다.


모바일 앱의 효과

앱을 만들고 가장 먼저 달라진 것은 경기의 흐름이었다. 경기 결과를 휴대폰에서 바로 입력하면 점수가 자동으로 계산되고, 리더보드에도 곧바로 반영된다. 정모가 끝난 뒤 공지를 기다리던 대신, 회원들은 경기 중에도 자신의 순위와 변화를 확인할 수 있게 됐다.

RV Badminton 매치 기록 화면

경기 결과를 구조화된 화면에서 바로 기록한다. 선수 이름은 프라이버시를 위해 모자이크 처리했다.

수작업 정산도 크게 줄었다. 채팅 메시지를 복사하고 오타를 고쳐 프로그램에 다시 넣던 일을, 참석한 회원이 직접 남기는 경기 기록과 자동 계산이 대신한다. 알림 역시 모든 회원에게 쏟아지는 단톡방 메시지 대신, 경기에 참여한 사람에게 필요한 내용만 전달한다.

개인 기록을 찾아보기 쉬워진 점도 크다. 회원들은 참여한 경기, 승률, 포인트 변화와 시즌별 기록을 앱에서 직접 확인한다. 예전처럼 채팅을 한참 뒤져서 경기 수를 세거나, 운영진에게 물어볼 필요가 없다.

RV Badminton 커뮤니티 게시판

점수 기록과 별도로, 공지와 회원들의 대화를 위한 커뮤니티 공간도 마련했다.

단톡방도 본래의 역할에 더 집중할 수 있게 됐다. 매치 결과와 랭킹 업데이트는 앱에서 처리하고, 공지·사진·중고 거래·건의처럼 대화가 필요한 일은 앱의 커뮤니티에서 이어진다.

이 효과를 위해 회원용 Flutter 앱, 기록과 인증을 처리하는 Spring Boot 서버, 운영진용 대시보드, 점수 계산 서비스가 함께 동작한다. 기술을 나누는 것이 목적은 아니었다. 회원이 기록하고 확인하는 과정은 단순하게, 운영에 필요한 일은 자동으로 만들기 위한 구성이다.

프로젝트의 현재

RV Badminton은 프로덕션에서 라이브로 운영 중이며, 클럽이 정기적으로 사용하고 있다. 최근 작업은 기능에서 벗어나 실제 시스템을 살아 있게 유지하는 쪽으로 옮겨갔다. 자동 HTTPS 리버스 프록시 뒤의 새 클라우드 서버로 전체 스택을 이전하는 작업(데이터를 보존하는 신중한 런북과 함께), 중앙 집중식 로깅 연결, Java와 Python 서비스가 공유하는 단일 설정 소스로의 통합, 그리고 엔드투엔드 UI 테스트 추가 같은 것들이다.

아직 거친 부분도 있다. 테스트 커버리지는 고르지 않고, 자동화된 CI/CD와 완전한 API 문서는 남은 과제다. 정리되지 않은 레거시 백엔드도 있다. 실사용자에게 먼저 배포하기로 한 프로젝트에 남는 부채이며, 이후 글에서 줄여 가는 과정을 다룰 예정이다.


RV Badminton은 거창한 아이디어에서 시작하지 않았다. 단톡방을 뒤져 점수를 세고, 순위를 기다리고, 기록을 찾지 않아도 됐으면 했다. 그 불편을 고치려고 내가 직접 앱을 만들었고, 지금은 내가 가장 오래 운영해 본 서비스가 됐다.


Back to top

Copyright © 2017-2026 Patrick Marsceill and Just the Docs contributors. Distributed by an MIT license.