골프 벌칙 뽑기의 기능 목록을 소개했던 글을, 후보를 만드는 과정과 추첨·기록·공유의 차이를 설명하는 개발 기록으로 보강했습니다. 2026년 9월 20일 golf_penalty_picker.js를 확인하니 ‘중복을 피한다’, ‘기록을 저장한다’는 말을 실제 동작 범위에 맞게 설명할 필요가 있었습니다.
기본 목록과 직접 입력을 같은 형태로 만들기
기본 모드는 언어 데이터에 들어 있는 mild, fun, spicy 목록을 사용합니다. 전체를 고르면 세 목록을 합치고, 한 그룹을 고르면 그 그룹만 후보로 가져옵니다.
직접 입력 모드는 줄바꿈을 기준으로 문장을 나눈 뒤 앞뒤 공백과 빈 줄을 제거합니다. 각 줄을 tag, title, description을 가진 객체로 만들기 때문에 이후 추첨·표시 코드에서는 기본 목록과 같은 형식으로 다룰 수 있습니다.
A
B
A
현재 파싱 함수를 실행하면 위 입력의 제목 목록은 A, B, A입니다. 같은 문구를 합치지 않으므로 A는 후보 두 개로 남습니다. 같은 문구가 반복돼도 한 개로 계산될 것이라고 안내하면 구현과 맞지 않습니다.
입력 제한이 적용되는 위치
현재 직접 입력은 최대 100개 항목, 항목 제목은 JavaScript 문자열 길이 기준 100까지 사용합니다. 한도를 넘으면 안내 메시지를 설정하고 앞의 항목과 문자열을 잘라 사용합니다. 전체 요청을 거절하는 방식은 아닙니다.
실제 함수를 분리 실행해 102개 줄 입력이 100개 후보로 제한되고, 길이 101인 첫 제목이 100으로 잘리는 것을 확인했습니다. 빈 후보 배열은 추첨 함수에서 null이 되고, 후보가 하나면 그 항목을 돌려줍니다. 이 확인은 파싱·선택 함수 기준이며 모바일 키보드 입력이나 애니메이션 검증을 포함하지 않습니다.
직전 결과를 다시 뽑지 않는다는 말의 한계
난수 생성에는 사용 가능한 경우 crypto.getRandomValues()를 쓰고, 지원 여부를 확인하지 못하면 Math.random()을 사용합니다. 정수 변환 과정에서는 나머지 계산 전에 범위를 벗어난 난수를 다시 받아오는 분기가 있습니다. API의 성격은 MDN getRandomValues 문서에서 확인할 수 있습니다.
그 다음 선택 함수는 뽑힌 제목이 직전 제목과 같으면 최대 30회 다시 시도합니다. 전체 후보에서 직전 항목을 완전히 제거한 뒤 한 번 뽑는 방식은 아닙니다.
검증에서 후보를 A·B로 놓고 난수 함수가 계속 A의 위치를 돌려주게 했더니, 최초 1회와 재시도 30회 뒤에도 A가 반환됐습니다. 따라서 현재 동작은 ‘직전과 같은 제목을 줄이려는 재시도’로 설명해야 하며, 연속 중복이 절대 생기지 않는다고 보장할 수 없습니다.
| 경우 | 현재 처리 |
|---|---|
| 후보 없음 | 선택 결과 없음 |
| 후보 한 개 | 해당 후보 선택 |
| 같은 제목을 여러 줄 입력 | 여러 후보로 유지 |
| 직전과 같은 제목 선택 | 최대 30회 재시도 |
| 재시도 후에도 같은 제목 | 같은 제목이 반환될 수 있음 |
최근 기록과 영구 저장 구분
추첨 결과는 메모리의 history 배열 맨 앞에 넣고 최근 5개만 남깁니다. 이 스크립트의 기록은 새로고침 뒤 복원하는 저장소에 쓰지 않습니다. 그러므로 ‘최근 기록 표시’는 가능하지만 ‘나중에 다시 방문해도 결과가 보관된다’는 의미로 설명하면 안 됩니다.

위 이미지는 이전 소개 당시 화면입니다. 기록 보관과 재추첨 규칙은 현재 코드 설명을 기준으로 확인해 주세요.
결과 공유와 도구 주소 공유도 다릅니다
결과 복사·기본 공유 문구에는 선택된 제목과 설명, 도구의 주소가 포함됩니다. 그러나 도구 주소 자체에는 선택된 결과나 사용자 후보 목록을 다시 구성할 값이 들어가지 않습니다. 주소만 열면 같은 결과가 재현된다고 안내하지 않습니다.
카카오 공유는 SDK가 준비돼 있는지 확인하고, 준비되지 않았거나 오류가 나면 문구 복사로 전환하도록 구현돼 있습니다. 이번 검증에서 실제 메시지를 전송하지는 않았습니다. 공유 앱 실행·취소·복사 권한은 별도의 브라우저 점검 항목입니다.
도구 사용 화면은 골프 벌칙 뽑기에서 확인할 수 있습니다. 여러 추첨 사이에 사용한 값을 제외하는 별도 방식은 랜덤 숫자의 후보·중복 관리 기록에서 비교했습니다.
댓글 0
로그인 없이 궁금한 점이나 의견을 남겨주세요.
아직 댓글이 없습니다. 첫 의견을 남겨주세요.