============================================================================
ํ๋ก๊ทธ๋จ๋ช : ์ํ๋ฐ์ฐฉ ์ง๋ ํ๋ก๊ทธ๋จ (Life Map Navigator, LMN)
ํ๋ก๊ทธ๋จ ํ ์ค ์๊ฐ : ์ค์น ์์ด ์น์์ ๋ด ์์น ํ์ธ, ๋ชฉ์ ์ง ํ์, ์ฃผ๋ณ ์ํ ์์ค ์กฐํ, ๊ธธ์ฐพ๊ธฐ ์ฐ๊ฒฐ๊น์ง ๋น ๋ฅด๊ฒ ์ํํ๋ ์ค์ ํ ์ง๋ ์๋น์ค
๋ฌธ์ ๋ฒ์ : v0.2-spec ๋ฌธ์ ๊ธฐ์ค์ผ : 2026-07-04 ํ๋ก์ ํธ ์ํ : ๊ธฐํ ๊ณ ๋ํ ๋จ๊ณ
============================================================================
๊ธฐ๋ฅ ์ ๋ฆฌ
- ํต์ฌ ๊ธฐ๋ฅ :
- ์น ์ ์ ์ฆ์ ์ง๋ ์ฌ์ฉ (์ค์น/ํ์๊ฐ์ ํ์ ์๋)
- ๋ด ์์น ํ์ ๋ฐ ์ง๋ ์ค์ฌ ์ด๋
- ๋ชฉ์ ์ง ๊ฒ์๊ณผ ๋ง์ปค ํ์
- ์ธ๋ถ ๊ธธ์ฐพ๊ธฐ ์๋น์ค ์ฐ๋
- ์ฃผ๋ณ ์ํ ์์ค ํ์ (๋ณ์, ์ฝ๊ตญ, ํธ์์ )
- ๋ถ๊ฐ ๊ธฐ๋ฅ :
- ๊ฒ์ ๊ฒฐ๊ณผ ๋ชฉ๋ก/๊ฑฐ๋ฆฌ ์ ๋ ฌ
- ๋ชจ๋ฐ์ผ/PC ๋ฐ์ํ ํ๋ฉด
- ๋น ๋ฅธ ๋์๋ง ๋ฐ ์ฌ์ฉ ์๋ด
- ํ๊ตญ์ด ์ฐ์ 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 | ํธ์์
์ํธ์์ฉ:
โโ ์์ดํ
ํด๋ฆญ โ ์ง๋ ์ค์ฌ ์ด๋ + ํ์
ํ์
-
์ํ ํ์ ์ฒด๊ณ (State & Message System) | ์ํ | ์์ด์ฝ | ๋ฐฐ๊ฒฝ์ | ์์ ๋ฉ์์ง | |------|--------|--------|-----------------------------------| | ์ฒ๋ฆฌ ์ค | โณ | #FFF3E0 | ๊ฒ์ ์ค์ ๋๋ค... | | ์ฑ๊ณต | โ | #E8F5E9 | ๋ชฉ์ ์ง๋ฅผ ์ฐพ์์ต๋๋ค. | | ๊ฒฝ๊ณ |
โ ๏ธ | #FFF9C4 | ์์น ๊ถํ์ด ํ์ํฉ๋๋ค. | | ์๋ฌ | โ | #FFEBEE | ์์ฒญ์ด ์คํจํ์ต๋๋ค. ๋ค์ ์๋ํด ์ฃผ์ธ์. | -
๋ฐ์ํ ๋ ์ด์์ (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 ์คํจ ์ ์ฑ ์์ฒด๋ ์ค๋จ๋์ง ์์์ผ ํจ
- ๊ฐ ๊ธฐ๋ฅ์ ๋ ๋ฆฝ์ ์ผ๋ก ์คํจ/๋ณต๊ตฌ ๊ฐ๋ฅํด์ผ ํจ
============================================================================
๊ธฐ์ ์ค๊ณ
- ํ๋ก ํธ์๋
- HTML + CSS + JavaScript (๋ฐ๋๋ผ)
- ์ง๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ: Leaflet
- ์ธ๋ถ ๋ฐ์ดํฐ ์์ค
- ํ์ผ: OpenStreetMap
- ์ง์ค์ฝ๋ฉ: Nominatim
- ์ฃผ๋ณ ์์ค: Overpass API
- ๊ฒฝ๋ก ํ์ด์ง: OpenStreetMap Directions
- ๋ฐ์ดํฐ ์ ์ฅ
- MVP: ์๋ฒ DB ๋ฏธ์ฌ์ฉ
- ์ฐจ๊ธฐ: ์ต๊ทผ ๊ฒ์/์ฆ๊ฒจ์ฐพ๊ธฐ localStorage ์ ์ฅ
- ํฅํ: ๊ณ์ ์ฐ๋ ์ ์๋ฒ DB(PostgreSQL) ๋์ ๊ฒํ
============================================================================
๋ณด์
- ์ ๋ ฅ ๊ฒ์ฆ
- ๊ฒ์์ด ๊ธธ์ด ์ ํ (๊ถ์ฅ 1~80์)
- ๋น์ ์ ๊ณต๋ฐฑ/์ ์ด ๋ฌธ์ ์ ๊ฑฐ
- ์์ฒญ ์ ์ด
- ๊ธฐ๋ฅ๋ณ ์ฐ์ ํธ์ถ ์ ํ (๊ฐ๋จ rate-limit)
- ์คํจ ๋ฐ๋ณต ์ ์งง์ ๋๊ธฐ ํ ์ฌ์๋ ๊ถ์ฅ
- ๊ฐ์ธ์ ๋ณด ๋ณดํธ
- ์์น ์ ๋ณด๋ ๋ธ๋ผ์ฐ์ ๊ถํ ๊ธฐ๋ฐ์ผ๋ก๋ง ์ฌ์ฉ
- ์์น ์ ๋ณด ์๋ฒ ์ ์ฅ ๊ธ์ง (MVP ์์น)
- ์ด์ ํ์ฅ ์ ํ์ ํญ๋ชฉ
- API ํ๋ก์ ์๋ฒ ๋์
- ๋น์ ์ ํธ๋ํฝ ๋ฐฉ์ด (WAF, ๋ถ์ฐ rate-limit)
- ๊ฐ์ฌ ๋ก๊ทธ ๋ฐ ์ด์ ์งํ ํ์ง
============================================================================
์ฌ์ฉ์ ์์ ์๋๋ฆฌ์ค
- ํ๋ก๊ทธ๋จ ์ ์
- ์์น ๊ถํ ํ์ฉ ์ฌ๋ถ ํ์ธ
- a. ํ์ฉ: ๋ด ์์น ์ฆ์ ํ์
- b. ๊ฑฐ๋ถ: ๊ฒ์ ์ค์ฌ ๋ชจ๋๋ก ์งํ
- ๋ชฉ์ ์ง ์ ๋ ฅ ํ ๊ฒ์
- ๊ธธ์ฐพ๊ธฐ ์ด๊ธฐ ๋๋ ์ฃผ๋ณ ์์ค ์ฐพ๊ธฐ ์คํ
- ๊ฒฐ๊ณผ ๋ชฉ๋ก์์ ๊ฐ๊น์ด ์์ค ์ฐ์ ํ์ธ
- ์ด๋ ํ ์ฑ ์ข ๋ฃ
์ฑ๊ณต ์๋๋ฆฌ์ค ์๋ฃ ๊ธฐ์ค
- ๋ด ์์น ํ์ ์ฑ๊ณต
- ๋ชฉ์ ์ง ๊ฒ์ ์ฑ๊ณต
- ๊ธธ์ฐพ๊ธฐ ํญ ์ด๋ฆผ ๋๋ ์์ค ๋ชฉ๋ก ํ์ธ
============================================================================
ํ์ฌ ํ๋กํ ํ์ ๊ตฌํ ์ํ (2026-07-04)
- ๋ฌธ์ํ ์ํ
- ํ๋ก์ ํธ ๋น์ , ๊ธฐ๋ฅ ๋ฒ์, ์๋๋ฆฌ์ค ์ ์ ์๋ฃ
- MVP ์๊ตฌ์ฌํญ ๋ฐ ํ์ฅ ๊ณํ ๋ฌธ์ํ ์๋ฃ
- ๊ตฌํ ์ํ
- ํ์ฌ ์ ์ฅ์ ๊ธฐ์ค ์ฝ๋ ํ์ผ์ ๋ฏธํฌํจ ์ํ
- ๋ค์ ๋จ๊ณ์์ ํ๋ฉด/๊ธฐ๋ฅ ์ฝ๋ ์ฌ๊ตฌ์ฑ ํ์
- ์ฆ์ ์ฐฉ์ ์ฐ์ ์์
- P1: ์ง๋ ํ์ + ๋ด ์์น + ๋ชฉ์ ์ง ๊ฒ์
- P2: ์ฃผ๋ณ ์์ค ์กฐํ + ๊ฑฐ๋ฆฌ ์ ๋ ฌ
- P3: ๊ธธ์ฐพ๊ธฐ ์ฐ๊ฒฐ + ๋ชจ๋ฐ์ผ UX ๊ฐ์
============================================================================
๊ฐ๋ฐ ์ผ์ (์ ์)
1์ฃผ์ฐจ
- ๊ธฐ๋ณธ ํ๋ฉด ๋ผ๋ ๊ตฌ์ฑ
- ์ง๋ ๋ ๋๋ง ๋ฐ ๋ด ์์น ๊ธฐ๋ฅ
2์ฃผ์ฐจ
- ๋ชฉ์ ์ง ๊ฒ์ ๋ฐ ๊ฒฐ๊ณผ ํ์
- ๊ธธ์ฐพ๊ธฐ URL ์ฐ๋
3์ฃผ์ฐจ
- ์ฃผ๋ณ ์์ค ํ์ ๋ฐ ๊ฑฐ๋ฆฌ ์ ๋ ฌ
- ์์ธ ์ฒ๋ฆฌ ๋ฐ ์ํ ๋ฉ์์ง ๊ฐ์
4์ฃผ์ฐจ
- ๋ฐ์ํ UI ํ์ง ๊ฐ์
- ์ฌ์ฉ์ ํ ์คํธ ๋ฐ ๋ฒ๊ทธ ์์
============================================================================
ํ ์คํธ ์ฒดํฌ๋ฆฌ์คํธ
๊ธฐ๋ฅ ํ ์คํธ
- ์์น ๊ถํ ํ์ฉ/๊ฑฐ๋ถ ๋ชจ๋ ์ ์ ์ฒ๋ฆฌ๋๋๊ฐ?
- ๋น ๊ฒ์์ด ์ ๋ ฅ ์ ์๋ด๊ฐ ์ ํํ๊ฐ?
- ๊ฒ์ ๊ฒฐ๊ณผ ์์ ์ผ์ด์ค๊ฐ ์ ์ ์๋ด๋๋๊ฐ?
- ์ฃผ๋ณ ์์ค 0๊ฑด/๋ค๊ฑด ์ํฉ์์ UI๊ฐ ๊นจ์ง์ง ์๋๊ฐ?
ํธํ์ฑ ํ ์คํธ
- Chrome, Edge ์ต์ ๋ฒ์ ์์ ๋์ํ๋๊ฐ?
- ๋ชจ๋ฐ์ผ ํด์๋(360px~430px)์์ ๋ฒํผ ์ฌ์ฉ์ฑ์ด ์ ์ง๋๋๊ฐ?
์์ ์ฑ ํ ์คํธ
- ์ธ๋ถ API ์๋ต ์ง์ฐ ์ ์ฑ์ด ๋ฉ์ถ์ง ์๋๊ฐ?
- ๋ฐ๋ณต ํด๋ฆญ ์ ์ค๋ณต ์์ฒญ์ด ๊ณผ๋ํ๊ฒ ๋ฐ์ํ์ง ์๋๊ฐ?
============================================================================
์คํ ๋ฐฉ๋ฒ (์ฝ๋ ์ถ๊ฐ ์ดํ ๊ธฐ์ค)
- ํ๋ก์ ํธ ๋ฃจํธ์์ ๋ก์ปฌ ์๋ฒ ์คํ
Python: python -m http.server 5500
Node.js: npx serve .
- ๋ธ๋ผ์ฐ์ ์์ http://localhost:5500 ์ ์
============================================================================
ํ๋ก์ ํธ ํ์ผ ๊ตฌ์ฑ (๋ชฉํ)
- README.md : ํ๋ก์ ํธ ์ค๋ช ๋ฌธ์
- index.html : ํ๋ฉด ๊ตฌ์กฐ
- style.css : ์คํ์ผ ๋ฐ ๋ฐ์ํ ๋ ์ด์์
- app.js : ์ง๋/์์น/๊ฒ์/์ฃผ๋ณ์์ค ๋ก์ง
============================================================================
๋ค์ ๋ฒ์ ๋ชฉํ (v0.3)
- ์ฆ๊ฒจ์ฐพ๊ธฐ(์ง/ํ์ฌ) ์ ์ฅ
- ์ต๊ทผ ๊ฒ์ ์๋์์ฑ
- ์์ค ์นดํ ๊ณ ๋ฆฌ ํ์ฅ (ATM, ์ฃผ์ ์, ํ์ฅ์ค)
- ํ๊ตญ์ด/์์ด UI ์ ํ
- ์๋ฒ ํ๋ก์ ๊ธฐ๋ฐ API ์์ ํ
์ฅ๊ธฐ ๋ชฉํ (v1.0)
- ์ฌ์ฉ์ ๊ณ์ ๋ฐ ํด๋ผ์ฐ๋ ๋๊ธฐํ
- ์ค์๊ฐ ๊ตํต/์ฌ๊ณ /๊ณต์ฌ ์ ๋ณด ์ฐ๋
- ๊ฐ์ธํ ์ถ์ฒ ๊ฒฝ๋ก ๋ฐ ์ฅ์ ์ ์
============================================================================
์์ธ ๋ช ์ธ ๋ถ๋ก 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 ์คํ ๋ฐฉ๋ฒ๋ง์ผ๋ก ํ์์ด ์ฌํ ๊ฐ๋ฅ
- ํต์ฌ ๊ธฐ๋ฅ FR-01~FR-05 ์ ๋ถ ๋์
- ์ฃผ์ ์๋ฌ ์ฝ๋ LMN-001~LMN-006 ์ฒ๋ฆฌ
- ๋ชจ๋ฐ์ผ 360px ํ๊ฒฝ์์ ๊ธฐ๋ฅ ์ฌ์ฉ ๊ฐ๋ฅ
- Chrome/Edge ์ต์ ๋ฒ์ ์๋ ํ ์คํธ ํต๊ณผ
- 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 ํค ๋ณดํธ
- ์บ์/๋ ์ดํธ๋ฆฌ๋ฐ ์ค์ ํต์
- ์๋ฌ ๋ชจ๋ํฐ๋ง ์ผ์ํ
==============================================================================