commits

경마 자동선택 토글 — JSONB로 크로스서버 설정 영구화

R
이더
2026. 05. 28. AM 01:32 · 3 min read · 0

🤖 3232 in / 1332 out / 4564 total tokens

경마 게임에서 매번 탈것 고르기 귀찮아서 자동선택 토글을 달았다. 로그인 유저만 볼 수 있고, 설정은 DB에 영구 저장해서 어느 서버든 같은 값이 적용된다.

변경 핵심은 users 테이블에 prefs JSONB DEFAULT '{}'::b 컬럼을 추가한 것. JSONB를 쓴 이유는 자동선택 토글 하나 따로 컬럼 파면 나중에 설정 늘어날 때마다 ALTER를 계속 돌려야 하니까. 키-밸류 구조로 넣어두면 b_set으로 부분 업데이트만 하면 끝이다. 게임 서버 아키텍처에서 플레이어 설정 유지하는 방식이랑 동일한 사고방식이다 — UE5에서도 SaveGame 객체에 플레이어 프리퍼런스 JSON으로 들고 있는 것과 같은 패턴.

서버 쪽은 db/auth.jsgetUserPrefssetUserPref 두 함수 추가. setUserPrefUPDATE users SET prefs = b_set(COALESCE(prefs, '{}'::b), $1, $2) WHERE name = $3 쿼리 하나로 끝. 소켓 핸들러는 checkRateLimit 걸고 실패해도 조용히 무시하는 패턴으로 구현.

클라이언트는 autoSelectHorseEnabled 불리언 하나와 autoSelectAttempted 플래그로 제어. availableHorses 도착 시 딱 한 번만 Math.random()으로 인덱스 골라서 selectHorse() 호출. 방마다 리셋해야 해서 horseRaceEnded에서 autoSelectAttempted = false로 초기화. 동점자 자동준비 라운드도 같은 이벤트 타서 자연스럽게 대응된다.

CSS는 토글 스위치 커스텀 스타일이 대부분이고, HTML은 기존 단일 divhorse-selection-header flex 컨테이너로 감싸는 정도.

작업하다가 data.name을 서버가 그대로 신뢰하는 보안 결함을 발견해서 security.md에 S-1 레슨으로 기록. 악의적 클라가 다른 유저 이름 넣어서 emit하면 타인 설정 변경 가능한 치명적 구멍이다. 다음 PR에서 일괄 교정 예정.

JSONB 컬럼 하나로 크로스서버 설정 동기화 — 나중에 설정 늘어나도 스키마 마이그레이션 없이 b_set 한 줄이면 끝.

← 이전 글
경마 탈것 자동선택 토글 — JSONB로 크로스서버 설정 영구화하기
다음 글 →
AI 업데이트: 에이전트의 실세계 침투와 API 아키텍처의 승리