Skip to content

Repository files navigation

์ƒํ™œ๋ฐ€์ฐฉ ์ง€๋„ ํ”„๋กœ๊ทธ๋žจ (Life Map Navigator, LMN)

============================================================================

ํ”„๋กœ๊ทธ๋žจ๋ช… : ์ƒํ™œ๋ฐ€์ฐฉ ์ง€๋„ ํ”„๋กœ๊ทธ๋žจ (Life Map Navigator, LMN)

ํ”„๋กœ๊ทธ๋žจ ํ•œ ์ค„ ์†Œ๊ฐœ : ์„ค์น˜ ์—†์ด ์›น์—์„œ ๋‚ด ์œ„์น˜ ํ™•์ธ, ๋ชฉ์ ์ง€ ํƒ์ƒ‰, ์ฃผ๋ณ€ ์ƒํ™œ ์‹œ์„ค ์กฐํšŒ, ๊ธธ์ฐพ๊ธฐ ์—ฐ๊ฒฐ๊นŒ์ง€ ๋น ๋ฅด๊ฒŒ ์ˆ˜ํ–‰ํ•˜๋Š” ์‹ค์ „ํ˜• ์ง€๋„ ์„œ๋น„์Šค

๋ฌธ์„œ ๋ฒ„์ „ : v0.2-spec ๋ฌธ์„œ ๊ธฐ์ค€์ผ : 2026-07-04 ํ”„๋กœ์ ํŠธ ์ƒํƒœ : ๊ธฐํš ๊ณ ๋„ํ™” ๋‹จ๊ณ„

============================================================================

๊ธฐ๋Šฅ ์ •๋ฆฌ

  • ํ•ต์‹ฌ ๊ธฐ๋Šฅ :
  1. ์›น ์ ‘์† ์ฆ‰์‹œ ์ง€๋„ ์‚ฌ์šฉ (์„ค์น˜/ํšŒ์›๊ฐ€์ž… ํ•„์ˆ˜ ์•„๋‹˜)
  2. ๋‚ด ์œ„์น˜ ํƒ์ƒ‰ ๋ฐ ์ง€๋„ ์ค‘์‹ฌ ์ด๋™
  3. ๋ชฉ์ ์ง€ ๊ฒ€์ƒ‰๊ณผ ๋งˆ์ปค ํ‘œ์‹œ
  4. ์™ธ๋ถ€ ๊ธธ์ฐพ๊ธฐ ์„œ๋น„์Šค ์—ฐ๋™
  5. ์ฃผ๋ณ€ ์ƒํ™œ ์‹œ์„ค ํƒ์ƒ‰ (๋ณ‘์›, ์•ฝ๊ตญ, ํŽธ์˜์ )
  • ๋ถ€๊ฐ€ ๊ธฐ๋Šฅ :
  1. ๊ฒ€์ƒ‰ ๊ฒฐ๊ณผ ๋ชฉ๋ก/๊ฑฐ๋ฆฌ ์ •๋ ฌ
  2. ๋ชจ๋ฐ”์ผ/PC ๋ฐ˜์‘ํ˜• ํ™”๋ฉด
  3. ๋น ๋ฅธ ๋„์›€๋ง ๋ฐ ์‚ฌ์šฉ ์•ˆ๋‚ด
  4. ํ•œ๊ตญ์–ด ์šฐ์„  UI + ์˜์–ด ํ™•์žฅ ์ค€๋น„

ํ”„๋กœ์ ํŠธ ๋ชฉํ‘œ :

  • ์ดˆ๋ณด์ž๋„ 3๋ถ„ ์•ˆ์— ๊ธธ์ฐพ๊ธฐ ์™„๋ฃŒ ๊ฐ€๋Šฅ
  • ์ž์ฃผ ์“ฐ๋Š” ์ƒํ™œ ์‹œ์„ค์„ 10์ดˆ ๋‚ด ํƒ์ƒ‰ ์‹œ์ž‘
  • ๋ณต์žกํ•œ ์„ค์ • ์—†์ด ์ฆ‰์‹œ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ์ง€๋„ ํ™˜๊ฒฝ ์ œ๊ณต

์ •๋Ÿ‰ ๋ชฉํ‘œ (MVP ๊ธฐ์ค€) :

  • ์ฒซ ํ™”๋ฉด ๋กœ๋”ฉ ๋ชฉํ‘œ: 3์ดˆ ์ด๋‚ด (์ผ๋ฐ˜ ์™€์ดํŒŒ์ด ํ™˜๊ฒฝ)
  • ๋ชฉ์ ์ง€ ๊ฒ€์ƒ‰ ์‘๋‹ต ๋ชฉํ‘œ: 2์ดˆ ์ด๋‚ด
  • ์ฃผ๋ณ€ ์‹œ์„ค ์กฐํšŒ ์‘๋‹ต ๋ชฉํ‘œ: 4์ดˆ ์ด๋‚ด
  • ๋ชจ๋ฐ”์ผ ํ™”๋ฉด ๋Œ€์‘ ํญ: 360px ์ด์ƒ

============================================================================

์‚ฌ์šฉ์ž ํŽ˜๋ฅด์†Œ๋‚˜

  • A. ์ดˆ๋ณด ์‚ฌ์šฉ์ž

    • ์ง€๋„ ์•ฑ ์‚ฌ์šฉ ๊ฒฝํ—˜์ด ์ ์Œ
    • ๋ชฉํ‘œ: ๋‚ด ์œ„์น˜์™€ ๋ชฉ์ ์ง€ ๋น ๋ฅด๊ฒŒ ํ™•์ธ
  • B. ์ด๋™ ์ค‘ ์‚ฌ์šฉ์ž

    • ๋‚ฏ์„  ์ง€์—ญ์—์„œ ๋ณ‘์›/์•ฝ๊ตญ/ํŽธ์˜์  ์ฆ‰์‹œ ํ•„์š”
    • ๋ชฉํ‘œ: ํ˜„์žฌ ์œ„์น˜ ๊ธฐ์ค€ ๊ฐ€๊นŒ์šด ์‹œ์„ค ์šฐ์„  ํ™•์ธ
  • C. ๊ฒฝ๋Ÿ‰ ์„œ๋น„์Šค ์„ ํ˜ธ ์‚ฌ์šฉ์ž

    • ์•ฑ ์„ค์น˜/๋กœ๊ทธ์ธ ๋ฒˆ๊ฑฐ๋กœ์›€์„ ์‹ซ์–ดํ•จ
    • ๋ชฉํ‘œ: ๋ธŒ๋ผ์šฐ์ €๋งŒ์œผ๋กœ ์ฆ‰์‹œ ์‚ฌ์šฉ

๊ธฐ๋Œ€ ํšจ๊ณผ : ์ง„์ž… ์žฅ๋ฒฝ์ด ๋‚ฎ์•„ ๋ˆ„๊ตฌ๋‚˜ ์‰ฝ๊ฒŒ ์ ‘๊ทผ ๊ฐ€๋Šฅํ•˜๊ณ , ์‚ฌ์šฉ์ž๋Š” ์ด๋™ ์ค‘ ํ•„์š”ํ•œ ์œ„์น˜ ์ •๋ณด๋ฅผ ๋น ๋ฅด๊ฒŒ ํ™•์ธํ•˜์—ฌ ์‹œ๊ฐ„ ์†์‹ค์„ ์ค„์ผ ์ˆ˜ ์žˆ๋‹ค.

============================================================================

๊ณ„๊ธฐ

๊ธฐ์กด ์ง€๋„ ์„œ๋น„์Šค๋Š” ๊ธฐ๋Šฅ์ด ๋งŽ์•„ ์ดˆ๋ณด์ž์—๊ฒŒ ๋ณต์žกํ•  ์ˆ˜ ์žˆ๊ณ , ํ•„์š”ํ•œ ๊ธฐ๋Šฅ๋งŒ ๋น ๋ฅด๊ฒŒ ์“ฐ๊ธฐ ์–ด๋ ค์šด ๊ฒฝ์šฐ๊ฐ€ ๋งŽ์Œ. ๋”ฐ๋ผ์„œ ์ƒํ™œ ํ•„์ˆ˜ ๊ธฐ๋Šฅ๋งŒ ๋ชจ์€ ๋‹จ์ˆœํ•˜๊ณ  ๋น ๋ฅธ ์ง€๋„ ๋„๊ตฌ๋ฅผ ๋งŒ๋“ค๊ฒŒ ๋จ.

============================================================================

ํ•ต์‹ฌ ํ™”๋ฉด

โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚ 1. ํ™ˆ/์ง€๋„ ํ™”๋ฉด (Main Map Screen) - ๋ ˆ์ด์•„์›ƒ ์š”์•ฝ                       โ”‚
โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค
โ”‚ ๋ฐ์Šคํฌํ†ฑ: [์ œ์–ด 35%] | [์ง€๋„ 65%]  (์ขŒ์šฐ ๋ถ„ํ• )                         โ”‚
โ”‚ ๋ชจ๋ฐ”์ผ:   [์ œ์–ด 50%] (์ƒ๋‹จ) + [์ง€๋„ 50%] (ํ•˜๋‹จ)  (์ƒํ•˜ ๋ถ„ํ• )            โ”‚
โ”‚ ์ „ํ™˜์ :   ๋ทฐํฌํŠธ โ‰ค 768px ์‹œ ๋ชจ๋ฐ”์ผ ๋ ˆ์ด์•„์›ƒ ์ ์šฉ                       โ”‚
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜

1-A. ์ œ์–ด ํŒจ๋„ ์ƒ์„ธ (Control Panel) - 5๊ฐœ ์„น์…˜ ๊ตฌ์„ฑ

   ์„น์…˜ A: ์œ„์น˜ ์ •๋ณด (๐Ÿ—บ๏ธ ๋‚ด ์œ„์น˜)
   โ”œโ”€ ์ƒํƒœ ํ‘œ์‹œ: "(์œ„๋„, ๊ฒฝ๋„)" | "ํ™•์ธ ์ค‘..." | "๊ถŒํ•œ ๊ฑฐ๋ถ€๋จ"
   โ”œโ”€ ๋ฒ„ํŠผ: [๋‚ด ์œ„์น˜ ์ฐพ๊ธฐ]
   โ””โ”€ ์ŠคํŽ™: ๋ฐฐ๊ฒฝ #4CAF50, 100% ร— 44px

   ์„น์…˜ B: ๋ชฉ์ ์ง€ ๊ฒ€์ƒ‰ (๐Ÿ” ๋ชฉ์ ์ง€ ๊ฒ€์ƒ‰)
   โ”œโ”€ ์ž…๋ ฅํ•„๋“œ: ํ”Œ๋ ˆ์ด์Šคํ™€๋” "์„œ์šธ์—ญ, ๊ฐ•๋‚จ์—ญ, ๋ณ‘์›..."
   โ”œโ”€ ๋ฒ„ํŠผ: [๊ฒ€์ƒ‰] | [๊ฒ€์ƒ‰ ์ดˆ๊ธฐํ™”] (์„ ํƒ)
   โ”œโ”€ ๊ฒฐ๊ณผ ํ‘œ์‹œ: ์ตœ์ƒ๋‹จ 1๊ฐœ ๊ฒฐ๊ณผ + ๋งˆ์ปค ํ‘œ์‹œ
   โ””โ”€ ์ŠคํŽ™: ์ž…๋ ฅ์ฐฝ 40px, ๊ฒ€์ƒ‰ ๋ฒ„ํŠผ #2196F3

   ์„น์…˜ C: ๊ธธ์ฐพ๊ธฐ (๐Ÿ—บ๏ธ ๊ธธ์ฐพ๊ธฐ)
   โ”œโ”€ ๋ฒ„ํŠผ: [๊ธธ์ฐพ๊ธฐ ์—ด๊ธฐ]
   โ”œโ”€ ํ™œ์„ฑํ™” ์กฐ๊ฑด: currentPosition && destination ๋ชจ๋‘ ํ•„์ˆ˜
   โ”œโ”€ ๋น„ํ™œ์„ฑํ™” UI: ์ปค์„œ not-allowed, ๋ฐฐ๊ฒฝ #CCCCCC
   โ””โ”€ ์ŠคํŽ™: ๋ฐฐ๊ฒฝ #FF9800 (ํ™œ์„ฑ), 100% ร— 44px

   ์„น์…˜ D: ์ฃผ๋ณ€ ์‹œ์„ค (๐Ÿฅ ์ฃผ๋ณ€ ์‹œ์„ค ํƒ์ƒ‰)
   โ”œโ”€ ๋ฒ„ํŠผ 3๊ฐœ (๊ฐ 31% ร— 44px, ๊ฐ„๊ฒฉ 1%)
   โ”‚  โ”œโ”€ [๐Ÿฅ ๋ณ‘์› ์ฐพ๊ธฐ] (#F44336)
   โ”‚  โ”œโ”€ [๐Ÿ’Š ์•ฝ๊ตญ ์ฐพ๊ธฐ] (#9C27B0)
   โ”‚  โ””โ”€ [๐Ÿช ํŽธ์˜์  ์ฐพ๊ธฐ] (#FF5722)
   โ””โ”€ ๊ฒฐ๊ณผ: "์กฐํšŒ ์ค‘..." โ†’ ์ง€๋„ ๋งˆ์ปค + ๋ชฉ๋ก ์—…๋ฐ์ดํŠธ

   ์„น์…˜ E: ์ƒํƒœ ๋ฉ”์‹œ์ง€ (Status Bar)
   โ”œโ”€ ๋†’์ด: ๊ณ ์ • 60px
   โ”œโ”€ ์ƒ˜ํ”Œ:
   โ”‚  โ”œโ”€ ์ฒ˜๋ฆฌ ์ค‘: โณ "๊ฒ€์ƒ‰ ์ค‘์ž…๋‹ˆ๋‹ค..." (#FFF3E0)
   โ”‚  โ”œโ”€ ์„ฑ๊ณต: โœ“ "๋ชฉ์ ์ง€๋ฅผ ์ฐพ์•˜์Šต๋‹ˆ๋‹ค." (#E8F5E9)
   โ”‚  โ””โ”€ ์—๋Ÿฌ: โš ๏ธ "์œ„์น˜ ๊ถŒํ•œ์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค..." (#FFEBEE)
   โ””โ”€ ํฐํŠธ: 13px, ์ƒ‰์ƒ #333

1-B. ์ง€๋„ ์˜์—ญ (Map Area)

   * ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ: Leaflet.js
   * ๊ธฐ๋ณธ ์ค‘์‹ฌ: ์„œ์šธ ์‹œ์ฒญ (37.5665, 126.9780), ์คŒ 12
   * ํƒ€์ผ: OpenStreetMap (Mapnik)
   * ๋งˆ์ปค ์ฒด๊ณ„:
     - ๋‚ด ์œ„์น˜: ํŒŒ๋ž€์ƒ‰ ์›ํ˜• + ๋ฐ˜๊ฒฝ ํ‘œ์‹œ
     - ๋ชฉ์ ์ง€: ๋นจ๊ฐ„์ƒ‰ ํ•€
     - ์‹œ์„ค: ๋…ธ๋ž€์ƒ‰ + ์•„์ด์ฝ˜ (๋ณ‘์›/์•ฝ๊ตญ/ํŽธ์˜์  ๊ตฌ๋ถ„)
   * ์ƒํ˜ธ์ž‘์šฉ: ๋งˆ์ปค ํด๋ฆญ ์‹œ ํŒ์—… (์‹œ์„ค๋ช…, ๊ฑฐ๋ฆฌ), ์คŒ ์กฐ์ • ๊ฐ€๋Šฅ

โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚ 2. ๊ฒฐ๊ณผ ๋ชฉ๋ก ์˜์—ญ (Results Panel)                                     โ”‚
โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค
โ”‚ ํ™œ์„ฑํ™”: ์ฃผ๋ณ€ ์‹œ์„ค ํƒ์ƒ‰ ํด๋ฆญ ํ›„ ๊ฒฐ๊ณผ ์ˆ˜์‹  ์‹œ                           โ”‚
โ”‚ ์ดˆ๊ธฐ: ์ˆจ๊น€ ๋˜๋Š” "๊ฒฐ๊ณผ๋ฅผ ๋ณด๋ ค๋ฉด ์ฃผ๋ณ€ ์‹œ์„ค์„ ํด๋ฆญํ•ด ์ฃผ์„ธ์š”"            โ”‚
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜

   ๊ตฌ์กฐ:
   โ”œโ”€ ํ—ค๋”: "๊ฒฐ๊ณผ ๋ชฉ๋ก (5๊ฐœ ๋ฐœ๊ฒฌ)"
   โ”œโ”€ ์ปฌ๋Ÿผ: [์ˆœ๋ฒˆ | ์‹œ์„ค๋ช… | ๊ฑฐ๋ฆฌ | ์นดํ…Œ๊ณ ๋ฆฌ]
   โ”œโ”€ ์ •๋ ฌ: ๊ฑฐ๋ฆฌ ์˜ค๋ฆ„์ฐจ์ˆœ (๊ฐ€๊นŒ์šด ์ˆœ)
   โ”œโ”€ ์•„์ดํ…œ ๋†’์ด: 44px
   โ””โ”€ ์ตœ๋Œ€ ํ‘œ์‹œ: 10๊ฐœ (์Šคํฌ๋กค ํ™œ์„ฑํ™”)

   ์˜ˆ์‹œ ๊ฒฐ๊ณผ:
   1. ๊ฐ€๋‚˜๋‹ค์•ฝ๊ตญ | 0.42km | ์•ฝ๊ตญ (์ขŒ์ธก ๋ณด๋” #9C27B0)
   2. ๋ผ๋งˆ๋ฐ”์•ฝ๊ตญ | 0.58km | ์•ฝ๊ตญ
   3. ์„œ์šธ์‹œ๋ณ‘์› | 0.75km | ๋ณ‘์› (์ขŒ์ธก ๋ณด๋” #F44336)
   4. CU ๊ฐ•๋‚จ์  | 0.89km | ํŽธ์˜์  (์ขŒ์ธก ๋ณด๋” #FF5722)
   5. GS25 ์—ญ์‚ผ์  | 1.02km | ํŽธ์˜์ 

   ์ƒํ˜ธ์ž‘์šฉ:
   โ””โ”€ ์•„์ดํ…œ ํด๋ฆญ โ†’ ์ง€๋„ ์ค‘์‹ฌ ์ด๋™ + ํŒ์—… ํ‘œ์‹œ
  1. ์ƒํƒœ ํ‘œ์‹œ ์ฒด๊ณ„ (State & Message System) | ์ƒํƒœ | ์•„์ด์ฝ˜ | ๋ฐฐ๊ฒฝ์ƒ‰ | ์˜ˆ์‹œ ๋ฉ”์‹œ์ง€ | |------|--------|--------|-----------------------------------| | ์ฒ˜๋ฆฌ ์ค‘ | โณ | #FFF3E0 | ๊ฒ€์ƒ‰ ์ค‘์ž…๋‹ˆ๋‹ค... | | ์„ฑ๊ณต | โœ“ | #E8F5E9 | ๋ชฉ์ ์ง€๋ฅผ ์ฐพ์•˜์Šต๋‹ˆ๋‹ค. | | ๊ฒฝ๊ณ  | โš ๏ธ | #FFF9C4 | ์œ„์น˜ ๊ถŒํ•œ์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. | | ์—๋Ÿฌ | โœ— | #FFEBEE | ์š”์ฒญ์ด ์‹คํŒจํ–ˆ์Šต๋‹ˆ๋‹ค. ๋‹ค์‹œ ์‹œ๋„ํ•ด ์ฃผ์„ธ์š”. |

  2. ๋ฐ˜์‘ํ˜• ๋ ˆ์ด์•„์›ƒ (Responsive Breakpoints)

๋ทฐํฌํŠธ ์กฐ๊ฑด ๋ ˆ์ด์•„์›ƒ ๊ตฌ์„ฑ
๋ฐ์Šคํฌํ†ฑ โ‰ฅ 769px ์ขŒ์ธก 35% (์ œ์–ด) | ์šฐ์ธก 65% (์ง€๋„)
ํŒจ๋”ฉ 16px, ์ œ์–ด ์ตœ๋Œ€ 400px
ํƒœ๋ธ”๋ฆฟ 481~768px ์ขŒ์ธก 40% (์ œ์–ด) | ์šฐ์ธก 60% (์ง€๋„)
์ œ์–ด ์ตœ๋Œ€ 320px
๋ชจ๋ฐ”์ผ โ‰ค 480px ์ƒ๋‹จ 50% (์ œ์–ด) + ํ•˜๋‹จ 50% (์ง€๋„)
ํŒจ๋”ฉ 12px, ํ„ฐ์น˜ ์˜์—ญ ์ตœ์†Œ 44ร—44px

๋ฒ„ํŠผ ๋„ˆ๋น„: โ””โ”€ ๋ฐ์Šคํฌํ†ฑ/ํƒœ๋ธ”๋ฆฟ: 100% (์ œ์–ด ํŒจ๋„ ๋‚ด) โ””โ”€ ๋ชจ๋ฐ”์ผ: 100% ๋˜๋Š” 3๋“ฑ๋ถ„ (์ฃผ๋ณ€ ์‹œ์„ค ๋ฒ„ํŠผ)

โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚ 5. ๋””์ž์ธ ์›์น™ ๋ฐ ์ŠคํŽ™ (Design Guidelines)                          โ”‚
โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค

   5-1. ์ƒ‰์ƒ ํŒ”๋ ˆํŠธ (Color Palette)
   โ”œโ”€ ๊ธฐ๋ณธ ๋ฐฐ๊ฒฝ: #FFFFFF (๋ฉ”์ธ) / #F5F5F5 (๋ณด์กฐ)
   โ”œโ”€ ํ…์ŠคํŠธ: #333333 (๋ณธ๋ฌธ) / #666666 (๋ณด์กฐ)
   โ”œโ”€ ๊ธฐ๋Šฅ๋ณ„ ๊ฐ•์กฐ:
   โ”‚  โ”œโ”€ ๋‚ด ์œ„์น˜: #4CAF50 (๋…น์ƒ‰)
   โ”‚  โ”œโ”€ ๊ฒ€์ƒ‰: #2196F3 (ํŒŒ๋ž€์ƒ‰)
   โ”‚  โ”œโ”€ ๊ธธ์ฐพ๊ธฐ: #FF9800 (์ฃผํ™ฉ์ƒ‰)
   โ”‚  โ”œโ”€ ๋ณ‘์›: #F44336 (๋นจ๊ฐ„์ƒ‰)
   โ”‚  โ”œโ”€ ์•ฝ๊ตญ: #9C27B0 (๋ณด๋ผ์ƒ‰)
   โ”‚  โ””โ”€ ํŽธ์˜์ : #FF5722 (์ฃผํ™ฉ๋นจ๊ฐ•)
   โ””โ”€ ๋น„ํ™œ์„ฑํ™”: #CCCCCC ๋ฐฐ๊ฒฝ, #999999 ํ…์ŠคํŠธ

   5-2. ํƒ€์ดํฌ๊ทธ๋ž˜ํ”ผ (Typography)
   โ”œโ”€ ํฐํŠธ๊ตฐ: sans-serif (Noto Sans ๊ถŒ์žฅ)
   โ”œโ”€ ์‚ฌ์ด์ฆˆ: ๋ณธ๋ฌธ 14px, ์ œ๋ชฉ 16px, ํ—ค๋” 18px
   โ””โ”€ ๋ผ์ธ๋†’์ด: 1.5 (ํ…์ŠคํŠธ), 1.2 (ํ—ค๋”)

   5-3. ์ ‘๊ทผ์„ฑ (Accessibility)
   โ”œโ”€ ๋ชจ๋“  ๋ฒ„ํŠผ์— aria-label ์ถ”๊ฐ€
   โ”œโ”€ ์ƒ‰์ƒ + ์•„์ด์ฝ˜/ํ…์ŠคํŠธ ๋ณ‘ํ–‰ (์ƒ‰์ƒ๋งŒ์œผ๋กœ ์ •๋ณด ์ „๋‹ฌ ๊ธˆ์ง€)
   โ”œโ”€ ๋ช…๋„ ๋Œ€๋น„: WCAG AA 4.5:1 ์ด์ƒ (๋ณธ๋ฌธ vs ๋ฐฐ๊ฒฝ)
   โ””โ”€ ํฌ์ปค์Šค ์ธ๋””์ผ€์ดํ„ฐ: ํŒŒ๋ž€์ƒ‰ ํ…Œ๋‘๋ฆฌ 2px

   5-4. ์ƒํ˜ธ์ž‘์šฉ ์›์น™ (Interaction)
   โ”œโ”€ ํ•ต์‹ฌ ํ๋ฆ„: 3ํšŒ ์ด์ƒ ํด๋ฆญ ๋ฐฉ์ง€
   โ”‚  โ”œโ”€ ์˜ˆ1: [๋‚ด ์œ„์น˜] ํด๋ฆญ โ†’ ์ž๋™ ํ‘œ์‹œ (1ํšŒ)
   โ”‚  โ”œโ”€ ์˜ˆ2: [๋ชฉ์ ์ง€ ์ž…๋ ฅ] + [๊ฒ€์ƒ‰] โ†’ ํ‘œ์‹œ (2ํšŒ)
   โ”‚  โ””โ”€ ์˜ˆ3: [์‹œ์„ค ์นดํ…Œ๊ณ ๋ฆฌ] โ†’ ๊ฒฐ๊ณผ ํ‘œ์‹œ (1ํšŒ)
   โ”œโ”€ ๋ฒ„ํŠผ ๋ฌธ๊ตฌ: ๋™์‚ฌ + ์•„์ด์ฝ˜ ์กฐํ•ฉ (์˜ˆ: [๐Ÿ” ๊ฒ€์ƒ‰], [๐Ÿฅ ๋ณ‘์› ์ฐพ๊ธฐ])
   โ”œโ”€ ๋กœ๋”ฉ: ์Šคํ”ผ๋„ˆ + ๋ฉ”์‹œ์ง€ ํ‘œ์‹œ
   โ””โ”€ ์˜ค๋ฅ˜: ์žฌ์‹œ๋„ ๋ฒ„ํŠผ + ์—๋Ÿฌ ์ฝ”๋“œ (์˜ˆ: LMN-005)

โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜

============================================================================

๊ธฐ๋Šฅ ๋ช…์„ธ (MVP)

FR-01. ์ง€๋„ ๋กœ๋“œ

  • ์ž…๋ ฅ: ํŽ˜์ด์ง€ ์ ‘์†
  • ์ฒ˜๋ฆฌ: OpenStreetMap ํƒ€์ผ ๋ Œ๋”๋ง
  • ์ถœ๋ ฅ: ๊ธฐ๋ณธ ์ค‘์‹ฌ ์ขŒํ‘œ(์„œ์šธ ์‹œ์ฒญ ๊ธฐ์ค€) ์ง€๋„ ํ‘œ์‹œ
  • ์‹คํŒจ ์ฒ˜๋ฆฌ: ํƒ€์ผ ๋กœ๋“œ ์‹คํŒจ ์‹œ ์žฌ์‹œ๋„ ์•ˆ๋‚ด ๋ฉ”์‹œ์ง€

FR-02. ๋‚ด ์œ„์น˜ ์ฐพ๊ธฐ

  • ์ž…๋ ฅ: ๋‚ด ์œ„์น˜ ์ฐพ๊ธฐ ๋ฒ„ํŠผ ํด๋ฆญ
  • ์ฒ˜๋ฆฌ: ๋ธŒ๋ผ์šฐ์ € Geolocation ๊ถŒํ•œ ์š”์ฒญ
  • ์ถœ๋ ฅ: ํ˜„์žฌ ์ขŒํ‘œ ๋งˆ์ปค ํ‘œ์‹œ, ์ง€๋„ ์ค‘์‹ฌ ์ด๋™
  • ์‹คํŒจ ์ฒ˜๋ฆฌ: ๊ถŒํ•œ ๊ฑฐ๋ถ€/์‹œ๊ฐ„ ์ดˆ๊ณผ ์‹œ ๋Œ€์ฒด ์•ˆ๋‚ด ํ‘œ์‹œ

FR-03. ๋ชฉ์ ์ง€ ๊ฒ€์ƒ‰

  • ์ž…๋ ฅ: ๋ชฉ์ ์ง€ ํ…์ŠคํŠธ (์˜ˆ: ์„œ์šธ์—ญ)
  • ์ฒ˜๋ฆฌ: Nominatim ๊ฒ€์ƒ‰ API ํ˜ธ์ถœ
  • ์ถœ๋ ฅ: ์ƒ์œ„ ๊ฒฐ๊ณผ 1๊ฐœ ์ขŒํ‘œ ๋งˆ์ปค ํ‘œ์‹œ
  • ์‹คํŒจ ์ฒ˜๋ฆฌ: ๊ฒฐ๊ณผ ์—†์Œ/์š”์ฒญ ์‹คํŒจ ๋ฉ”์‹œ์ง€ ํ‘œ์‹œ

FR-04. ๊ธธ์ฐพ๊ธฐ ์—ฐ๊ฒฐ

  • ์ž…๋ ฅ: ํ˜„์žฌ ์œ„์น˜ + ๋ชฉ์ ์ง€ ํ™•๋ณด ์ƒํƒœ์—์„œ ๋ฒ„ํŠผ ํด๋ฆญ
  • ์ฒ˜๋ฆฌ: ์™ธ๋ถ€ ๊ธธ์ฐพ๊ธฐ URL ์ƒ์„ฑ
  • ์ถœ๋ ฅ: ์ƒˆ ํƒญ์—์„œ ๊ธธ์ฐพ๊ธฐ ํŽ˜์ด์ง€ ์˜คํ”ˆ
  • ์‹คํŒจ ์ฒ˜๋ฆฌ: ์œ„์น˜ ์ •๋ณด ๋ถˆ์ถฉ๋ถ„ ์‹œ ์„ ํ–‰ ๋‹จ๊ณ„ ์•ˆ๋‚ด

FR-05. ์ฃผ๋ณ€ ์‹œ์„ค ํƒ์ƒ‰

  • ์ž…๋ ฅ: ํ˜„์žฌ ์œ„์น˜ ๊ธฐ์ค€ ๋ฐ˜๊ฒฝ 1.5km
  • ์ฒ˜๋ฆฌ: Overpass API๋กœ ์‹œ์„ค ์กฐํšŒ
  • ์ถœ๋ ฅ: ์ง€๋„ ๋งˆ์ปค + ๋ชฉ๋ก(๊ฐ€๊นŒ์šด ์ˆœ)
  • ์‹คํŒจ ์ฒ˜๋ฆฌ: API ์˜ค๋ฅ˜ ์‹œ ์žฌ์‹œ๋„ ์•ˆ๋‚ด

============================================================================

๋น„๊ธฐ๋Šฅ ์š”๊ตฌ์‚ฌํ•ญ

NFR-01. ์„ฑ๋Šฅ

  • ๊ฒ€์ƒ‰ ์š”์ฒญ์€ ์‚ฌ์šฉ์ž ์ž…๋ ฅ ํ›„ ์ฆ‰์‹œ ์‹คํ–‰
  • ๊ฐ™์€ ๊ธฐ๋Šฅ ๋ฒ„ํŠผ ์—ฐ์† ํด๋ฆญ ์‹œ ์ค‘๋ณต ์š”์ฒญ ๋ฐฉ์ง€

NFR-02. ์‚ฌ์šฉ์„ฑ

  • ๋ชจ๋ฐ”์ผ 1์—ด, ๋ฐ์Šคํฌํ†ฑ 2์—ด ๋ ˆ์ด์•„์›ƒ ์ž๋™ ์ „ํ™˜
  • ํ‚ค๋ณด๋“œ Enter๋กœ ๊ฒ€์ƒ‰ ๊ฐ€๋Šฅ

NFR-03. ์ ‘๊ทผ์„ฑ

  • ๋ฒ„ํŠผ/์ž…๋ ฅ ์š”์†Œ์— ๋ช…ํ™•ํ•œ ๋ผ๋ฒจ ์ œ๊ณต
  • ์ƒํƒœ ๋ฉ”์‹œ์ง€ ์˜์—ญ์œผ๋กœ ํ˜„์žฌ ์ฒ˜๋ฆฌ ์ƒํƒœ ํ‘œ์‹œ

NFR-04. ์‹ ๋ขฐ์„ฑ

  • ์™ธ๋ถ€ API ์‹คํŒจ ์‹œ ์•ฑ ์ž์ฒด๋Š” ์ค‘๋‹จ๋˜์ง€ ์•Š์•„์•ผ ํ•จ
  • ๊ฐ ๊ธฐ๋Šฅ์€ ๋…๋ฆฝ์ ์œผ๋กœ ์‹คํŒจ/๋ณต๊ตฌ ๊ฐ€๋Šฅํ•ด์•ผ ํ•จ

============================================================================

๊ธฐ์ˆ  ์„ค๊ณ„

  1. ํ”„๋ก ํŠธ์—”๋“œ
  • HTML + CSS + JavaScript (๋ฐ”๋‹๋ผ)
  • ์ง€๋„ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ: Leaflet
  1. ์™ธ๋ถ€ ๋ฐ์ดํ„ฐ ์†Œ์Šค
  • ํƒ€์ผ: OpenStreetMap
  • ์ง€์˜ค์ฝ”๋”ฉ: Nominatim
  • ์ฃผ๋ณ€ ์‹œ์„ค: Overpass API
  • ๊ฒฝ๋กœ ํŽ˜์ด์ง€: OpenStreetMap Directions
  1. ๋ฐ์ดํ„ฐ ์ €์žฅ
  • MVP: ์„œ๋ฒ„ DB ๋ฏธ์‚ฌ์šฉ
  • ์ฐจ๊ธฐ: ์ตœ๊ทผ ๊ฒ€์ƒ‰/์ฆ๊ฒจ์ฐพ๊ธฐ localStorage ์ €์žฅ
  • ํ–ฅํ›„: ๊ณ„์ • ์—ฐ๋™ ์‹œ ์„œ๋ฒ„ DB(PostgreSQL) ๋„์ž… ๊ฒ€ํ† 

============================================================================

๋ณด์•ˆ

  1. ์ž…๋ ฅ ๊ฒ€์ฆ
  • ๊ฒ€์ƒ‰์–ด ๊ธธ์ด ์ œํ•œ (๊ถŒ์žฅ 1~80์ž)
  • ๋น„์ •์ƒ ๊ณต๋ฐฑ/์ œ์–ด ๋ฌธ์ž ์ œ๊ฑฐ
  1. ์š”์ฒญ ์ œ์–ด
  • ๊ธฐ๋Šฅ๋ณ„ ์—ฐ์† ํ˜ธ์ถœ ์ œํ•œ (๊ฐ„๋‹จ rate-limit)
  • ์‹คํŒจ ๋ฐ˜๋ณต ์‹œ ์งง์€ ๋Œ€๊ธฐ ํ›„ ์žฌ์‹œ๋„ ๊ถŒ์žฅ
  1. ๊ฐœ์ธ์ •๋ณด ๋ณดํ˜ธ
  • ์œ„์น˜ ์ •๋ณด๋Š” ๋ธŒ๋ผ์šฐ์ € ๊ถŒํ•œ ๊ธฐ๋ฐ˜์œผ๋กœ๋งŒ ์‚ฌ์šฉ
  • ์œ„์น˜ ์ •๋ณด ์„œ๋ฒ„ ์ €์žฅ ๊ธˆ์ง€ (MVP ์›์น™)
  1. ์šด์˜ ํ™•์žฅ ์‹œ ํ•„์ˆ˜ ํ•ญ๋ชฉ
  • API ํ”„๋ก์‹œ ์„œ๋ฒ„ ๋„์ž…
  • ๋น„์ •์ƒ ํŠธ๋ž˜ํ”ฝ ๋ฐฉ์–ด (WAF, ๋ถ„์‚ฐ rate-limit)
  • ๊ฐ์‚ฌ ๋กœ๊ทธ ๋ฐ ์ด์ƒ ์ง•ํ›„ ํƒ์ง€

============================================================================

์‚ฌ์šฉ์ž ์˜ˆ์ƒ ์‹œ๋‚˜๋ฆฌ์˜ค

  1. ํ”„๋กœ๊ทธ๋žจ ์ ‘์†
  2. ์œ„์น˜ ๊ถŒํ•œ ํ—ˆ์šฉ ์—ฌ๋ถ€ ํ™•์ธ
    • a. ํ—ˆ์šฉ: ๋‚ด ์œ„์น˜ ์ฆ‰์‹œ ํ‘œ์‹œ
    • b. ๊ฑฐ๋ถ€: ๊ฒ€์ƒ‰ ์ค‘์‹ฌ ๋ชจ๋“œ๋กœ ์ง„ํ–‰
  3. ๋ชฉ์ ์ง€ ์ž…๋ ฅ ํ›„ ๊ฒ€์ƒ‰
  4. ๊ธธ์ฐพ๊ธฐ ์—ด๊ธฐ ๋˜๋Š” ์ฃผ๋ณ€ ์‹œ์„ค ์ฐพ๊ธฐ ์‹คํ–‰
  5. ๊ฒฐ๊ณผ ๋ชฉ๋ก์—์„œ ๊ฐ€๊นŒ์šด ์‹œ์„ค ์šฐ์„  ํ™•์ธ
  6. ์ด๋™ ํ›„ ์•ฑ ์ข…๋ฃŒ

์„ฑ๊ณต ์‹œ๋‚˜๋ฆฌ์˜ค ์™„๋ฃŒ ๊ธฐ์ค€

  • ๋‚ด ์œ„์น˜ ํ‘œ์‹œ ์„ฑ๊ณต
  • ๋ชฉ์ ์ง€ ๊ฒ€์ƒ‰ ์„ฑ๊ณต
  • ๊ธธ์ฐพ๊ธฐ ํƒญ ์—ด๋ฆผ ๋˜๋Š” ์‹œ์„ค ๋ชฉ๋ก ํ™•์ธ

============================================================================

ํ˜„์žฌ ํ”„๋กœํ† ํƒ€์ž… ๊ตฌํ˜„ ์ƒํƒœ (2026-07-04)

  1. ๋ฌธ์„œํ™” ์ƒํƒœ
  • ํ”„๋กœ์ ํŠธ ๋น„์ „, ๊ธฐ๋Šฅ ๋ฒ”์œ„, ์‹œ๋‚˜๋ฆฌ์˜ค ์ •์˜ ์™„๋ฃŒ
  • MVP ์š”๊ตฌ์‚ฌํ•ญ ๋ฐ ํ™•์žฅ ๊ณ„ํš ๋ฌธ์„œํ™” ์™„๋ฃŒ
  1. ๊ตฌํ˜„ ์ƒํƒœ
  • ํ˜„์žฌ ์ €์žฅ์†Œ ๊ธฐ์ค€ ์ฝ”๋“œ ํŒŒ์ผ์€ ๋ฏธํฌํ•จ ์ƒํƒœ
  • ๋‹ค์Œ ๋‹จ๊ณ„์—์„œ ํ™”๋ฉด/๊ธฐ๋Šฅ ์ฝ”๋“œ ์žฌ๊ตฌ์„ฑ ํ•„์š”
  1. ์ฆ‰์‹œ ์ฐฉ์ˆ˜ ์šฐ์„ ์ˆœ์œ„
  • P1: ์ง€๋„ ํ‘œ์‹œ + ๋‚ด ์œ„์น˜ + ๋ชฉ์ ์ง€ ๊ฒ€์ƒ‰
  • P2: ์ฃผ๋ณ€ ์‹œ์„ค ์กฐํšŒ + ๊ฑฐ๋ฆฌ ์ •๋ ฌ
  • P3: ๊ธธ์ฐพ๊ธฐ ์—ฐ๊ฒฐ + ๋ชจ๋ฐ”์ผ UX ๊ฐœ์„ 

============================================================================

๊ฐœ๋ฐœ ์ผ์ • (์ œ์•ˆ)

1์ฃผ์ฐจ

  • ๊ธฐ๋ณธ ํ™”๋ฉด ๋ผˆ๋Œ€ ๊ตฌ์„ฑ
  • ์ง€๋„ ๋ Œ๋”๋ง ๋ฐ ๋‚ด ์œ„์น˜ ๊ธฐ๋Šฅ

2์ฃผ์ฐจ

  • ๋ชฉ์ ์ง€ ๊ฒ€์ƒ‰ ๋ฐ ๊ฒฐ๊ณผ ํ‘œ์‹œ
  • ๊ธธ์ฐพ๊ธฐ URL ์—ฐ๋™

3์ฃผ์ฐจ

  • ์ฃผ๋ณ€ ์‹œ์„ค ํƒ์ƒ‰ ๋ฐ ๊ฑฐ๋ฆฌ ์ •๋ ฌ
  • ์˜ˆ์™ธ ์ฒ˜๋ฆฌ ๋ฐ ์ƒํƒœ ๋ฉ”์‹œ์ง€ ๊ฐœ์„ 

4์ฃผ์ฐจ

  • ๋ฐ˜์‘ํ˜• UI ํ’ˆ์งˆ ๊ฐœ์„ 
  • ์‚ฌ์šฉ์ž ํ…Œ์ŠคํŠธ ๋ฐ ๋ฒ„๊ทธ ์ˆ˜์ •

============================================================================

ํ…Œ์ŠคํŠธ ์ฒดํฌ๋ฆฌ์ŠคํŠธ

๊ธฐ๋Šฅ ํ…Œ์ŠคํŠธ

  • ์œ„์น˜ ๊ถŒํ•œ ํ—ˆ์šฉ/๊ฑฐ๋ถ€ ๋ชจ๋‘ ์ •์ƒ ์ฒ˜๋ฆฌ๋˜๋Š”๊ฐ€?
  • ๋นˆ ๊ฒ€์ƒ‰์–ด ์ž…๋ ฅ ์‹œ ์•ˆ๋‚ด๊ฐ€ ์ •ํ™•ํ•œ๊ฐ€?
  • ๊ฒ€์ƒ‰ ๊ฒฐ๊ณผ ์—†์Œ ์ผ€์ด์Šค๊ฐ€ ์ •์ƒ ์•ˆ๋‚ด๋˜๋Š”๊ฐ€?
  • ์ฃผ๋ณ€ ์‹œ์„ค 0๊ฑด/๋‹ค๊ฑด ์ƒํ™ฉ์—์„œ UI๊ฐ€ ๊นจ์ง€์ง€ ์•Š๋Š”๊ฐ€?

ํ˜ธํ™˜์„ฑ ํ…Œ์ŠคํŠธ

  • Chrome, Edge ์ตœ์‹  ๋ฒ„์ „์—์„œ ๋™์ž‘ํ•˜๋Š”๊ฐ€?
  • ๋ชจ๋ฐ”์ผ ํ•ด์ƒ๋„(360px~430px)์—์„œ ๋ฒ„ํŠผ ์‚ฌ์šฉ์„ฑ์ด ์œ ์ง€๋˜๋Š”๊ฐ€?

์•ˆ์ •์„ฑ ํ…Œ์ŠคํŠธ

  • ์™ธ๋ถ€ API ์‘๋‹ต ์ง€์—ฐ ์‹œ ์•ฑ์ด ๋ฉˆ์ถ”์ง€ ์•Š๋Š”๊ฐ€?
  • ๋ฐ˜๋ณต ํด๋ฆญ ์‹œ ์ค‘๋ณต ์š”์ฒญ์ด ๊ณผ๋„ํ•˜๊ฒŒ ๋ฐœ์ƒํ•˜์ง€ ์•Š๋Š”๊ฐ€?

============================================================================

์‹คํ–‰ ๋ฐฉ๋ฒ• (์ฝ”๋“œ ์ถ”๊ฐ€ ์ดํ›„ ๊ธฐ์ค€)

  1. ํ”„๋กœ์ ํŠธ ๋ฃจํŠธ์—์„œ ๋กœ์ปฌ ์„œ๋ฒ„ ์‹คํ–‰

Python: python -m http.server 5500

Node.js: npx serve .

  1. ๋ธŒ๋ผ์šฐ์ €์—์„œ http://localhost:5500 ์ ‘์†

============================================================================

ํ”„๋กœ์ ํŠธ ํŒŒ์ผ ๊ตฌ์„ฑ (๋ชฉํ‘œ)

  • README.md : ํ”„๋กœ์ ํŠธ ์„ค๋ช… ๋ฌธ์„œ
  • index.html : ํ™”๋ฉด ๊ตฌ์กฐ
  • style.css : ์Šคํƒ€์ผ ๋ฐ ๋ฐ˜์‘ํ˜• ๋ ˆ์ด์•„์›ƒ
  • app.js : ์ง€๋„/์œ„์น˜/๊ฒ€์ƒ‰/์ฃผ๋ณ€์‹œ์„ค ๋กœ์ง

============================================================================

๋‹ค์Œ ๋ฒ„์ „ ๋ชฉํ‘œ (v0.3)

  1. ์ฆ๊ฒจ์ฐพ๊ธฐ(์ง‘/ํšŒ์‚ฌ) ์ €์žฅ
  2. ์ตœ๊ทผ ๊ฒ€์ƒ‰ ์ž๋™์™„์„ฑ
  3. ์‹œ์„ค ์นดํ…Œ๊ณ ๋ฆฌ ํ™•์žฅ (ATM, ์ฃผ์œ ์†Œ, ํ™”์žฅ์‹ค)
  4. ํ•œ๊ตญ์–ด/์˜์–ด UI ์ „ํ™˜
  5. ์„œ๋ฒ„ ํ”„๋ก์‹œ ๊ธฐ๋ฐ˜ API ์•ˆ์ •ํ™”

์žฅ๊ธฐ ๋ชฉํ‘œ (v1.0)

  1. ์‚ฌ์šฉ์ž ๊ณ„์ • ๋ฐ ํด๋ผ์šฐ๋“œ ๋™๊ธฐํ™”
  2. ์‹ค์‹œ๊ฐ„ ๊ตํ†ต/์‚ฌ๊ณ /๊ณต์‚ฌ ์ •๋ณด ์—ฐ๋™
  3. ๊ฐœ์ธํ™” ์ถ”์ฒœ ๊ฒฝ๋กœ ๋ฐ ์žฅ์†Œ ์ œ์•ˆ

============================================================================

์ƒ์„ธ ๋ช…์„ธ ๋ถ€๋ก A. ํ™”๋ฉด ๋‹จ์œ„ ์š”๊ตฌ์‚ฌํ•ญ

A-1. ๋ฉ”์ธ ํ™”๋ฉด (Map Home)

  • ๋ชฉ์ : ์‚ฌ์šฉ์ž๊ฐ€ 1๊ฐœ ํ™”๋ฉด์—์„œ ํ•ต์‹ฌ ๋™์ž‘์„ ๋๋‚ผ ์ˆ˜ ์žˆ๋„๋ก ์ œ๊ณต
  • ํ•„์ˆ˜ ์ปดํฌ๋„ŒํŠธ
    • ๊ฒ€์ƒ‰ ์ž…๋ ฅ์ฐฝ
    • ๋‚ด ์œ„์น˜ ๋ฒ„ํŠผ
    • ๊ธธ์ฐพ๊ธฐ ๋ฒ„ํŠผ
    • ์ฃผ๋ณ€ ์‹œ์„ค ๋ฒ„ํŠผ
    • ์ƒํƒœ ๋ฉ”์‹œ์ง€ ์˜์—ญ
    • ๊ฒฐ๊ณผ ๋ชฉ๋ก ์˜์—ญ
  • UI ๊ทœ์น™
    • ๋ฒ„ํŠผ ์ตœ์†Œ ํ„ฐ์น˜ ์˜์—ญ: 44x44px ์ด์ƒ
    • ๋ณธ๋ฌธ ๊ธฐ๋ณธ ํฐํŠธ ํฌ๊ธฐ: 14px ์ด์ƒ
    • ์ฃผ์š” ๋Œ€๋น„ ๋น„์œจ: WCAG ๊ธฐ์ค€ 4.5:1 ์ด์ƒ ๋ชฉํ‘œ

A-2. ๋ชจ๋ฐ”์ผ ํ™”๋ฉด

  • 360px~430px ํญ์—์„œ 1์—ด ๋ ˆ์ด์•„์›ƒ
  • ์ง€๋„ ๋†’์ด ์ตœ์†Œ 55vh ๋ณด์žฅ
  • ์Šคํฌ๋กค ์‹œ ์ปจํŠธ๋กค ํŒจ๋„์ด ๋จผ์ € ๋ณด์ด๋„๋ก ์ƒ๋‹จ ๋ฐฐ์น˜

A-3. ์ƒํƒœ ๋ฉ”์‹œ์ง€ ๋ฌธ๊ตฌ ์ •์ฑ…

  • ์ฒ˜๋ฆฌ ์‹œ์ž‘: "๊ฒ€์ƒ‰ ์ค‘์ž…๋‹ˆ๋‹ค..."
  • ์ฒ˜๋ฆฌ ์„ฑ๊ณต: "๋ชฉ์ ์ง€๋ฅผ ์ฐพ์•˜์Šต๋‹ˆ๋‹ค."
  • ์ฒ˜๋ฆฌ ์‹คํŒจ: ์›์ธ + ๋‹ค์Œ ํ–‰๋™ ์ œ์‹œ
    • ์˜ˆ: "์œ„์น˜ ๊ถŒํ•œ์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ๋ธŒ๋ผ์šฐ์ € ๊ถŒํ•œ ์„ค์ •์„ ํ™•์ธํ•ด ์ฃผ์„ธ์š”."

==============================================================================

์ƒ์„ธ ๋ช…์„ธ ๋ถ€๋ก B. API ํ˜ธ์ถœ ์ŠคํŽ™ (์™ธ๋ถ€ API)

B-1. Nominatim (๋ชฉ์ ์ง€ ๊ฒ€์ƒ‰)

  • Method: GET
  • Endpoint: https://nominatim.openstreetmap.org/search
  • Query
    • q: string (๊ฒ€์ƒ‰์–ด)
    • format: json
    • limit: 1 (MVP)
    • addressdetails: 1
  • ํƒ€์ž„์•„์›ƒ ๊ถŒ์žฅ: 6์ดˆ
  • ์„ฑ๊ณต ๊ธฐ์ค€: lat, lon, display_name ์กด์žฌ

์š”์ฒญ ์˜ˆ์‹œ https://nominatim.openstreetmap.org/search?q=์„œ์šธ์—ญ&format=json&limit=1&addressdetails=1

B-2. Overpass (์ฃผ๋ณ€ ์‹œ์„ค)

  • Method: POST
  • Endpoint: https://overpass-api.de/api/interpreter
  • ๋ฐ˜๊ฒฝ ๊ธฐ๋ณธ๊ฐ’: 1500m
  • ์‹œ์„ค ํ•„ํ„ฐ
    • amenity: hospital, pharmacy, clinic
    • shop: convenience
  • ํƒ€์ž„์•„์›ƒ ๊ถŒ์žฅ: 10์ดˆ

์ฟผ๋ฆฌ ์˜ˆ์‹œ:

[out:json][timeout:20];
(
   node["amenity"~"hospital|pharmacy|clinic"](around:1500,37.5665,126.9780);
   node["shop"="convenience"](around:1500,37.5665,126.9780);
);
out body;

B-3. Directions URL ์ƒ์„ฑ ๊ทœ์น™

  • Base: https://www.openstreetmap.org/directions
  • Params - engine=fossgis_osrm_car (๊ธฐ๋ณธ ์ฐจ๋Ÿ‰) - route={lat1},{lon1};{lat2},{lon2}
    • engine=fossgis_osrm_car (๊ธฐ๋ณธ ์ฐจ๋Ÿ‰)
    • route={lat1},{lon1};{lat2},{lon2}

==============================================================================

์ƒ์„ธ ๋ช…์„ธ ๋ถ€๋ก C. ๋ฐ์ดํ„ฐ ๋ชจ๋ธ

C-1. ํด๋ผ์ด์–ธํŠธ ์ƒํƒœ ๊ฐ์ฒด (์˜ˆ์‹œ):

{
   "currentPosition": {
      "lat": 37.5665,
      "lon": 126.9780
   },
   "destination": {
      "label": "์„œ์šธ์—ญ",
      "lat": 37.5547,
      "lon": 126.9706
   },
   "nearbyResults": [
      {
         "name": "๊ฐ€๋‚˜๋‹ค์•ฝ๊ตญ",
         "type": "pharmacy",
         "lat": 37.56,
         "lon": 126.97,
         "distanceKm": 0.42
      }
   ],
   "lastUpdatedAt": "2026-07-04T10:30:00+09:00"
}

C-2. localStorage ํ‚ค ์„ค๊ณ„ (v0.3 ๊ณ„ํš):

lmn-settings
   language: ko | en
   radiusMeters: number

lmn-recent-searches
   ["์„œ์šธ์—ญ", "๊ฐ•๋‚จ์—ญ", "์ธ์ฒœ๊ณตํ•ญ"]

lmn-favorites
   [{"name":"์ง‘","lat":...,"lon":...}, {"name":"ํšŒ์‚ฌ","lat":...,"lon":...}]

==============================================================================

์ƒ์„ธ ๋ช…์„ธ ๋ถ€๋ก D. ์ƒํƒœ ์ „์ด (State Flow)

D-1. ์ดˆ๊ธฐ ์ƒํƒœ

S0: READY

D-2. ์œ„์น˜ ์ฐพ๊ธฐ

S0 -> S1(LOCATING) -> S2(LOCATED) ๋˜๋Š” E1(LOCATION_DENIED)

D-3. ๋ชฉ์ ์ง€ ๊ฒ€์ƒ‰

S0/S2 -> S3(SEARCHING) -> S4(DESTINATION_SET) ๋˜๋Š” E2(NO_RESULT) ๋˜๋Š” E3(API_ERROR)

D-4. ์ฃผ๋ณ€ ์‹œ์„ค ์กฐํšŒ

S2 -> S5(NEARBY_LOADING) -> S6(NEARBY_READY) ๋˜๋Š” E3(API_ERROR)

D-5. ๊ธธ์ฐพ๊ธฐ

์กฐ๊ฑด: currentPosition && destination ์กด์žฌ ์‹œ์—๋งŒ ์‹คํ–‰
์‹คํŒจ ์ƒํƒœ: E4(PREREQUISITE_MISSING)

{ "currentPosition": { "lat": 37.5665, "lon": 126.9780 }, "destination": { "label": "์„œ์šธ์—ญ", "lat": 37.5547, "lon": 126.9706 }, "nearbyResults": [ { "name": "๊ฐ€๋‚˜๋‹ค์•ฝ๊ตญ", "type": "pharmacy", "lat": 37.56, "lon": 126.97, "distanceKm": 0.42 } ], "lastUpdatedAt": "2026-07-04T10:30:00+09:00" }

C-2. localStorage ํ‚ค ์„ค๊ณ„ (v0.3 ๊ณ„ํš)

  • lmn-settings
    • language: ko | en
    • radiusMeters: number
  • lmn-recent-searches
    • ["์„œ์šธ์—ญ", "๊ฐ•๋‚จ์—ญ", "์ธ์ฒœ๊ณตํ•ญ"]
  • lmn-favorites
    • [{"name":"์ง‘","lat":...,"lon":...}, {"name":"ํšŒ์‚ฌ","lat":...,"lon":...}]

==============================================================================

์ƒ์„ธ ๋ช…์„ธ ๋ถ€๋ก D. ์ƒํƒœ ์ „์ด (State Flow)

D-1. ์ดˆ๊ธฐ ์ƒํƒœ

  • S0: READY

D-2. ์œ„์น˜ ์ฐพ๊ธฐ

  • S0 -> S1(LOCATING) -> S2(LOCATED) ๋˜๋Š” E1(LOCATION_DENIED)

D-3. ๋ชฉ์ ์ง€ ๊ฒ€์ƒ‰

  • S0/S2 -> S3(SEARCHING) -> S4(DESTINATION_SET) ๋˜๋Š” E2(NO_RESULT) ๋˜๋Š” E3(API_ERROR)

D-4. ์ฃผ๋ณ€ ์‹œ์„ค ์กฐํšŒ

  • S2 -> S5(NEARBY_LOADING) -> S6(NEARBY_READY) ๋˜๋Š” E3(API_ERROR)

D-5. ๊ธธ์ฐพ๊ธฐ

  • ์กฐ๊ฑด: currentPosition && destination ์กด์žฌ ์‹œ์—๋งŒ ์‹คํ–‰
  • ์‹คํŒจ ์ƒํƒœ: E4(PREREQUISITE_MISSING)

==============================================================================

์ƒ์„ธ ๋ช…์„ธ ๋ถ€๋ก E. ์—๋Ÿฌ ์ฝ”๋“œ ํ‘œ์ค€

์ฝ”๋“œ ์—๋Ÿฌ ํƒ€์ž… ์›์ธ ์‚ฌ์šฉ์ž ๋ฉ”์‹œ์ง€
LMN-001 LOCATION_PERMISSION_DENIED ์œ„์น˜ ๊ถŒํ•œ ๊ฑฐ๋ถ€ ์œ„์น˜ ๊ถŒํ•œ์„ ํ—ˆ์šฉํ•˜๋ฉด ๋‚ด ์œ„์น˜ ๊ธฐ๋ฐ˜ ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
LMN-002 LOCATION_TIMEOUT GPS ์‘๋‹ต ์ง€์—ฐ ์œ„์น˜ ํ™•์ธ์ด ์ง€์—ฐ๋˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๋‹ค์‹œ ์‹œ๋„ํ•ด ์ฃผ์„ธ์š”.
LMN-003 DESTINATION_EMPTY ๊ฒ€์ƒ‰์–ด ๋ฏธ์ž…๋ ฅ ๋ชฉ์ ์ง€๋ฅผ ์ž…๋ ฅํ•ด ์ฃผ์„ธ์š”.
LMN-004 GEOCODE_NO_RESULT ๊ฒ€์ƒ‰ ๊ฒฐ๊ณผ ์—†์Œ ๊ฒ€์ƒ‰ ๊ฒฐ๊ณผ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ํ‚ค์›Œ๋“œ๋ฅผ ์ž…๋ ฅํ•ด ์ฃผ์„ธ์š”.
LMN-005 EXTERNAL_API_FAILURE ์™ธ๋ถ€ API ์žฅ์• /์ฐจ๋‹จ/๊ณผ๋‹ค์š”์ฒญ ์ผ์‹œ์ ์œผ๋กœ ์กฐํšŒ๊ฐ€ ์–ด๋ ต์Šต๋‹ˆ๋‹ค. ์ž ์‹œ ํ›„ ๋‹ค์‹œ ์‹œ๋„ํ•ด ์ฃผ์„ธ์š”.
LMN-006 ROUTE_PRECONDITION_FAIL ์ถœ๋ฐœ/๋„์ฐฉ ์ขŒํ‘œ ๋ฏธํ™•๋ณด ๋‚ด ์œ„์น˜์™€ ๋ชฉ์ ์ง€๋ฅผ ๋จผ์ € ์„ค์ •ํ•ด ์ฃผ์„ธ์š”.

==============================================================================

์ƒ์„ธ ๋ช…์„ธ ๋ถ€๋ก F. ๋ณด์•ˆ/์šด์˜ ์ •์ฑ… ์ƒ์„ธ

F-1. ์ž…๋ ฅ ์ •์ฑ…:

* ๊ฒ€์ƒ‰์–ด ์ตœ๋Œ€ ๊ธธ์ด: 80์ž
* ํ—ˆ์šฉ ๋ฌธ์ž: ์ผ๋ฐ˜ ํ…์ŠคํŠธ + ์ˆซ์ž + ๊ณต๋ฐฑ + ๊ธฐ๋ณธ ๊ตฌ๋‘์ 
* ์Šคํฌ๋ฆฝํŠธ ์‚ฝ์ž… ํŒจํ„ด ๋ฐœ๊ฒฌ ์‹œ ์ž…๋ ฅ ๋ฌดํšจ ์ฒ˜๋ฆฌ

F-2. ์š”์ฒญ ์ œ์–ด ์ •์ฑ… (MVP ๊ถŒ์žฅ):

* ๋ชฉ์ ์ง€ ๊ฒ€์ƒ‰: 700ms ๋””๋ฐ”์šด์Šค
* ์ฃผ๋ณ€ ์‹œ์„ค ์กฐํšŒ: ๋™์ผ ์œ„์น˜ 10์ดˆ ๋‚ด ์žฌํ˜ธ์ถœ ์ฐจ๋‹จ
* ๋ฒ„ํŠผ ์ค‘๋ณต ํด๋ฆญ: ์ฒ˜๋ฆฌ ์ค‘ ๋น„ํ™œ์„ฑํ™”

F-3. ์žฅ์•  ๋Œ€์‘:

* ์™ธ๋ถ€ API 5xx ๋˜๋Š” timeout ๋ฐœ์ƒ ์‹œ ์ตœ๋Œ€ 1ํšŒ ์žฌ์‹œ๋„
* ์žฌ์‹œ๋„ ์‹คํŒจ ์‹œ fallback ๋ฉ”์‹œ์ง€ + ์ˆ˜๋™ ์žฌ์‹œ๋„ ๋ฒ„ํŠผ ๋…ธ์ถœ

F-4. ํ–ฅํ›„ ์„œ๋ฒ„ ๋„์ž… ์‹œ:

* API Key๋Š” ์„œ๋ฒ„ ๋น„๊ณต๊ฐœ ์ €์žฅ
* ํด๋ผ์ด์–ธํŠธ๋Š” ํ”„๋ก์‹œ ์—”๋“œํฌ์ธํŠธ๋งŒ ํ˜ธ์ถœ
* ๋กœ๊ทธ์— ์ •๋ฐ€ ์ขŒํ‘œ ์ „์ฒด ์ €์žฅ ๊ธˆ์ง€(์†Œ์ˆ˜์  ์ ˆ์‚ญ/์ต๋ช…ํ™”)

==============================================================================

์ƒ์„ธ ๋ช…์„ธ ๋ถ€๋ก G. ํ…Œ์ŠคํŠธ ์‹œ๋‚˜๋ฆฌ์˜ค (์ƒ์„ธ)

G-1. ์ •์ƒ ํ๋ฆ„:

1. ๋‚ด ์œ„์น˜ ์ฐพ๊ธฐ ํด๋ฆญ
2. ๋ชฉ์ ์ง€ "์„œ์šธ์—ญ" ์ž…๋ ฅ ํ›„ ๊ฒ€์ƒ‰
3. ๊ธธ์ฐพ๊ธฐ ์—ด๊ธฐ ํด๋ฆญ
4. ๊ธฐ๋Œ€๊ฒฐ๊ณผ: ์™ธ๋ถ€ ๊ฒฝ๋กœ ํƒญ ์—ด๋ฆผ

G-2. ์œ„์น˜ ๊ฑฐ๋ถ€ ํ๋ฆ„:

1. ์œ„์น˜ ๊ถŒํ•œ ๊ฑฐ๋ถ€
2. ๋ชฉ์ ์ง€๋งŒ ๊ฒ€์ƒ‰
3. ๊ธฐ๋Œ€๊ฒฐ๊ณผ: ๊ฒ€์ƒ‰์€ ๊ฐ€๋Šฅ, ๊ธธ์ฐพ๊ธฐ๋Š” ์„ ํ–‰ ์กฐ๊ฑด ๋ฉ”์‹œ์ง€ ์ถœ๋ ฅ

G-3. API ์˜ค๋ฅ˜ ํ๋ฆ„:

1. ๋„คํŠธ์›Œํฌ ์ฐจ๋‹จ ๋˜๋Š” ์‘๋‹ต timeout ์œ ๋„
2. ์ฃผ๋ณ€ ์‹œ์„ค ์ฐพ๊ธฐ ์‹คํ–‰
3. ๊ธฐ๋Œ€๊ฒฐ๊ณผ: ์•ฑ ๋‹ค์šด ์—†์ด ์‹คํŒจ ๋ฉ”์‹œ์ง€ ์ถœ๋ ฅ

G-4. ๋ฐ˜๋ณต ํด๋ฆญ ํ๋ฆ„:

1. ์ฃผ๋ณ€ ์‹œ์„ค ๋ฒ„ํŠผ ์—ฐ์† 5ํšŒ ํด๋ฆญ
2. ๊ธฐ๋Œ€๊ฒฐ๊ณผ: ์ค‘๋ณต ์š”์ฒญ ์ œํ•œ, UI ๋ฉˆ์ถค ์—†์Œ

==============================================================================

์ƒ์„ธ ๋ช…์„ธ ๋ถ€๋ก H. ๋ฆด๋ฆฌ์Šค ๊ธฐ์ค€ (Definition of Done)

MVP ๋ฆด๋ฆฌ์Šค ์กฐ๊ฑด:

ํ•ต์‹ฌ ๊ธฐ๋Šฅ FR-01~FR-05 ์ „๋ถ€ ๋™์ž‘
์ฃผ์š” ์—๋Ÿฌ ์ฝ”๋“œ LMN-001~LMN-006 ์ฒ˜๋ฆฌ
๋ชจ๋ฐ”์ผ 360px ํ™˜๊ฒฝ์—์„œ ๊ธฐ๋Šฅ ์‚ฌ์šฉ ๊ฐ€๋Šฅ
Chrome/Edge ์ตœ์‹  ๋ฒ„์ „ ์ˆ˜๋™ ํ…Œ์ŠคํŠธ ํ†ต๊ณผ
README ์‹คํ–‰ ๋ฐฉ๋ฒ•๋งŒ์œผ๋กœ ํŒ€์›์ด ์žฌํ˜„ ๊ฐ€๋Šฅ
  1. ํ•ต์‹ฌ ๊ธฐ๋Šฅ FR-01~FR-05 ์ „๋ถ€ ๋™์ž‘
  2. ์ฃผ์š” ์—๋Ÿฌ ์ฝ”๋“œ LMN-001~LMN-006 ์ฒ˜๋ฆฌ
  3. ๋ชจ๋ฐ”์ผ 360px ํ™˜๊ฒฝ์—์„œ ๊ธฐ๋Šฅ ์‚ฌ์šฉ ๊ฐ€๋Šฅ
  4. Chrome/Edge ์ตœ์‹  ๋ฒ„์ „ ์ˆ˜๋™ ํ…Œ์ŠคํŠธ ํ†ต๊ณผ
  5. README ์‹คํ–‰ ๋ฐฉ๋ฒ•๋งŒ์œผ๋กœ ํŒ€์›์ด ์žฌํ˜„ ๊ฐ€๋Šฅ

==============================================================================

์ƒ์„ธ ๋ช…์„ธ ๋ถ€๋ก I. ์ž‘์—… ๋ถ„ํ•ด (๊ถŒ์žฅ ํƒœ์Šคํฌ)

ํƒœ์Šคํฌ ID ์ œ๋ชฉ ์‚ฐ์ถœ๋ฌผ ์šฐ์„ ์ˆœ์œ„
FE-001 ์ง€๋„ ๊ธฐ๋ณธ ๋ Œ๋”๋ง ์ง€๋„ ๋กœ๋“œ, ๊ธฐ๋ณธ ์ค‘์‹ฌ ์ขŒํ‘œ ํ‘œ์‹œ P1
FE-002 ์œ„์น˜ ๊ถŒํ•œ ์ฒ˜๋ฆฌ ์„ฑ๊ณต/์‹คํŒจ/timeout UI ๋ถ„๊ธฐ P1
FE-003 ๋ชฉ์ ์ง€ ๊ฒ€์ƒ‰ ๊ฒ€์ƒ‰ API ์—ฐ๋™, ๋งˆ์ปค ํ‘œ์‹œ P1
FE-004 ์ฃผ๋ณ€ ์‹œ์„ค ์กฐํšŒ Overpass ์กฐํšŒ, ์ •๋ ฌ, ๋ชฉ๋ก ๋ Œ๋”๋ง P2
FE-005 ๊ธธ์ฐพ๊ธฐ ์—ฐ๋™ URL ์ƒ์„ฑ, ์ƒˆ ํƒญ ์—ฐ๊ฒฐ P1
FE-006 ์˜ˆ์™ธ/์ƒํƒœ ๋ฉ”์‹œ์ง€ ์ฒด๊ณ„ํ™” ์ฝ”๋“œ๋ณ„ ์‚ฌ์šฉ์ž ๋ฉ”์‹œ์ง€ ํ‘œ์ค€ํ™” P2
FE-007 ๋ชจ๋ฐ”์ผ UI ๊ฐœ์„  360px ๊ธฐ์ค€ ๋ ˆ์ด์•„์›ƒ ๊ฒ€์ฆ P3

==============================================================================

์ƒ์„ธ ๋ช…์„ธ ๋ถ€๋ก J. ํ–ฅํ›„ ํ™•์žฅ ์•„ํ‚คํ…์ฒ˜ (์š”์•ฝ)

J-1. ํ˜„์žฌ:

Browser -> External APIs ์ง์ ‘ ํ˜ธ์ถœ

J-2. ํ™•์žฅํ˜•:

Browser -> Backend Proxy -> External APIs

์žฅ์ :
- API ํ‚ค ๋ณดํ˜ธ
- ์บ์‹œ/๋ ˆ์ดํŠธ๋ฆฌ๋ฐ‹ ์ค‘์•™ ํ†ต์ œ
- ์—๋Ÿฌ ๋ชจ๋‹ˆํ„ฐ๋ง ์ผ์›ํ™”
  • Browser -> External APIs ์ง์ ‘ ํ˜ธ์ถœ

J-2. ํ™•์žฅํ˜•

  • Browser -> Backend Proxy -> External APIs
  • ์žฅ์ 
    • API ํ‚ค ๋ณดํ˜ธ
    • ์บ์‹œ/๋ ˆ์ดํŠธ๋ฆฌ๋ฐ‹ ์ค‘์•™ ํ†ต์ œ
    • ์—๋Ÿฌ ๋ชจ๋‹ˆํ„ฐ๋ง ์ผ์›ํ™”

==============================================================================

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

Packages

Contributors

Languages