현대인에게 가장 어려운 질문 중 하나는 단연 "오늘 점심 뭐 먹지?"일 것입니다. 너무나 많은 선택지는 때로 '결정 마비(Decision Paralysis)'를 일으키며, 소중한 휴식 시간을 메뉴 고르는 데 허비하게 만듭니다. eleslog.work의 점심 룰렛 기능은 단순한 오락거리를 넘어,
이러한 인지적 부담을 기술적으로 해결하려는 시도에서 시작되었습니다.
하지만 단순히 리스트에서 무작위로 하나를 뽑는 '랜덤' 방식만으로는 사용자의 기대를 충족시킬 수 없습니다. 비 오는 날 시원한 냉면을 추천하거나, 어제 먹은 제육볶음을 오늘 또 추천한다면 알고리즘은 신뢰를 잃기 때문입니다. 오늘은 사용자 만족도를 극대화하기 위해 적용된 지능형 추천 로직의 이면을 상세히 공개합니다.
1. 단순 랜덤을 넘어선 '가중치 기반 추천(Weighted Random)'
추천 시스템의 첫 번째 과제는 '맥락(Context)'을 이해하는 것입니다. 인간의 식생활은 시간대와 밀접하게 연결되어 있습니다. 아침에는 소화가 잘되는 가벼운 음식을, 점심에는 에너지를 낼 수 있는 정식을, 저녁에는 하루를 마무리하는 든든한 요리를 선호합니다.
우리는 이를 위해 시간대별 가중치 시스템(Time-slot Weighting)을 도입했습니다. 현재 시간을 분석하여 특정 카테고리의 당첨 확률을 실시간으로 조정하는 방식입니다.
- 08:00 ~ 10:00: 샌드위치, 샐러드, 죽 등의 가중치 +2.0
- 11:30 ~ 13:30: 백반, 돈까스, 짜장면 등의 가중치 +1.5
- 21:00 ~ 01:00: 치킨, 족발, 피자 등 야식 카테고리 가중치 +3.0
이러한 가중치 설계는 사용자가 "어떻게 내 마음을 알았지?"라는 긍정적인 놀라움을 경험하게 만드는 첫 번째 단계입니다.
2. LRU(Least Recently Used) 알고리즘의 창의적 응용
컴퓨터 공학에서 캐시 교체 알고리즘으로 쓰이는 LRU(최근 최소 사용) 개념은 메뉴 추천에도 훌륭하게 적용됩니다. 아무리 맛있는 메뉴라도 반복적으로 노출되면 사용자는 지루함을 느끼고 서비스 이용을 중단하게 됩니다.
우리는 사용자가 최종 선택한 메뉴를 브라우저의 로컬 스토리지(LocalStorage)나 세션에 Queue(큐) 구조로 저장합니다. 이후 새로운 메뉴를 추천할 때, 이 큐에 담긴 '최근 먹은 음식' 리스트를 참조하여 필터링하거나 가중치를 대폭 낮춥니다.
// 최근 선택 메뉴 제외 및 필터링 로직
const MAX_HISTORY_SIZE = 5; // 최근 5회분 기억
const recentHistory = getRecentHistory(); // ['제육볶음', '짬뽕', ...]
// 전체 메뉴에서 최근 이력을 제외한 후보군 생성
const candidates = allMenus.filter(menu => {
return !recentHistory.includes(menu.name);
});
// 만약 후보군이 너무 적다면 가중치를 낮추어 포함
const finalPick = weightedRandomSelect(candidates.length > 0 ? candidates : allMenus);
이 기법을 통해 "맨날 나오던 것만 나와"라는 사용자 불만을 원천적으로 차단하고, 매번 새로운 미식의 경험을 제안할 수 있게 되었습니다.
3. 외부 환경 데이터 연동: 기상 조건(Weather API)
음식은 감성적인 영역입니다. 외부 날씨는 인간의 식욕에 지대한 영향을 미칩니다. 습도가 높고 비가 오는 날에는 따뜻한 국물이나 기름진 전 요리가, 폭염이 쏟아지는 날에는 시원한 면 요리가 끌리는 것은 과학적인 현상에 가깝습니다.
eleslog.work의 추천 엔진은 OpenWeatherMap API와 연동되어 작동합니다. 사용자가 추천 버튼을 누르는 순간, 현재 위치의 날씨 상태를 파악하여 추천 파라미터에 즉각 반영합니다.
날씨에 따른 알고리즘 변화 예시
- 강수 확률 70% 이상: 칼국수, 수제비, 부침개 메뉴군 가중치 상향 조정
- 기온 30도 이상: 냉면, 모밀, 막국수 등 'Cold' 태그 메뉴 우선 노출
- 기온 영하권: 국밥, 찌개, 전골류 등 'Warm' 태그 메뉴 강조
이처럼 데이터 기반의 '공감'을 제공함으로써, 추천 시스템은 단순한 도구를 넘어 사용자의 일상을 이해하는 파트너로 진화합니다.
4. UX의 완성: 시각적 긴장감과 피드백
알고리즘만큼 중요한 것이 이를 전달하는 방식(UX)입니다. 결과가 0.1초 만에 바로 뜨는 것보다, 룰렛이 돌아가며 긴장감을 조성하는 '딜레이의 미학'이 필요합니다. 우리는 캔버스 애니메이션을 활용해 물리적인 회전 효과를 구현했으며, 결과가 나올 때 화려한 파티클 효과를 주어 '선택의 즐거움'을 배가시켰습니다.
추천 결과가 맘에 들지 않을 때를 대비한 '한 번 더!' 기능은 필수입니다. 이때 알고리즘은 이전 결과를 제외하고 더욱 정교한 2차 후보군을 추출하여 제공합니다.
마치며: 기술로 해결하는 일상의 작은 문제
기술의 가치는 거창한 담론에만 있지 않습니다. 점심 메뉴를 고르는 5분의 고민을 10초로 줄여주고, 그 과정에서 소소한 재미를 줄 수 있다면 그것만으로도 훌륭한 소프트웨어라고 믿습니다.
eleslog.work는 앞으로도 단순한 기능을 넘어 사용자 데이터 분석을 통한 개인화 추천(Personalized Recommendation) 기능을 강화할 예정입니다. 여러분의 소중한 식사 시간이 더욱 즐거워질 수 있도록 알고리즘은 지금 이 순간에도 진화하고 있습니다.
오늘의 추천 결과가 궁금하신가요? 지금 바로 점심 룰렛을 돌려보세요!