예약 서비스에서 고객이 가장 먼저 보는 화면은 "오늘 몇 시에 예약할 수 있나요?"에 대한 시간 목록입니다.
화면만 보면 버튼 몇 개가 나열된 단순한 UI인데, 그 버튼이 어떻게 만들어지는지 따져보면 꽤 많은 규칙이 숨어 있어요.
예약 시스템 기획을 하면서 이 부분을 정리하다 보니, 기획서에서 가장 자주 수정되는 곳이 바로 여기였습니다.
그래서 이번 글에서는 예약 가능 시간을 계산할 때 어떤 입력 값이 필요하고, 어떤 예외가 생기는지 제가 정리한 순서대로 적어보려고 합니다.
예약 가능 시간을 계산할 때 저는 "열려 있는 시간을 찾는다"보다 "닫혀 있는 시간을 하나씩 빼나간다"로 생각하는 쪽이 편했어요.
하루 24시간에서 시작해서, 영업하지 않는 시간, 쉬는 시간, 이미 예약된 시간, 휴무일을 차례로 지워나가면 남는 구간이 예약 가능한 후보가 됩니다.
이렇게 생각하면 새로운 규칙이 생겨도 "빼는 항목이 하나 늘었다"로 정리돼서 기획서도 덜 복잡해져요.
예를 들어 가상의 미용실 하나를 놓고 보겠습니다.
영업시간은 10:00부터 20:00까지이고, 13:00부터 14:00까지는 브레이크타임이라고 해볼게요.
이 업장의 하루는 10:00~13:00, 14:00~20:00 두 덩어리로 나뉩니다.
여기까지가 가장 기본적인 "영업 구간"입니다.
처음엔 영업시간, 브레이크타임, 휴무를 모두 "쉬는 시간"으로 묶어서 생각했는데, 실제로는 층이 달랐어요.
영업시간은 요일마다 반복되는 기본 규칙이고, 브레이크타임은 그 기본 규칙 안에서 빠지는 구간입니다.
임시 휴무는 이 모든 것보다 우선하는 예외이고요.
그래서 우선순위를 이렇게 정해두면 좋았습니다.
1순위는 특정 날짜에 지정된 예외(임시 휴무, 특별 영업시간), 2순위는 요일별 기본 영업시간, 3순위는 매일 반복되는 브레이크타임입니다.
예를 들어 "매주 월요일은 휴무"인데 "이번 월요일은 공휴일이라 특별히 영업"이라면, 특정 날짜 예외가 요일 규칙을 이겨야 하죠.
이 우선순위를 기획서에 적어두지 않으면, 개발 단계에서 "그럼 어느 쪽이 맞아요?"라는 질문이 반드시 나옵니다.
영업 구간이 정해졌다면 다음은 "이 서비스가 몇 분 걸리는가"입니다.
여기서 헷갈리기 쉬운 게 서비스 시간과 정리 시간이에요.
가상의 예로, 커트는 40분이 걸리고 끝난 뒤 도구 정리와 자리 정돈에 10분이 필요하다고 해볼게요.
고객이 보는 소요시간은 40분이지만, 업장이 다음 손님을 받을 수 있는 시점은 50분 뒤입니다.
그래서 저는 시간을 두 개로 나눠서 적기로 했습니다.
하나는 고객에게 보여주는 "서비스 시간", 다른 하나는 업장 내부 기준의 "버퍼 시간"이에요.
버퍼는 서비스 앞에 붙는 준비 시간일 수도 있고 뒤에 붙는 정리 시간일 수도 있어서, 앞뒤를 따로 둘지도 미리 정해야 합니다.
처음 버전에서는 뒤에만 붙이는 단순한 형태로 가는 것도 방법이라고 생각했어요.
그리고 한 가지 더 정해야 할 것이 있습니다.
영업 종료 시각이 20:00일 때, 마지막 예약은 정리 시간까지 포함해서 20:00 안에 끝나야 하는지, 서비스만 끝나면 되는지입니다.
이건 업장마다 답이 다를 수 있어서, 설정 항목으로 열어둘지 정책으로 고정할지가 기획 판단이 됩니다.
고객에게 보여주는 시작 시간 목록은 "슬롯 간격"에 따라 달라집니다.
슬롯 간격이 30분이면 10:00, 10:30, 11:00처럼 30분 단위로만 시작할 수 있고, 15분이면 더 촘촘한 목록이 나옵니다.
간격을 짧게 하면 선택지가 늘지만, 업장 입장에서는 빈 시간이 조각조각 남는 문제가 생길 수 있어요.
이제 앞의 예시로 계산을 해보겠습니다.
슬롯 간격 30분, 서비스 40분, 버퍼 10분(총 50분 점유)이라고 하면 12:30에 시작하는 예약은 13:20에 끝나서 브레이크타임(13:00)을 침범하므로 목록에서 빠집니다.
12:00에 시작하면 12:50에 끝나니까 가능합니다.
오후 구간에서는 영업 종료 20:00에서 50분을 빼면 19:10이 마지막 시작 한계이고, 30분 간격이라 마지막 슬롯은 19:00이 됩니다.
이렇게 숫자로 한 번 풀어보면 "왜 12:30은 안 보이죠?"라는 운영자 문의에 설명할 근거가 생겨요.
기본 계산이 끝나도, 기획서에서 따로 목록으로 남겨야 하는 예외가 있습니다.
제가 정리한 예외는 이런 것들이에요.
첫째, 이미 예약된 시간은 자원(직원, 룸) 단위로 겹치는지 봐야 합니다.
직원이 두 명이면 같은 시간에 두 건이 가능하지만, 직원이 한 명이면 한 건뿐이니까요.
둘째, 당일 예약의 최소 사전 시간입니다.
지금이 14:05인데 14:30 슬롯을 보여주면, 고객이 도착하지 못하겠죠.
"현재 시각 기준 최소 N분 뒤부터"라는 규칙이 필요합니다.
셋째, 예약 가능한 최대 기간입니다.
"오늘부터 60일 뒤까지만 열기" 같은 제한이 없으면 먼 미래의 날짜까지 열려서 운영 부담이 생겨요.
넷째, 휴무일에 이미 들어와 있는 예약을 어떻게 할지입니다.
임시 휴무를 지정했는데 그 날짜에 예약이 있다면 자동 취소할지, 경고만 보여줄지 정해야 해요.
다섯째, 일정 중간에 영업시간을 바꾸는 경우입니다.
이미 확정된 예약은 유지하고 앞으로 들어오는 예약부터 새 규칙을 적용하는 쪽이 안전하다고 생각합니다.
이 규칙들을 줄글로만 쓰면 읽는 사람이 매번 다시 계산해야 해서, 저는 세 가지 형태로 나눠 적고 있습니다.
먼저 입력 값 목록입니다.
영업시간, 브레이크타임, 휴무, 서비스 시간, 버퍼, 슬롯 간격, 최소 사전 시간, 최대 예약 기간을 이름과 단위와 함께 적어요.
그다음은 계산 순서입니다.
"영업 구간 구하기, 브레이크 빼기, 예외 날짜 반영, 기존 예약 빼기, 슬롯 간격에 맞춰 후보 만들기, 서비스 점유 시간이 들어가는지 확인하기"처럼 번호를 붙여 적습니다.
마지막이 예시 표입니다.
위의 미용실 예처럼 입력과 결과를 몇 개 케이스로 적어두면 개발자도, 테스트하는 분도 같은 기준으로 확인할 수 있어요.
정리하자면, 예약 가능 시간 계산은 결국 "무엇을 어떤 순서로 빼는가"를 정확히 말로 옮기는 일이라는 생각이 듭니다.
규칙 하나하나는 어렵지 않은데, 순서와 우선순위를 적지 않으면 서로 다른 머릿속 그림이 만들어져요.
아직 정리하지 못한 질문도 있습니다.
한 서비스가 두 개의 자원을 동시에 써야 할 때, 예컨대 직원 한 명과 룸 하나가 함께 필요할 때는 계산이 어떻게 달라질까 하는 부분이에요.
이건 앞서 정리했던 서비스와 자원의 연결 방식과 이어서 더 따져보려고 합니다.
'Planning · PM > 서비스 기획' 카테고리의 다른 글
| 예약 시스템의 핵심 도메인 모델, 업장, 서비스, 자원, 슬롯 (0) | 2023.04.16 |
|---|---|
| 멀티테넌트란, 기획자가 알아야 할 데이터 격리 수준 (0) | 2023.03.06 |
| 테넌트 구조 예약 시스템, 기획을 시작하며 정리한 용어들 (0) | 2023.02.28 |
| 챗봇 vs 콜센터, 고객 응대 채널 전환 기준 (0) | 2020.08.09 |
| Kakao TOROS (0) | 2017.12.10 |