우동체 제작기 #1 — 복싱하는 개발자가 동네 복싱 커뮤니티를 만든 1년

2026-11-02 11:00:00

복싱을 배우다 보면 체육관 밖으로 나가고 싶어지는 순간이 온다. 다른 체육관 사람과 스파링을 해보고 싶고, 동네에 어떤 체육관이 있는지 비교해 보고 싶고, 오늘 친 스파링 영상을 누군가에게 보여주고 피드백을 받고 싶다. 그런데 이걸 한 번에 할 수 있는 곳이 없었다. 체육관 정보는 지도 앱에, 스파링 구인은 카페 게시판에, 영상은 각자 인스타그램에 흩어져 있었다.

그래서 만든 게 우리동네체육관(우동체)이다. 복싱 체육관을 찾고, 동네 복서와 스파링을 잡고, 스파링 영상을 올려 피드백을 주고받는 복싱 전용 커뮤니티다. 이 카테고리 우동체 제작기에는 그걸 만들면서 겪은 일들을 적는다. 첫 글은 전체 그림이다.

커밋 로그로 본 1년

git log를 월별로 세어 보면 이 프로젝트의 리듬이 그대로 보인다.

기간커밋 수그때 한 일
2025-0830MVP 뼈대 — 관장/관원 기능, Drizzle + 인증 세팅
2025-0997지도 검색, 입점 신청, 관원 CSV 업로드
2025-10 ~ 12125초대 링크, 채팅, 카카오 인앱 로그인, 본인인증(KG이니시스)
2026-01 ~ 04144체육관 데이터 크롤러, 스파링 매칭, 대회 크롤러, 게시판 구조 개편
2026-05 ~ 0687이벤트 계측(PostHog), 가입 유도, 스파링 로그, 계급 시스템
2026-07224영상 업로드 tus 전환, 운영 DB 사고 대응, 알림·팔로우
2026-08 ~ 09357피드 구조 통합, 복싱 용품 리뷰, 홈 개편, 출석 푸시
2026-10347용품 장비창, 영상 타임스탬프 댓글, 게시글 투표, 복싱 커리어 게임

dev 브랜치 기준 커밋 1,260개, 커밋이 있었던 날은 245일. 처음 몇 달은 기능을 "있게" 만드는 시기였고, 2026년 여름부터는 실제 사용자가 생기면서 커밋이 폭발했다. 사람이 쓰기 시작하면 고칠 게 기하급수로 늘어난다는 걸 숫자로 확인한 셈이다.

무엇을 어떤 순서로 붙였나

돌아보면 순서에 이유가 있었다.

  1. 체육관 정보가 먼저다. 아무도 없는 커뮤니티에 들어올 이유는 없다. 그래서 공공데이터로 전국 복싱 체육관 2,400여 곳을 먼저 깔고, 지도에서 찾을 수 있게 했다. 체육관 상세 페이지는 지금도 검색 유입의 대부분을 차지한다.
  2. 관장님 도구. 출석, 회원 관리, 공지, 체육관 단체 채팅. 체육관 하나가 들어오면 관원들이 같이 들어온다.
  3. 스파링. 동네 복서 찾기, 매칭 일정 잡기, 노쇼 처리, 그리고 스파링 영상을 올리는 "스파링 로그".
  4. 다시 오게 만드는 장치. 계급, 활동 뱃지, 팔로우, 출석 기반 푸시, 용품 리뷰.

스택

  • 웹: Next.js(App Router) + React, React Query, Jotai, Tailwind
  • DB: Supabase Postgres + Drizzle ORM (마이그레이션 SQL 39개)
  • 미디어: 이미지는 Cloudflare R2, 영상은 Cloudflare Stream
  • 앱: Expo(React Native) 웹뷰 앱 — iOS/Android 스토어 출시
  • 분석: PostHog, 검색은 네이버 서치어드바이저 + 구글 서치 콘솔
  • 배포: Vercel (서울 리전)

API 라우트가 242개, 소스 16만 줄 정도 된다. 혼자 만든 서비스치고는 꽤 크다.

AI와 같이 만들었다

숨길 이유가 없으니 적어둔다. dev 커밋 1,260개 중 636개에 Co-Authored-By: Claude 줄이 붙어 있다. 절반이다. 2026년 여름부터는 거의 모든 작업을 Claude Code와 짝 프로그래밍으로 했다.

체감상 바뀐 건 "코드를 치는 시간"보다 "원인을 끝까지 파는 시간" 이다. 예전 같으면 증상만 막고 넘어갔을 버그를, 이제는 커밋 메시지에 원인과 재발 방지책까지 적고 넘어간다. 다음 글들이 대부분 그런 기록이다.

다음 글

우동체는 wdcboxing.com에서, 인스타그램은 @wdc_boxing에서 볼 수 있다.