# 매장 예약 · 동작 규칙

[EDR의 데이터 구조](/design/reservation/edr/)를 바탕으로 예약 화면의 조건과 동작을 정리한 **BDR 설계 예시**입니다. 규칙마다 정상 흐름, 예외, 확인 기준을 연결합니다.

## S01 · 사용자 흐름

예약 시트 열기 → 날짜 선택 → 인원 선택 → 시간 선택 → 완료 콜백 → 시트 닫힘.

이 문서는 `ReservationSheet`의 현재 화면 동작을 설명합니다. 결제, 예약 확정, 중복 예약 방지, 취소 정책은 구현 근거가 없는 별도의 업무 범위입니다.

| 규칙 | 목적 | 데이터 | 확인 기준 |
| --- | --- | --- | --- |
| B001 | 새 예약 선택을 초기화 | [E03](/design/reservation/edr/#e03) | [V01](/design/reservation/verification/#v01) |
| B002 | 방문 날짜 선택 | [E03.date](/design/reservation/edr/#e03) | [V02](/design/reservation/verification/#v02) |
| B003 | 인원 선택 범위 유지 | [E03.party_size](/design/reservation/edr/#e03) | [V03](/design/reservation/verification/#v03) |
| B004 | 선택 가능한 시간만 허용 | [E02](/design/reservation/edr/#e02) | [V04](/design/reservation/verification/#v04) |
| B005 | 필수 선택 후 완료 처리 | [E03](/design/reservation/edr/#e03) | [V05](/design/reservation/verification/#v05) |

## B001 · 열 때마다 초기화

시트를 다시 열면 이전 입력을 이어 쓰지 않고 날짜부터 새로 선택합니다.

| 대상 | 조건 | 상태체크 | 시스템 동작 | 후처리 | 설명 |
| --- | --- | --- | --- | --- | --- |
| 예약 시트 | open이 true로 변경 | 열림 | 날짜·시간을 비우고 인원을 2로 설정 | 날짜 단계 표시 | 이전 선택값을 새 예약에 재사용하지 않음 |

| 대상 | 조건 | 에러 메시지 |
| --- | --- | --- |
| 이전 선택값 | 시트 재진입 | 메시지 없음, 초기값으로 재설정 |

데이터: [E03 예약 요청](/design/reservation/edr/#e03). 확인: [V01 초기화](/design/reservation/verification/#v01).

## B002 · 날짜 선택

달력에 최소 선택 날짜를 전달합니다. 별도 값이 없으면 현재 날짜를 사용합니다. 날짜를 선택하면 잠시 선택 결과를 보여준 뒤 인원 단계로 이동합니다.

| 대상 | 조건 | 상태체크 | 시스템 동작 | 후처리 | 설명 |
| --- | --- | --- | --- | --- | --- |
| 방문 날짜 | 달력에서 날짜 선택 | 선택 가능한 날짜 | selectedDate 갱신 | 200ms 후 인원 단계 | 날짜 선택 결과를 인지할 시간 제공 |
| 최소 날짜 | minDate 미전달 | 기본값 사용 | 현재 날짜를 달력에 전달 | 달력의 제한 동작 적용 | 서버의 영업일 검증과 별개 |

| 대상 | 조건 | 에러 메시지 |
| --- | --- | --- |
| 방문 날짜 | 달력의 최소 날짜보다 이전 | 별도 메시지 없음, 달력의 선택 제한에 위임 |

데이터: [E03.date](/design/reservation/edr/#e03). 확인: [V02 날짜 범위](/design/reservation/verification/#v02).

## B003 · 인원 범위 유지

인원은 1명부터 12명까지 선택합니다. 경계에서는 해당 방향의 버튼을 비활성화하고, 값 변경도 같은 범위로 제한합니다.

| 대상 | 조건 | 상태체크 | 시스템 동작 | 후처리 | 설명 |
| --- | --- | --- | --- | --- | --- |
| 인원 증가 | 증가 버튼 누르기 | 인원 < 12 | min(12, 현재 인원 + 1) | 인원 표시 갱신 | 최댓값 12 |
| 인원 감소 | 감소 버튼 누르기 | 인원 > 1 | max(1, 현재 인원 - 1) | 인원 표시 갱신 | 최솟값 1 |

| 대상 | 조건 | 에러 메시지 |
| --- | --- | --- |
| 인원 증가 | 현재 12명 | 메시지 없음, 증가 버튼 비활성화 |
| 인원 감소 | 현재 1명 | 메시지 없음, 감소 버튼 비활성화 |

데이터: [E03.party_size](/design/reservation/edr/#e03). 확인: [V03 경계값](/design/reservation/verification/#v03).

## B004 · 예약 시간 선택

전달된 시간 목록에서 `available`이 true인 항목을 선택할 수 있습니다. 목록이 생략되면 기본 예시 목록을 사용합니다.

| 대상 | 조건 | 상태체크 | 시스템 동작 | 후처리 | 설명 |
| --- | --- | --- | --- | --- | --- |
| 예약 시간 | 슬롯 누르기 | available = true | selectedTime 갱신 | 선택 표시 갱신 | 한 번에 한 시간 선택 |
| 선택 불가 시간 | 슬롯 표시 | available = false | disabled와 aria-disabled 적용 | 선택 차단 | 재고 수량 계산을 의미하지 않음 |

| 대상 | 조건 | 에러 메시지 |
| --- | --- | --- |
| 선택 불가 슬롯 | 선택 시도 | 메시지 없음, 선택되지 않음 |

데이터: [E02 예약 가능 시간](/design/reservation/edr/#e02), [E03.time](/design/reservation/edr/#e03). 확인: [V04 시간 선택](/design/reservation/verification/#v04).

## B005 · 선택 완료

날짜와 시간이 모두 선택되면 완료할 수 있습니다. 인원은 기본값과 증감 버튼으로 범위 안에서 관리합니다.

| 대상 | 조건 | 상태체크 | 시스템 동작 | 후처리 | 설명 |
| --- | --- | --- | --- | --- | --- |
| 완료 버튼 | 버튼 누르기 | 날짜·시간 존재 | onConfirm에 date, partySize, time 전달 | onOpenChange(false) | 시트 선택 완료 |

| 대상 | 조건 | 에러 메시지 |
| --- | --- | --- |
| 완료 버튼 | 날짜 또는 시간 미선택 | 메시지 없음, 버튼 비활성화 및 핸들러 조기 반환 |

현재 부모 화면은 콜백의 페이로드를 사용하지 않고 `onReserve()`를 호출합니다. 화면의 ‘예약 완료’ 문구는 데모의 UI 동작이며, 서버의 예약 확정 증거는 아닙니다.

데이터: [E03 예약 요청](/design/reservation/edr/#e03). 확인: [V05 콜백과 저장의 경계](/design/reservation/verification/#v05).

## S02 · 후속 설계가 필요한 범위

실제 예약 서비스로 연결하려면 날짜·인원별 수용량, 동시 예약, 서버 유효성 검사, 요청 중 상태, 실패 복구, 취소 정책을 추가로 정의해야 합니다. 이 예시에는 해당 정책을 실제 구현처럼 넣지 않았습니다.

다음 문서: [검증 · 확인 기준](/design/reservation/verification/).