핀볼 룰렛 이야기
작은 결정의 어색함을 한 번의 굴림으로 풀어내는 도구. 그 안에 담긴 의도와 사람을 소개합니다.
회식 자리의 어색한 침묵에서 시작됐습니다
저녁 6시, 사무실 한쪽에서 “오늘 뭐 먹지?” 라는 질문이 던져졌을 때 돌아오는 답은 늘 비슷했습니다. “아무거나요”, “좋은 거로요”, 그리고 침묵. 결국 가장 입김이 센 사람이 메뉴를 정하고, 누군가는 속으로 아쉬워하고, 누군가는 “그거 좋네요” 하고 적당히 맞장구를 칩니다. 회사·학교·동호회 어디든 ‘공정해 보이지만 사실은 아무도 만족하지 않는 결정’은 매일같이 일어납니다.
핀볼 룰렛은 그 어색함을 한 화면 위에 올려놓고, 모두가 함께 결과를 응원하면서 웃음 한 번으로 결정이 끝나는 경험을 만들고 싶어서 시작된 프로젝트입니다. 공이 핀에 부딪히는 모습을 함께 보고, 마지막 순간 깔때기로 떨어지는 공을 보며 “와!” 하고 같이 웃을 수 있다면, 결과가 무엇이든 그 자리는 이미 좋은 자리가 됩니다.
좋은 추첨 도구는 결과의 무작위성보다 ‘과정의 공유 가능성’이 더 중요합니다. 모두가 함께 본 결과는, 모두가 납득할 수 있는 결과가 됩니다.
네 가지 원칙으로 운영합니다
기능을 늘리는 것보다 ‘이 도구를 쓰는 사람이 안심할 수 있는가’를 먼저 고민합니다. 사용자가 불안 없이 쓸 수 있도록 다음 네 가지를 약속합니다.
왜 ‘진짜 물리 엔진’으로 만들었나
단순한 의사난수 생성기로도 결과는 충분히 무작위로 만들 수 있습니다. 하지만 ‘조작이 불가능하다는 직관’은 결과의 시각적 인과 관계가 보일 때 비로소 만들어집니다. 핀볼 룰렛은 matter.js라는 검증된 2D 물리 엔진으로 실제 핀볼의 충돌·반발·중력을 시뮬레이션합니다. 공의 작은 시작 위치 차이가 기하급수적으로 증폭되는 결정론적 카오스 시스템이라, 같은 조건에서 출발해도 매번 다른 결과가 나옵니다.
서비스 전체는 Next.js 15 App Router 위에서 React 19와 TypeScript로 빌드되며, 모든 페이지는 정적 사전 생성으로 빠른 첫 화면 로딩을 보장합니다. 데이터는 클라이언트에만 머무르고 서버로 전송되지 않습니다.
지금까지 만든 것들
1인 개발 프로젝트지만, 작은 도구라도 ‘쓰는 사람이 부끄럽지 않게’를 기준으로 꾸준히 다듬고 있습니다.
여기까지 오는 길
- 2025년 1월프로젝트 시작회식 자리에서 ‘메뉴 정하기’가 매번 어색해지는 걸 보고, 시각적으로 결과가 보이는 추첨 도구가 있으면 좋겠다는 생각에서 시작.
- 2025년 2월핀볼 룰렛 v1 출시matter.js 물리 엔진을 활용해 갈튼 보드 맵을 첫 공개. 단일 맵, 단일 모드의 미니멀 버전.
- 2025년 3월맵·장애물 확장총 6가지 맵, 9종 장애물(범퍼·포탈·자석·피스톤·바운스 패드 등) 추가로 다양한 추첨 분위기 구현.
- 2025년 4월럭키 드로우 합류번호 추첨(로또식)과 이름 추첨(카드 뒤집기) 기능 추가. 핀볼 외에도 가벼운 추첨 수요 대응.
- 현재지속 개선 중사용자 피드백을 받아 새 맵·새 모드를 꾸준히 추가하고 있습니다. 의견은 언제든 환영합니다.
피드백·제안·협업 모두 환영합니다
버그 신고든, 새 맵 아이디어든, 단순한 사용 후기든 모두 기쁘게 받습니다. 1인 개발이라 모든 의견을 직접 읽고 답장합니다. 답장은 보통 1~3일 안에 드립니다.
카카오톡 오픈채팅이 가장 빠르고, 긴 내용은 이메일이 편합니다. 서비스 안의 추가 정보는 문의 페이지에서도 확인할 수 있어요.