SMART LOTTO 개발기 5편 — 사용자 리뷰가 기능을 만들었다

리뷰를 읽는 습관이 생긴 이유
앱을 처음 출시하고 나면 리뷰가 쌓이기 시작합니다. 별점만 남기는 경우도 많지만, 가끔 구체적인 내용을 써주는 사람이 있습니다.
그런 리뷰가 두 개 있었습니다. 둘 다 기능 요청이었고, 둘 다 반영했습니다.

첫 번째: 제외수를 넣어주세요
SMART LOTTO에는 번호 생성 조건으로 고정수를 설정하는 기능이 있었습니다. 고정수로 지정한 번호는 생성 결과에 반드시 포함됩니다. "나는 7번이 꼭 있었으면 좋겠어"라는 사람을 위한 기능입니다.
리뷰 내용은 이랬습니다.
"고정수처럼 반드시 제외되는 번호를 설정할 수 있으면 좋겠어요."
당연하게 들리지만, 처음 기획할 때 이 기능을 빠뜨렸습니다. 고정수의 반대 개념인 제외수. 지정한 번호가 결과에 절대 나오지 않게 하는 것.
구현 자체는 간단했습니다. 생성 로직에 제외 조건 하나를 추가하면 됐습니다.
var candidates = Array(1...45)
.filter { !excludedNumbers.contains($0) } // 제외수 필터링
.filter { !fixedNumbers.contains($0) } // 고정수는 별도 처리
단, 한 가지 신경 써야 할 부분이 있었습니다. 고정수와 제외수가 겹치지 않도록 하는 것.
사용자가 7번을 고정수로, 동시에 7번을 제외수로 지정하는 건 모순입니다. 그래서 고정수로 설정된 번호는 제외수로 선택이 안 되게 막고, 반대도 마찬가지로 처리했습니다. 이 부분의 UI 상태 관리가 생각보다 꼼꼼하게 챙겨야 했습니다.
두 번째: 끝수 조건을 넣어주세요
이 리뷰를 처음 읽었을 때 솔직히 "끝수가 뭐지?"라고 검색을 했습니다.
끝수란 번호의 일의 자리 숫자입니다. 예를 들어 3, 13, 23, 33, 43은 모두 끝수가 3입니다.
로또를 자주 연구하는 사람들이 분석하는 패턴 중 하나라고 합니다. "이번 회차에는 끝수 3이 2개, 끝수 7이 1개 나오게 해줘" 같은 식으로 사용합니다.
기능 자체는 어렵지 않습니다. 0부터 9까지 끝수를 선택하고, 각 끝수가 결과에 몇 번 나올지를 설정하는 UI를 만들면 됩니다. 번호 생성 시 해당 조건을 만족하도록 후보 번호를 필터링하면 끝입니다.
하지만 이 기능을 모르는 사람도 많기 때문에 UI를 직관적으로 만드는 게 더 신경 쓰였습니다.
사용자 리뷰에서 배운 것
개발자는 자기 관점에서 기획합니다. 자기가 생각하는 "필요한 기능"을 만듭니다.
하지만 실제 사용자는 개발자가 생각하지 못한 방식으로 앱을 씁니다. 고정수를 쓰는 사람이라면 제외수도 원할 수 있다는 게 너무 당연한데, 처음엔 그걸 못 봤습니다. 끝수라는 개념 자체를 몰랐으니 당연히 기획에 들어갈 수가 없었습니다.
리뷰를 읽는 게 개발자에게 얼마나 중요한지, 이 두 업데이트에서 처음 실감했습니다.
다음 편에서는 2023년 이후 앱이 오랫동안 업데이트 없이 방치된 이유와 2026년에 발견한 치명적인 버그를 이야기합니다.