Skip to content

Repository files navigation

๐Ÿ‘ต ๋…ธ์ธ ํ‚ค์˜ค์Šคํฌ ์—ฐ์Šต ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜

Kiosk Practice App for Seniors โ€“ ํ–„๋ฒ„๊ฑฐ / ์นดํŽ˜ / ์˜ํ™”๊ด€ / ์‹๋‹น


๐Ÿ“‹ ๋ชฉ์ฐจ

  1. ์ดˆ๊ธฐ ์ œ์ž‘ ํ”„๋กฌํ”„ํŠธ
  2. ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๊ฐœ์š”
  3. ๋„๋ฉ”์ธ(์—…์ข…)๋ณ„ ์‹œ๋‚˜๋ฆฌ์˜ค
  4. ์ปดํฌ๋„ŒํŠธ ์‚ฌ์–‘์„œ
  5. ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ
  6. ์—…๋ฌด ํ๋ฆ„ & ๋ชจ๋“œ ๋กœ์ง
  7. ๋””์ž์ธ ์‹œ์Šคํ…œ & ์ ‘๊ทผ์„ฑ
  8. ํ…Œ์ŠคํŠธ ์‹œ๋‚˜๋ฆฌ์˜ค
  9. ์„ค์น˜ & ์‹คํ–‰
  10. ๊ฐœ์„  ํ”„๋กฌํ”„ํŠธ ์˜ˆ์‹œ
  11. ๋กœ๋“œ๋งต
  12. ํ”„๋กœ์ ํŠธ ๋งฅ๋ฝ

๐ŸŽฏ ์ดˆ๊ธฐ ์ œ์ž‘ ํ”„๋กฌํ”„ํŠธ

๋…ธ์ธ๋ถ„๋“ค์„ ์œ„ํ•œ ํ‚ค์˜ค์Šคํฌ ์—ฐ์Šต ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๋งŒ๋“ค์–ด์ฃผ์„ธ์š”.

์ฃผ์š” ๊ธฐ๋Šฅ ์—ฐ์Šต ๋ชจ๋“œ: ๋‹จ๊ณ„๋ณ„ ์•ˆ๋‚ด๊ฐ€ ์žˆ๋Š” ๊ฐ€์ด๋“œ ๋ชจ๋“œ

์‹ค์ „ ๋ชจ๋“œ: ๋žœ๋ค ๋ฏธ์…˜ ๊ธฐ๋ฐ˜ ์ฃผ๋ฌธ

ํ•™์Šต ๊ธฐ๋ก: localStorage์— ์‹ค์ „ ๊ฒฐ๊ณผ ์ €์žฅ(์„ฑ๊ณต/์‹คํŒจ, ์ฃผ๋ฌธ๋‚ด์—ญ, ์‹œ๊ฐ)

๋„์›€๋ง: ์‚ฌ์šฉ ๋ฐฉ๋ฒ•/ํŒ/FAQ

์—…์ข…(๋„๋ฉ”์ธ) ํ–„๋ฒ„๊ฑฐ, ์นดํŽ˜, ์˜ํ™”๊ด€, ์‹๋‹น(์ผ๋ฐ˜ ํ•œ์‹ยท๋ฐฑ๋ฐ˜)

์—…์ข…๋งˆ๋‹ค ์‹ค์ œ ํ๋ฆ„์ด ๋‹ค๋ฆ„

๋””์ž์ธ ์š”๊ตฌ์‚ฌํ•ญ ๋ชจ๋ฐ”์ผ ์ตœ์ ํ™”(max-w-md)

ํฐ ๊ธ€์”จ, ํฐ ๋ฒ„ํŠผ, ๋ช…ํ™•ํ•œ ์ƒ‰์ƒ ๋Œ€๋น„

Material Design ๋А๋‚Œ + ๋ชจ์…˜ ๊ฐ€์ด๋“œ

์ƒ‰์ƒ: ์—ฐ์Šต(ํŒŒ๋ž‘), ์‹ค์ „(์ดˆ๋ก), ์—…์ข…๋ณ„ ํ…Œ๋งˆ

๊ธฐ์ˆ  ์Šคํƒ React + TypeScript + Vite

Tailwind CSS

shadcn/ui, lucide-react

motion/react (์• ๋‹ˆ๋ฉ”์ด์…˜)

localStorage (ํ•™์Šต ๊ธฐ๋ก ์ €์žฅ)

yaml ์ฝ”๋“œ ๋ณต์‚ฌ


๐Ÿ“ฑ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๊ฐœ์š”

๊ตฌ๋ถ„ ์„ค๋ช…
๋ชฉํ‘œ ์‚ฌ์šฉ์ž 60๋Œ€ ์ด์ƒ, ํ‚ค์˜ค์Šคํฌ์— ์ต์ˆ™ํ•˜์ง€ ์•Š์€ ๋…ธ์ธ
ํ•ต์‹ฌ ๊ฐ€์น˜ ์•ˆ์ „ํ•œ ์—ฐ์Šต ํ™˜๊ฒฝ, ๋‹จ๊ณ„๋ณ„ ํ•™์Šต, ์‹ค์ „ ๋ฏธ์…˜, ํ•™์Šต ํ”ผ๋“œ๋ฐฑ
์ ‘๊ทผ์„ฑ ํฐ ํฐํŠธ, ํฐ ํ„ฐ์น˜ ์˜์—ญ, ์ƒ‰์ƒ ๋Œ€๋น„, ์Œ์„ฑ/์‹œ๊ฐ ํ”ผ๋“œ๋ฐฑ

๐Ÿ—บ ๋„๋ฉ”์ธ(์—…์ข…)๋ณ„ ์‹œ๋‚˜๋ฆฌ์˜ค

๐Ÿ” ํ–„๋ฒ„๊ฑฐ

  • ์นดํ…Œ๊ณ ๋ฆฌ: ๋ฒ„๊ฑฐ / ์‚ฌ์ด๋“œ / ์Œ๋ฃŒ
  • ์˜ต์…˜: ๋‹จํ’ˆ/์„ธํŠธ, ์‚ฌ์ด์ฆˆ, ์–ผ์Œ/๋นจ๋Œ€
  • ๋ฏธ์…˜ ์˜ˆ์‹œ: "์ƒˆ์šฐ๋ฒ„๊ฑฐ ์„ธํŠธ 1๊ฐœ, ์ฝœ๋ผ ๋ผ์ง€ 1์ž”"

โ˜• ์นดํŽ˜

  • ์นดํ…Œ๊ณ ๋ฆฌ: ์ปคํ”ผ / ์ฐจ / ๋””์ €ํŠธ
  • ์˜ต์…˜: HOT/ICE, ์ƒท์ถ”๊ฐ€, ๋‹น๋„, ์–ผ์Œ๋Ÿ‰, ํ…Œ์ดํฌ์•„์›ƒ
  • ๋ฏธ์…˜ ์˜ˆ์‹œ: "์•„๋ฉ”๋ฆฌ์นด๋…ธ ICE ํ†จ 2์ž”, ๋ฒ ์ด๊ธ€ 1๊ฐœ(ํฌ๋ฆผ์น˜์ฆˆ)"

๐ŸŽฌ ์˜ํ™”๊ด€

  • ๋‹จ๊ณ„: ์˜ํ™” ์„ ํƒ โ†’ ์‹œ๊ฐ„/์ขŒ์„ โ†’ ํŒ์ฝ˜/์Œ๋ฃŒ โ†’ ๊ฒฐ์ œ
  • ์˜ต์…˜: 2D/3D, ์ขŒ์„ ๊ตฌ์—ญ, ํŒ์ฝ˜ ์‚ฌ์ด์ฆˆ
  • ๋ฏธ์…˜ ์˜ˆ์‹œ: "์˜ค๋Š˜ 19:10 '๊ตญ๋ฏผ์˜ํ™”' 2๋งค, ํŒ์ฝ˜M, ์ฝœ๋ผ 1์ž”"

๐Ÿฑ ์‹๋‹น

  • ์นดํ…Œ๊ณ ๋ฆฌ: ๋ฐฑ๋ฐ˜ / ์ฐŒ๊ฐœ / ๋ฉด
  • ์˜ต์…˜: ๋งต๊ธฐ, ๊ณต๊ธฐ๋ฐฅ, ๋ฐ˜์ฐฌ ์ถ”๊ฐ€
  • ๋ฏธ์…˜ ์˜ˆ์‹œ: "๊น€์น˜์ฐŒ๊ฐœ 2(๋งต1 ์ˆœ1), ๊ณต๊ธฐ๋ฐฅ 1 ์ถ”๊ฐ€"

๐Ÿงฉ ์ปดํฌ๋„ŒํŠธ ์‚ฌ์–‘์„œ

1๏ธโƒฃ App.tsx

  • ์ „์ฒด ์ƒํƒœ/๋ชจ๋“œ ๊ด€๋ฆฌ
type AppMode = 'menu' | 'practice' | 'real';
type Domain = 'burger' | 'cafe' | 'cinema' | 'restaurant';
mode, domain, helpOpen, historyOpen ์ƒํƒœ ํฌํ•จ

๋ชจ๋“œ ์ „ํ™˜ ๋ฐ ์กฐ๊ฑด๋ถ€ ๋ Œ๋”

2๏ธโƒฃ MainMenu.tsx
Props	์„ค๋ช…
onSelectDomain(domain)	์—…์ข… ์„ ํƒ
onSelectMode(mode)	์—ฐ์Šต / ์‹ค์ „ ๋ชจ๋“œ ์„ ํƒ
onOpenHelp()	๋„์›€๋ง ๋‹ค์ด์–ผ๋กœ๊ทธ ์—ด๊ธฐ
onOpenHistory()	ํ•™์Šต ๊ธฐ๋ก ๋ณด๊ธฐ

์—…์ข… ์นด๋“œ (์•„์ด์ฝ˜ + ์„ค๋ช…)

๋ชจ๋“œ ์„ ํƒ ๋ฒ„ํŠผ

๊ธฐ๋ก / ๋„์›€๋ง ๋ฒ„ํŠผ

3๏ธโƒฃ KioskSimulator.tsx
Props	์„ค๋ช…
domain	ํ˜„์žฌ ์—…์ข…
isPracticeMode	์—ฐ์Šต๋ชจ๋“œ ์—ฌ๋ถ€
onExit()	ํ™ˆ์œผ๋กœ ๋Œ์•„๊ฐ€๊ธฐ

๋‚ด๋ถ€์—์„œ ์—…์ข…๋ณ„ ์ปดํฌ๋„ŒํŠธ ๋กœ๋“œ

/domains/Burger/, /domains/Cafe/, /domains/Cinema/, /domains/Restaurant/

4๏ธโƒฃ ์—…์ข…๋ณ„ ํ•˜์œ„ ์ปดํฌ๋„ŒํŠธ ์˜ˆ์‹œ
Burger

BurgerCategoryTabs.tsx

BurgerMenuList.tsx

BurgerCart.tsx

BurgerCheckout.tsx

5๏ธโƒฃ LearningHistory.tsx
localStorage ๊ธฐ๋ฐ˜ ๊ธฐ๋ก / ํ†ต๊ณ„

์ตœ๋Œ€ 50๊ฑด, ์ตœ์‹ ์ˆœ

์„ฑ๊ณต๋ฅ , ์‹œ๋„ ํšŸ์ˆ˜, ์ตœ๊ทผ ๋ฏธ์…˜ ํ‘œ์‹œ

6๏ธโƒฃ HelpDialog.tsx
์‚ฌ์šฉ๋ฒ• / ํŒ / FAQ

์—…์ข…๋ณ„ ์ฐจ์ด์™€ ์กฐ์ž‘ ๋ฐฉ๋ฒ• ์„ค๋ช…

์ƒ‰์ƒ ํ…Œ๋งˆ: blue-600

๐Ÿ—ƒ ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ
ts
์ฝ”๋“œ ๋ณต์‚ฌ
interface MenuItem {
  id: string;
  name: string;
  price: number;
  category: string;
  options?: Record<string, string | number | boolean>;
}

interface CartItem extends MenuItem {
  quantity: number;
}

interface Mission {
  domain: Domain;
  text: string;
  required: { name: string; quantity: number }[];
}

interface HistoryRecord {
  id: string;
  date: string;
  mission: string;
  domain: Domain;
  success: boolean;
  userOrder: { name: string; quantity: number }[];
  timestamp: number;
}
localStorage ํ‚ค: kioskLearningHistory

์ •์ฑ…: ์ตœ์‹ ์ˆœ์œผ๋กœ ์ตœ๋Œ€ 50๊ฑด ์ €์žฅ

๐Ÿ” ์—…๋ฌด ํ๋ฆ„ & ๋ชจ๋“œ ๋กœ์ง
๐Ÿงญ ์—ฐ์Šต ๋ชจ๋“œ
์‹œ์ž‘ โ†’ ์นดํ…Œ๊ณ ๋ฆฌ โ†’ ๋ฉ”๋‰ด โ†’ ์žฅ๋ฐ”๊ตฌ๋‹ˆ โ†’ ๊ฒฐ์ œ

๊ฐ ๋‹จ๊ณ„์—์„œ ๋ฒ„ํŠผ์— ์• ๋‹ˆ๋ฉ”์ด์…˜ ๊ฐ€์ด๋“œ

tsx
์ฝ”๋“œ ๋ณต์‚ฌ
<motion.button
  animate={{ scale: [1, 1.05, 1] }}
  transition={{ repeat: Infinity, duration: 1.5 }}
/>
๐ŸŽฏ ์‹ค์ „ ๋ชจ๋“œ
์—…์ข…๋ณ„ ๋žœ๋ค ๋ฏธ์…˜ ์ƒ์„ฑ

checkMission() ์œผ๋กœ ๊ฒฐ๊ณผ ํŒ์ •

saveToHistory() ๋กœ ์ €์žฅ

์„ฑ๊ณต/์‹คํŒจ ํ™”๋ฉด ํ‘œ์‹œ

๐ŸŽจ ๋””์ž์ธ ์‹œ์Šคํ…œ & ์ ‘๊ทผ์„ฑ
ํ•ญ๋ชฉ	๊ฐ€์ด๋“œ
ํฐํŠธ	text-xl, text-2xl ์ค‘์‹ฌ
๋ฒ„ํŠผ ํฌ๊ธฐ	์ตœ์†Œ h-14, ์ค‘์š” ๋ฒ„ํŠผ h-16
์ƒ‰์ƒ	์—ฐ์Šต: ํŒŒ๋ž‘ / ์‹ค์ „: ์ดˆ๋ก / ์—…์ข…๋ณ„ ํ…Œ๋งˆ
ํ”ผ๋“œ๋ฐฑ	hover, active, disabled ๋ช…ํ™•
๋ชจ์…˜	fade, slide, pulse (๋‹จ์ˆœ ํšจ๊ณผ๋งŒ)
์ ‘๊ทผ์„ฑ	aria-label, ํฌ์ปค์Šค ์ด๋™, ๊ณ ๋Œ€๋น„ ์ƒ‰์ƒ

๐Ÿงช ํ…Œ์ŠคํŠธ ์‹œ๋‚˜๋ฆฌ์˜ค
๊ณตํ†ต
์—…์ข… ์„ ํƒ โ†’ ์—ฐ์Šต ๋ชจ๋“œ ๋‹จ๊ณ„๋ณ„ ์ง„ํ–‰

์‹ค์ „ ๋ชจ๋“œ โ†’ ๋žœ๋ค ๋ฏธ์…˜ ์ฃผ๋ฌธ โ†’ ์„ฑ๊ณต ํ™•์ธ

์ž˜๋ชป๋œ ์ฃผ๋ฌธ โ†’ ์‹คํŒจ ๊ธฐ๋ก ์ €์žฅ

ํ•™์Šต ๊ธฐ๋ก ํ†ต๊ณ„ ํ™•์ธ

50๊ฑด ์ดˆ๊ณผ ์‹œ ์˜ค๋ž˜๋œ ๊ธฐ๋ก ์‚ญ์ œ

์—…์ข…๋ณ„ ํฌ์ธํŠธ
ํ–„๋ฒ„๊ฑฐ: ์„ธํŠธ/์‚ฌ์ด์ฆˆ/๋นจ๋Œ€/์–ผ์Œ ์˜ต์…˜

์นดํŽ˜: ICE/HOT, ์ƒท์ถ”๊ฐ€, ๋‹น๋„ ์กฐ์ ˆ

์˜ํ™”๊ด€: ์‹œ๊ฐ„ํ‘œ, ์ขŒ์„, ํŒ์ฝ˜

์‹๋‹น: ๋งต๊ธฐ/๊ณต๊ธฐ๋ฐฅ ์ถ”๊ฐ€

โš™๏ธ ์„ค์น˜ & ์‹คํ–‰
bash
์ฝ”๋“œ ๋ณต์‚ฌ
# 1) ์„ค์น˜
npm install

# 2) ๊ฐœ๋ฐœ ์„œ๋ฒ„ ์‹คํ–‰
npm run dev

# 3) ๋นŒ๋“œ
npm run build
npm run preview
๊ถŒ์žฅ ํ™˜๊ฒฝ

Node 18+

์ตœ์‹  Chrome ๋˜๋Š” Android WebView

๋ฐฐํฌ: Vercel / Netlify / GitHub Pages (PWA ๊ถŒ์žฅ)

๐Ÿ”„ ๊ฐœ์„  ํ”„๋กฌํ”„ํŠธ ์˜ˆ์‹œ
๊ธฐ๋Šฅ ๊ฐœ์„ 
์Œ์„ฑ ์•ˆ๋‚ด: Web Speech API๋กœ ๊ฐ ๋‹จ๊ณ„ ์•ˆ๋‚ด ์ฝ์–ด์ฃผ๊ธฐ

๋‹ค๊ตญ์–ด ์ง€์›: ํ•œ๊ตญ์–ด/์˜์–ด/์ค‘๊ตญ์–ด/์ผ๋ณธ์–ด

๋‚œ์ด๋„ ์ถ”๊ฐ€: ์‰ฌ์›€(1~2), ๋ณดํ†ต(2~3), ์–ด๋ ค์›€(3~5)

UX ๊ฐœ์„ 
๋‹คํฌ๋ชจ๋“œ ์ง€์›

์• ๋‹ˆ๋ฉ”์ด์…˜ ON/OFF ์„ค์ •

ํ‚ค๋ณด๋“œ ์ ‘๊ทผ์„ฑ ๊ฐ•ํ™”

๋ฐ์ดํ„ฐ ๊ด€๋ฆฌ
์ง„ํ–‰์ƒํ™ฉ ์ €์žฅ(๋งˆ์ง€๋ง‰ ๋ชจ๋“œ/๋‹จ๊ณ„ ๋ณต์›)

๊ธฐ๋ก ๋‚ด๋ณด๋‚ด๊ธฐ(CSV/์ธ์‡„์šฉ)

์ถ”๊ฐ€ ๋ชจ๋“œ
์‹œํ—˜ ๋ชจ๋“œ: ์—ฐ์† 5๊ฐœ ๋ฏธ์…˜, ์ œํ•œ์‹œ๊ฐ„, ์ ์ˆ˜

์ž์œ  ์ฃผ๋ฌธ ๋ชจ๋“œ: ๋ฏธ์…˜ ์—†์ด ์ž์œ  ์ฒดํ—˜

๐Ÿš€ ๋กœ๋“œ๋งต
๋ฒ„์ „	์ฃผ์š” ๋‚ด์šฉ
v1.0	4๊ฐœ ์—…์ข… ๊ธฐ๋ณธ ์‹œ๋‚˜๋ฆฌ์˜ค + ์—ฐ์Šต/์‹ค์ „ + ๊ธฐ๋ก
v1.1	์Œ์„ฑ ์•ˆ๋‚ด / ๋‚œ์ด๋„ / ๋‹คํฌ๋ชจ๋“œ
v1.2	์‹œํ—˜ ๋ชจ๋“œ / ๋ฐ์ดํ„ฐ ๋‚ด๋ณด๋‚ด๊ธฐ
v2.0	PWA ๋ฐฐํฌ (์Šคํ”Œ๋ž˜์‹œ / ์•„์ด์ฝ˜ / ์˜คํ”„๋ผ์ธ ์บ์‹œ)
v2.1	Android ํŒจํ‚ค์ง• (Expo ๋˜๋Š” Capacitor)

๐Ÿ“Œ ํ”„๋กœ์ ํŠธ ๋งฅ๋ฝ
๋ณธ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์€ ๋…ธ์ธ ๋Œ€์ƒ ํ‚ค์˜ค์Šคํฌ ์•ˆ๋‚ด ์•ฑ์œผ๋กœ์„œ
ํ–„๋ฒ„๊ฑฐ, ์นดํŽ˜, ์˜ํ™”๊ด€, ์‹๋‹น ๋“ฑ ์‹ค์ œ ํ™˜๊ฒฝ์˜ ์‹œ๋‚˜๋ฆฌ์˜ค๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ
๋…ธ์ธ ์‚ฌ์šฉ์ž์—๊ฒŒ ์‹ค์ œ ํ‚ค์˜ค์Šคํฌ ์กฐ์ž‘ ์—ฐ์Šต๊ณผ ๋‹จ๊ณ„๋ณ„ ํ•™์Šต ๊ฒฝํ—˜์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.
์—ฐ์Šต ๋ชจ๋“œ์™€ ์‹ค์ „ ๋ชจ๋“œ๋ฅผ ๊ตฌ๋ถ„ํ•˜์—ฌ ํ•™์Šต์˜ ๋ถ€๋‹ด์„ ์ค„์ด๊ณ ,
๊ธฐ๋ก/ํ”ผ๋“œ๋ฐฑ ๊ธฐ๋Šฅ์œผ๋กœ ํ•™์Šต ์„ฑ์ทจ๋ฅผ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

About

No description, website, or topics provided.

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages