공개된 매장 예약 UI를 바탕으로 정리한 EDR 설계 예시입니다. 예약에 필요한 데이터의 의미와 제약을 먼저 정의하고, BDR의 동작 규칙과 연결합니다.
S01 · 설계 범위
이 예시는 매장 정보, 선택 가능한 시간, 사용자가 작성하는 예약 요청을 다룹니다. 실제 데이터베이스 설계서나 예약 서비스의 운영 증명이 아닙니다. 구현 근거는 공개 디자인 시스템의 ShopDetailData, ShopReservationSlot, ReservationConfirmPayload입니다.
naming_profile: modern-default — 문서의 논리 필드는 snake_case를 사용하고, 실제 TypeScript 필드와의 대응을 별도로 남깁니다. 영속 저장소와 API는 이 예시의 범위 밖입니다.
| 데이터 | 의미 | 연결 |
|---|---|---|
| E01 매장 | 예약 흐름을 시작하는 매장의 식별 정보 | E02의 시간 목록을 제공 |
| E02 예약 가능 시간 | 한 매장 화면에서 제시하는 시간과 선택 가능 여부 | E03의 시간 선택에 사용 |
| E03 예약 요청 | 사용자가 선택한 날짜·인원·시간 | 완료 시 콜백에 전달 |
E01 · 매장
매장 화면의 예약 맥락입니다. 화면 데이터의 일부만 발췌했습니다. 예시 매장명과 식별자는 설명을 위한 가상 값입니다.
| 항목(ko) | 항목(en) | 폼 필수값 | 데이터 타입 | 입력 방식 | 옵션 값 | 설명 | 제약사항 | 예시 | 검색 | 정렬 | 역할 | 개념 URI | 관계 | 상위 개념 |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 매장 식별자 | shop_id | 해당 없음 | string | 화면 데이터 | — | 매장을 식별하는 값 | 타입상 필수, 고유성은 저장소 검증 범위 밖 | demo-shop-01 | 미구현 | 미구현 | 식별 | urn:junforge:example:shop:id | E02의 매장 맥락 | 매장 |
| 매장명 | name | 해당 없음 | string | 화면 데이터 | — | 사용자에게 표시하는 매장명 | 타입상 필수 | 예시 식당 | 미구현 | 미구현 | 명칭 | urn:junforge:example:shop:name | — | 매장 |
| 예약 시간 목록 | reservation_slots | 선택 | E02[] | 화면 데이터 | — | 매장 화면이 제공하는 시간 목록 | 생략 시 시트의 기본 목록 사용 | 17:00, 17:30 | 해당 없음 | 전달 순서 | 관계 | urn:junforge:example:shop:slots | E01 → E02 | 매장 |
연결 규칙: B001 초기화, B004 시간 선택.
E02 · 예약 가능 시간
하나의 시간 문자열과 선택 가능 여부를 묶습니다. 현재 타입에는 날짜별 재고, 잔여 좌석, 인원별 수용량이 없습니다. available은 화면에 전달된 선택 가능 여부이며 실시간 잔여 좌석을 뜻하지 않습니다.
| 항목(ko) | 항목(en) | 폼 필수값 | 데이터 타입 | 입력 방식 | 옵션 값 | 설명 | 제약사항 | 예시 | 검색 | 정렬 | 역할 | 개념 URI | 관계 | 상위 개념 |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 시간 | time | 필수 | string | 슬롯 데이터 | 전달 목록 | 표시와 선택에 사용하는 시간 | 기본 예시는 HH:mm, 형식 검사 미구현 | 17:00 | 해당 없음 | 전달 순서 | 속성 | urn:junforge:example:slot:time | E03.time의 선택 후보 | 예약 가능 시간 |
| 선택 가능 여부 | available | 필수 | boolean | 슬롯 데이터 | true / false | 해당 시간을 선택할 수 있는지 표시 | false이면 버튼 비활성화 | true | 해당 없음 | 해당 없음 | 상태 | urn:junforge:example:slot:available | B004 | 예약 가능 시간 |
연결 규칙: B004 선택 불가 시간 처리. 확인 기준: V04 시간 선택.
E03 · 예약 요청
사용자가 선택한 값을 전달하기 위한 논리 모델입니다. 작성 중에는 날짜와 시간이 비어 있을 수 있고, 완료 콜백에는 세 값이 함께 전달됩니다. 예약 번호나 서버 저장 상태를 포함하지 않습니다.
| 항목(ko) | 항목(en) | 폼 필수값 | 데이터 타입 | 입력 방식 | 옵션 값 | 설명 | 제약사항 | 예시 | 검색 | 정렬 | 역할 | 개념 URI | 관계 | 상위 개념 |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 방문 날짜 | date | 필수 | Date | 날짜 선택 | minDate 이후 선택 | 방문 예정 날짜 | 작성 중 null 가능, 완료 시 필수 | 2026-10-01 | 해당 없음 | 해당 없음 | 속성 | urn:junforge:example:request:date | B002, B005 | 예약 요청 |
| 인원 | party_size | 필수 | number | 증감 버튼 | 1~12 | 방문 인원 | 기본값 2, UI에서 최소 1·최대 12 | 2 | 해당 없음 | 해당 없음 | 속성 | urn:junforge:example:request:party-size | B003, B005 | 예약 요청 |
| 방문 시간 | time | 필수 | string | 시간 선택 | E02 목록 | 선택한 예약 시간 | 작성 중 null 가능, 완료 시 필수 | 17:00 | 해당 없음 | 해당 없음 | 속성 | urn:junforge:example:request:time | E02.time, B004, B005 | 예약 요청 |
연결 규칙: B002 날짜, B003 인원, B005 완료.
S02 · 상태와 전이
아래 상태명은 동작을 설명하기 위한 문서 용어입니다. 데이터베이스의 예약 상태 코드가 아닙니다.
S03 · 구현 필드 대응
| 논리 필드 | TypeScript 근거 | 비고 |
|---|---|---|
| E01.shop_id | ShopDetailData.shopId | 화면 데이터 |
| E01.name | ShopDetailData.name | 화면 데이터 |
| E01.reservation_slots | ShopDetailData.reservationSlots | 선택 속성 |
| E02.time / available | ShopReservationSlot.time / available | 슬롯 속성 |
| E03.date / party_size / time | ReservationConfirmPayload.date / partySize / time | 콜백 페이로드 |
ShopDetailPage의 현재 연결은 시트의 페이로드를 사용하지 않고 onReserve()를 호출합니다. 따라서 선택값의 서버 전달·저장 완료를 이 화면만으로 판단할 수 없습니다.
다음 문서: BDR · 동작 규칙 읽기.