Skip to content

About

๐Ÿšฒ AI ๋ฏธ์…˜ํ˜• ์ž์ „๊ฑฐ ๋™๋„ค ์—ฌํ–‰ - ๋‚˜๋“ค(Nadle) -ใ€ํ–‰์ •์•ˆ์ „๋ถ€ใ€‘ย 2026๋…„ ์ „๊ตญ ํ†ตํ•ฉ๋ฐ์ดํ„ฐ ํ™œ์šฉ ๊ณต๋ชจ์ „

Resources

Stars

0 stars

Watchers

0 watching

Forks

Latest commit

ย 

History

48 Commits

Folders and files

Repository files navigation

๐Ÿšฒ Nadle

AI๊ฐ€ ์—ฌํ–‰ ์ทจํ–ฅ๊ณผ ํ˜„์žฌ ์œ„์น˜๋ฅผ ์ดํ•ดํ•˜๊ณ , ์ž์ „๊ฑฐ๋กœ ์ฆ๊ธฐ๋Š” ๋™๋„ค ์—ฌํ–‰์„ ์„ค๊ณ„ํ•˜๋Š” ๋ฏธ์…˜ํ˜• ๋ชจ๋นŒ๋ฆฌํ‹ฐ ์„œ๋น„์Šค

AI Route Recommendation ยท Public Bike Station ยท Kakao Map ยท Mission & Stamp ยท Local Discovery

Vue Vite Pinia Tailwind CSS Kakao Map


2026 ์ „๊ตญ ํ†ตํ•ฉ๋ฐ์ดํ„ฐ ํ™œ์šฉ ๊ณต๋ชจ์ „ ยท Mobile First Web ยท 6-Step Riding Flow ยท Location Based Experience


Overview

**Nadle(๋‚˜๋“ค)**์€ ์‚ฌ์šฉ์ž์˜ ํ˜„์žฌ ์œ„์น˜์™€ ์›ํ•˜๋Š” ์—ฌํ–‰ ๋ถ„์œ„๊ธฐ๋ฅผ ๋ฐ”ํƒ•์œผ๋กœ AI๊ฐ€ ์ž์ „๊ฑฐ ์—ฌํ–‰ ์ฝ”์Šค๋ฅผ ์ถ”์ฒœํ•˜๊ณ , ๊ณต๊ณต ์ž์ „๊ฑฐ ๋Œ€์—ฌ์†Œยท๊ด€๊ด‘์ง€ยท๋ฏธ์…˜ยท์ฃผ๋ณ€ ์ƒ๊ถŒ์„ ํ•˜๋‚˜์˜ ์—ฌํ–‰ ํ๋ฆ„์œผ๋กœ ์—ฐ๊ฒฐํ•˜๋Š” ๋ชจ๋ฐ”์ผ ์›น ์„œ๋น„์Šค์ž…๋‹ˆ๋‹ค.

๋‹จ์ˆœํžˆ ๋ชฉ์ ์ง€๊นŒ์ง€ ๋น ๋ฅด๊ฒŒ ์ด๋™ํ•˜๋Š” ๊ธธ์ฐพ๊ธฐ๋ณด๋‹ค,

โ€œ์˜ค๋Š˜ ๋™๋„ค์—์„œ ์–ด๋””๋ฅผ, ์–ด๋–ค ๋ฐฉ์‹์œผ๋กœ ์ฆ๊ธธ ๊ฒƒ์ธ๊ฐ€?โ€

์— ์ง‘์ค‘ํ–ˆ์Šต๋‹ˆ๋‹ค.

์‚ฌ์šฉ์ž๋Š” ํ…Œ๋งˆ ๋˜๋Š” ์ž์—ฐ์–ด ์š”์ฒญ์œผ๋กœ ์—ฌํ–‰์„ ์‹œ์ž‘ํ•˜๊ณ , ์ถ”์ฒœ ๊ด€๊ด‘์ง€๋ฅผ ํ™•์ธํ•œ ๋’ค ์ฃผ๋ณ€ ์ž์ „๊ฑฐ ๋Œ€์—ฌ์†Œ์—์„œ ์ถœ๋ฐœํ•ฉ๋‹ˆ๋‹ค. ์ฃผํ–‰ ์ค‘ ๊ฐ ์žฅ์†Œ์—์„œ ๋ฏธ์…˜์„ ์ˆ˜ํ–‰ํ•ด ์Šคํƒฌํ”„๋ฅผ ๋ชจ์œผ๊ณ , ๋งˆ์ง€๋ง‰์—๋Š” ๋ฐ˜๋‚ฉ ๋Œ€์—ฌ์†Œ์™€ ์—ฌํ–‰ ๊ฒฐ๊ณผ, ์ฃผ๋ณ€์— ๋” ๋“ค๋ฅผ ๋งŒํ•œ ์žฅ์†Œ๊นŒ์ง€ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.


Service Flow

flowchart LR
    A[ํ…Œ๋งˆ / ์ž์œ  ํ”„๋กฌํ”„ํŠธ] --> B[AI ์ฝ”์Šค ์ถ”์ฒœ]
    B --> C[์ถ”์ฒœ ๊ด€๊ด‘์ง€ ํ™•์ธยท์กฐ์ •]
    C --> D[์ฃผ๋ณ€ ์ž์ „๊ฑฐ ๋Œ€์—ฌ์†Œ ์„ ํƒ]
    D --> E[์ž์ „๊ฑฐ ์—ฌํ–‰ ์‹œ์ž‘]
    E --> F[๊ด€๊ด‘์ง€๋ณ„ ๋ฏธ์…˜ ์ˆ˜ํ–‰]
    F --> G[์Šคํƒฌํ”„ ํš๋“]
    G --> H{๋‹ค์Œ ๋ชฉ์ ์ง€?}
    H -- Yes --> E
    H -- No --> I[๋ฐ˜๋‚ฉ ๋Œ€์—ฌ์†Œ ์•ˆ๋‚ด]
    I --> J[์—ฌํ–‰ ๊ฒฐ๊ณผ]
    J --> K[์ฃผ๋ณ€ ์ƒ๊ถŒ ํƒ์ƒ‰]
Loading

์‹ค์ œ ๋ผ์šฐํŒ…๋„ ์ด ์‚ฌ์šฉ์ž ์—ฌ์ •์„ ๊ธฐ์ค€์œผ๋กœ 6๊ฐœ์˜ ๋‹จ๊ณ„๋ณ„ View๋กœ ๋ถ„๋ฆฌํ–ˆ์Šต๋‹ˆ๋‹ค.

/map/theme
   โ†“
/map/preview
   โ†“
/map/station
   โ†“
/map/riding
   โ†“
/map/return
   โ†“
/map/result

Core Experience

1. ๐Ÿค– ์ž์—ฐ์–ด ๊ธฐ๋ฐ˜ AI ์ฝ”์Šค ์ถ”์ฒœ

์‚ฌ์šฉ์ž๋Š” ๋ฏธ๋ฆฌ ์ค€๋น„๋œ ํ…Œ๋งˆ๋ฅผ ์„ ํƒํ•˜๊ฑฐ๋‚˜ ์›ํ•˜๋Š” ์—ฌํ–‰ ์กฐ๊ฑด์„ ์ง์ ‘ ์ž…๋ ฅํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด,

๋ฒš๊ฝƒ์„ ๋ณผ ์ˆ˜ ์žˆ๋Š” 1์‹œ๊ฐ„์งœ๋ฆฌ ์ฝ”์Šค ์ถ”์ฒœํ•ด์ค˜
์กฐ์šฉํ•œ ๊ณจ๋ชฉ๊ณผ ์นดํŽ˜๋ฅผ ๋“ค๋ฅด๋Š” ์ฝ”์Šค๋กœ ๋ฐ”๊ฟ”์ค˜

์ฒ˜๋Ÿผ ์ž…๋ ฅํ•˜๋ฉด ํ˜„์žฌ ์œ„์น˜ ๋˜๋Š” ์„ ํƒํ•œ ๋Œ€์—ฌ์†Œ ์ขŒํ‘œ์™€ ํ•จ๊ป˜ ์ถ”์ฒœ API๋กœ ์ „๋‹ฌํ•ฉ๋‹ˆ๋‹ค.

์ถ”์ฒœ ๊ฒฐ๊ณผ๊ฐ€ ๋งˆ์Œ์— ๋“ค์ง€ ์•Š๋Š” ๊ฒฝ์šฐ ๊ธฐ์กด ํ…Œ๋งˆ์™€ ์ถ”๊ฐ€ ์š”์ฒญ์„ ํ•ฉ์ณ ์ฝ”์Šค๋ฅผ ๋‹ค์‹œ ์กฐ์ •ํ•˜๋Š” ๋Œ€ํ™”ํ˜• ํ๋ฆ„์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.


2. ๐Ÿ“ GPS์™€ ๊ณต๊ณต ์ž์ „๊ฑฐ ๋Œ€์—ฌ์†Œ ์—ฐ๊ฒฐ

๋ธŒ๋ผ์šฐ์ € Geolocation API๋กœ ํ˜„์žฌ ์œ„์น˜๋ฅผ ๊ฐ€์ ธ์˜ค๊ณ  ์ฃผ๋ณ€ ๋Œ€์—ฌ์†Œ๋ฅผ ์กฐํšŒํ•ฉ๋‹ˆ๋‹ค.

์œ„์น˜ ์ •๋ณด๋Š” ์•ฑ ์ง„์ž… ์ฆ‰์‹œ ํ•ญ์ƒ ์ค€๋น„๋˜๋Š” ๊ฐ’์ด ์•„๋‹ˆ๊ธฐ ๋•Œ๋ฌธ์—, ๋‹จ์ˆœํžˆ lat/lng ์กด์žฌ ์—ฌ๋ถ€๋งŒ ํ™•์ธํ•˜์ง€ ์•Š๊ณ  GPS ์‘๋‹ต์„ ์ผ์ • ์‹œ๊ฐ„ ๊ธฐ๋‹ค๋ฆฌ๋Š” waitForCoords() ํ๋ฆ„์„ ๋ถ„๋ฆฌํ–ˆ์Šต๋‹ˆ๋‹ค.

flowchart LR
    A[์•ฑ ์ง„์ž…] --> B[์œ„์น˜ ๊ถŒํ•œ ์š”์ฒญ]
    B --> C{GPS ์‘๋‹ต}
    C -- ์„ฑ๊ณต --> D[ํ˜„์žฌ ์ขŒํ‘œ ์‚ฌ์šฉ]
    C -- ์ง€์—ฐ --> E[์ตœ๋Œ€ ๋Œ€๊ธฐ]
    E --> D
    C -- ๊ฑฐ๋ถ€ / ์‹คํŒจ --> F[์„ ํƒ ๋Œ€์—ฌ์†Œ ์ขŒํ‘œ ๋˜๋Š” ๊ธฐ๋ณธ ์ขŒํ‘œ]
    D --> G[์ฃผ๋ณ€ ๋Œ€์—ฌ์†Œ / AI ์ถ”์ฒœ ์š”์ฒญ]
    F --> G
Loading

๋Œ€์—ฌ์†Œ ๋ฐ์ดํ„ฐ๋Š” ํ™”๋ฉด์ด API ์›๋ณธ ํ•„๋“œ์— ์ง์ ‘ ์˜์กดํ•˜์ง€ ์•Š๋„๋ก stationId, stationName, parkingBikeTotCnt ๋“ฑ์˜ ์‘๋‹ต์„ ํ”„๋ก ํŠธ์—”๋“œ ๋ชจ๋ธ๋กœ ์ •๊ทœํ™”ํ•ฉ๋‹ˆ๋‹ค.


3. ๐Ÿ—บ๏ธ ์ง€๋„ ์ค‘์‹ฌ ๋ชจ๋ฐ”์ผ ๊ฒฝํ—˜

Kakao Map์„ ๊ณตํ†ต ์ง€๋„ ์ปดํฌ๋„ŒํŠธ๋กœ ๋ถ„๋ฆฌํ•˜๊ณ  ํ™”๋ฉด์— ๋”ฐ๋ผ ๊ด€๊ด‘์ง€, ๋Œ€์—ฌ์†Œ, ํ˜„์žฌ ์œ„์น˜, ์ฃผ๋ณ€ ์ƒ๊ถŒ ๋“ฑ์˜ Marker๋ฅผ ์กฐํ•ฉํ•ฉ๋‹ˆ๋‹ค.

  • AI ์ถ”์ฒœ ๊ด€๊ด‘์ง€ ์ง€๋„ ํ‘œ์‹œ
  • ์ฃผ๋ณ€ ๊ณต๊ณต ์ž์ „๊ฑฐ ๋Œ€์—ฌ์†Œ Marker
  • ๋Œ€์—ฌ์†Œ / ๊ด€๊ด‘์ง€ ์ƒ์„ธ Bottom Sheet
  • ๋ผ์ด๋”ฉ ์ค‘ ๋ชฉ์ ์ง€ ํ™•์ธ
  • ์—ฌํ–‰ ์ข…๋ฃŒ ํ›„ ๋ฐฉ๋ฌธ ์ฝ”์Šค ์ง€๋„
  • ์ฃผ๋ณ€ ์ƒ๊ถŒ ์œ„์น˜ ํ‘œ์‹œ

๋ณต์žกํ•œ ์ง€๋„ ํ™”๋ฉด์„ View ๋‚ด๋ถ€์— ์ง์ ‘ ๊ตฌํ˜„ํ•˜์ง€ ์•Š๊ณ  KakaoMap, MapPreviewSection, ๊ฐ Detail Sheet๋กœ ์—ญํ• ์„ ๋‚˜๋ˆด์Šต๋‹ˆ๋‹ค.


4. ๐ŸŽฎ ์ด๋™์„ ๊ฒฝํ—˜์œผ๋กœ ๋ฐ”๊พธ๋Š” ๋ฏธ์…˜ ์‹œ์Šคํ…œ

๊ฐ ๊ด€๊ด‘์ง€๋Š” ๋‹จ์ˆœ ์ฒดํฌํฌ์ธํŠธ๊ฐ€ ์•„๋‹ˆ๋ผ ๋ฏธ์…˜์„ ์ˆ˜ํ–‰ํ•˜๋Š” ์žฅ์†Œ๊ฐ€ ๋ฉ๋‹ˆ๋‹ค.

ํ˜„์žฌ ํ”„๋ก ํŠธ์—”๋“œ์—๋Š” ๋‹ค์Œ ๋ฏธ์…˜ UI๊ฐ€ ์ปดํฌ๋„ŒํŠธ ๋‹จ์œ„๋กœ ๋ถ„๋ฆฌ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.

Mission Experience
๐Ÿ“ท Photo ์žฅ์†Œ์—์„œ ์‚ฌ์ง„ ์ธ์ฆ ๊ฒฝํ—˜
โญ•โŒ O/X Quiz ๊ด€๊ด‘์ง€์™€ ์—ฐ๊ฒฐ๋œ ํ€ด์ฆˆ ์ˆ˜ํ–‰
โฑ๏ธ Rest ์—ฌํ–‰ ์ค‘ ์ž ์‹œ ์‰ฌ์–ด ๊ฐ€๋Š” ํƒ€์ด๋จธ

์‚ฌ์šฉ์ž๊ฐ€ ๋„์ฐฉ์„ ํ™•์ธํ•˜๊ณ  ๋ฏธ์…˜์„ ์™„๋ฃŒํ•˜๋ฉด ํ˜„์žฌ ๋ชฉ์ ์ง€ index๋ฅผ ์ด๋™์‹œํ‚ค๊ณ  ์Šคํƒฌํ”„๋ฅผ ๋ผ์ด๋”ฉ ์ƒํƒœ์— ๋ˆ„์ ํ•ฉ๋‹ˆ๋‹ค.


5. ๐Ÿ ์—ฌํ–‰ ์ข…๋ฃŒ ํ›„์—๋„ ์ด์–ด์ง€๋Š” ๊ฒฝํ—˜

๋งˆ์ง€๋ง‰ ๋ชฉ์ ์ง€๋ฅผ ์™„๋ฃŒํ•˜๋ฉด ์—ฌํ–‰์€ ๋‹จ์ˆœ ์ข…๋ฃŒ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

  • ์ฃผ๋ณ€ ๋ฐ˜๋‚ฉ ๋Œ€์—ฌ์†Œ ์•ˆ๋‚ด
  • ํš๋“ํ•œ ์Šคํƒฌํ”„ ํ‘œ์‹œ
  • ์ด ๊ฑฐ๋ฆฌ / ์†Œ์š” ์‹œ๊ฐ„ / ๋ฐฉ๋ฌธ ์ฝ”์Šค ์š”์•ฝ
  • ์ „์ฒด ๋ฐฉ๋ฌธ ๊ฒฝ๋กœ ์ง€๋„
  • ๋งˆ์ง€๋ง‰ ์œ„์น˜ ์ฃผ๋ณ€ ์ƒ๊ถŒ ์ถ”์ฒœ
  • ์Œ์‹์ ยท์นดํŽ˜ ๋“ฑ ์นดํ…Œ๊ณ ๋ฆฌ ํ•„ํ„ฐ ๋ฐ ํŽ˜์ด์ง€๋„ค์ด์…˜
  • ๊ณผ๊ฑฐ ์—ฌํ–‰ ๊ธฐ๋ก ํ™”๋ฉด

์ฆ‰, ์ถ”์ฒœ โ†’ ์ด๋™ โ†’ ์ฒดํ—˜ โ†’ ๊ธฐ๋ก โ†’ ์ง€์—ญ ์†Œ๋น„ ํƒ์ƒ‰๊นŒ์ง€ ํ•˜๋‚˜์˜ ์‚ฌ์šฉ์ž ์—ฌ์ •์œผ๋กœ ๊ตฌ์„ฑํ–ˆ์Šต๋‹ˆ๋‹ค.


Frontend Architecture

flowchart TB
    UI[Vue Views / Components]

    subgraph State[Pinia Stores]
        R[Ride Store]
        L[Location Store]
        H[History Store]
    end

    subgraph API[API Layer]
        C[HTTP Client]
        ROUTE[Route Recommend]
        STATION[Stations]
        SPOT[Tour Spots]
        STORE[Nearby Stores]
    end

    MAP[Kakao Map SDK]
    GEO[Browser Geolocation]
    BACKEND[Nadle Backend API]

    UI --> State
    UI --> API
    UI --> MAP

    L --> GEO
    R --> ROUTE

    ROUTE --> C
    STATION --> C
    SPOT --> C

    C --> BACKEND
    STORE --> BACKEND
Loading

์ƒํƒœ์˜ ์ฑ…์ž„ ๋ถ„๋ฆฌ

Store Responsibility
useRideStore ํ”„๋กฌํ”„ํŠธ, ์„ ํƒ ๋Œ€์—ฌ์†Œ, ์ถ”์ฒœ ๊ด€๊ด‘์ง€, ํ˜„์žฌ ๋ชฉ์ ์ง€, ์Šคํƒฌํ”„, ๋ผ์ด๋”ฉ ์ƒํƒœ
useLocationStore GPS ์š”์ฒญ ์ƒํƒœ, ์ขŒํ‘œ, ๊ถŒํ•œ ์˜ค๋ฅ˜, ๋น„๋™๊ธฐ ์ขŒํ‘œ ๋Œ€๊ธฐ
useHistoryStore ์™„๋ฃŒ๋œ ์—ฌํ–‰๊ณผ ๋ˆ„์  ์Šคํƒฌํ”„

ํŽ˜์ด์ง€๋ฅผ ์ด๋™ํ•ด๋„ ์—ฌํ–‰ ๋งฅ๋ฝ์ด ์œ ์ง€๋˜์–ด์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ํ™”๋ฉด ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์•„๋‹Œ Pinia Store๋ฅผ ๋ผ์ด๋”ฉ ์„ธ์…˜์˜ ๋‹จ์ผ ์ƒํƒœ ์ค‘์‹ฌ์ ์œผ๋กœ ์‚ฌ์šฉํ–ˆ์Šต๋‹ˆ๋‹ค.


Engineering Highlights

1. GPS ๋น„๋™๊ธฐ์„ฑ์„ ์ƒํƒœ๋กœ ๋‹ค๋ค˜์Šต๋‹ˆ๋‹ค

๋ชจ๋ฐ”์ผ ์›น์—์„œ๋Š” ์‚ฌ์šฉ์ž๊ฐ€ ์œ„์น˜ ๊ถŒํ•œ ํŒ์—…์— ์‘๋‹ตํ•˜๋Š” ์‹œ๊ฐ„๊ณผ GPS ์ขŒํ‘œ๊ฐ€ ๋ฐ˜ํ™˜๋˜๋Š” ์‹œ๊ฐ„์ด ์ผ์ •ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์ด๋ฅผ ๋‹จ์ˆœ ๋กœ๋”ฉ ์—ฌ๋ถ€๊ฐ€ ์•„๋‹ˆ๋ผ

idle โ†’ loading โ†’ ok
               โ†˜ denied
               โ†˜ unavailable
               โ†˜ error

์ƒํƒœ๋กœ ๊ด€๋ฆฌํ•˜๊ณ , API ํ˜ธ์ถœ ์ „์— ์ขŒํ‘œ๊ฐ€ ์ค€๋น„๋  ๋•Œ๊นŒ์ง€ ๊ธฐ๋‹ค๋ฆฌ๋Š” ํ๋ฆ„์„ ๋ณ„๋„๋กœ ๊ตฌํ˜„ํ–ˆ์Šต๋‹ˆ๋‹ค.


2. AI API์˜ ๋ถˆ์•ˆ์ •ํ•œ ์š”์ฒญ ์กฐ๊ฑด์— ๋Œ€์‘ํ–ˆ์Šต๋‹ˆ๋‹ค

์ถ”์ฒœ API๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ GET query ๋ฐฉ์‹์œผ๋กœ ํ˜ธ์ถœํ•˜์ง€๋งŒ, ๊ธด ์ž์—ฐ์–ด ์š”๊ตฌ์‚ฌํ•ญ์ด๋‚˜ ์ธํ”„๋ผ ์ƒํƒœ์— ๋”ฐ๋ผ 502 / 503 / 504๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋Š” ์ƒํ™ฉ์„ ๊ณ ๋ คํ–ˆ์Šต๋‹ˆ๋‹ค.

flowchart LR
    A[GET /routes/recommend] --> B{Response}
    B -- 2xx --> C[๊ฒฐ๊ณผ ์ •๊ทœํ™”]
    B -- 502/503/504 --> D[POST JSON ์žฌ์‹œ๋„]
    D --> C
Loading

๋˜ํ•œ ๋ฐฑ์—”๋“œ ์‘๋‹ต์ด spots, destinations, waypoints, route.spots ๋“ฑ์œผ๋กœ ๋‹ฌ๋ผ์งˆ ์ˆ˜ ์žˆ๋Š” ์ƒํ™ฉ์„ API ๊ณ„์ธต์—์„œ ํก์ˆ˜ํ•ด View๊ฐ€ ์‘๋‹ต ๊ตฌ์กฐ ๋ณ€ํ™”์— ์ง์ ‘ ๋…ธ์ถœ๋˜์ง€ ์•Š๋„๋ก ํ–ˆ์Šต๋‹ˆ๋‹ค.


3. ๊ฐœ๋ฐœํ™˜๊ฒฝ CORS ๋ฌธ์ œ๋ฅผ Vite Proxy๋กœ ๋ถ„๋ฆฌํ–ˆ์Šต๋‹ˆ๋‹ค

๋กœ์ปฌ ํ”„๋ก ํŠธ์—”๋“œ์—์„œ ์™ธ๋ถ€ ๋ฐฑ์—”๋“œ๋กœ ์ง์ ‘ ์š”์ฒญํ•  ๋•Œ ๋ฐœ์ƒํ•˜๋Š” CORS ๋ฌธ์ œ๋ฅผ ๊ฐœ๋ฐœ ์ฝ”๋“œ ๊ณณ๊ณณ์—์„œ ์šฐํšŒํ•˜์ง€ ์•Š๊ณ  Vite ๊ฐœ๋ฐœ ์„œ๋ฒ„์˜ /api Proxy๋กœ ํ†ต์ผํ–ˆ์Šต๋‹ˆ๋‹ค.

Development
Browser โ†’ /api/... โ†’ Vite Proxy โ†’ Backend

Production
Browser โ†’ VITE_API_BASE_URL โ†’ Backend

๋А๋ฆฐ ์™ธ๋ถ€ ์„œ๋ฒ„๋‚˜ cold start ์ƒํ™ฉ๋„ ๊ณ ๋ คํ•ด ๊ฐœ๋ฐœ Proxy timeout์„ ๋ณ„๋„๋กœ ์„ค์ •ํ–ˆ์Šต๋‹ˆ๋‹ค.


4. ์™ธ๋ถ€ ๋ฐ์ดํ„ฐ๋Š” ํ™”๋ฉด ์ „์— ์ •๊ทœํ™”ํ•ฉ๋‹ˆ๋‹ค

๊ณต๊ณต ๋ฐ์ดํ„ฐ์™€ ๋ฐฑ์—”๋“œ ์‘๋‹ต์€ ๋™์ผํ•œ ์˜๋ฏธ์˜ ๊ฐ’๋„ ์—ฌ๋Ÿฌ ์ด๋ฆ„์œผ๋กœ ๋‚ด๋ ค์˜ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด ๋Œ€์—ฌ์†Œ์˜ ์ž์ „๊ฑฐ ์ˆ˜์™€ ์œ„์น˜๋ฅผ ํ™”๋ฉด์ด ์ง์ ‘ ํ•ด์„ํ•˜์ง€ ์•Š๊ณ  API ๊ณ„์ธต์—์„œ ๋‹ค์Œ์ฒ˜๋Ÿผ ํ†ต์ผํ•ฉ๋‹ˆ๋‹ค.

stationId / id
stationName / name
lat / latitude
lng / longitude / lon
parkingBikeTotCnt / availableBikes
rackTotCnt / totalSlots
                โ†“
        Frontend Station Model

๊ฑฐ๋ฆฌ ์ •๋ณด๊ฐ€ ์—†์œผ๋ฉด Haversine ๊ณต์‹์„ ์ด์šฉํ•ด ๊ธฐ์ค€ ์ขŒํ‘œ์™€ ๋Œ€์—ฌ์†Œ ์‚ฌ์ด์˜ ๊ฑฐ๋ฆฌ๋ฅผ ๊ณ„์‚ฐํ•˜๊ณ , API ์žฅ์•  ์‹œ ๊ฐœ๋ฐœ ํ๋ฆ„์„ ์œ ์ง€ํ•  ์ˆ˜ ์žˆ๋„๋ก ๋Œ€์—ฌ์†Œ Mock fallback๋„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.


5. ์‚ฌ์šฉ์ž ์—ฌ์ •๊ณผ ์ปดํฌ๋„ŒํŠธ ๊ตฌ์กฐ๋ฅผ ๋งž์ท„์Šต๋‹ˆ๋‹ค

Nadle์€ ํ•˜๋‚˜์˜ ๊ฑฐ๋Œ€ํ•œ ์ง€๋„ ํŽ˜์ด์ง€๊ฐ€ ์•„๋‹ˆ๋ผ ์—ฌํ–‰ ์ƒํƒœ๊ฐ€ ๋‹จ๊ณ„์ ์œผ๋กœ ๋ณ€ํ•˜๋Š” ์„œ๋น„์Šค์ž…๋‹ˆ๋‹ค.

๊ทธ๋ž˜์„œ ํ™”๋ฉด์€ Journey ๋‹จ๊ณ„๋ณ„ View๋กœ, ๋‚ด๋ถ€ ๊ธฐ๋Šฅ์€ ๋„๋ฉ”์ธ๋ณ„ Component๋กœ ๋‚˜๋ˆด์Šต๋‹ˆ๋‹ค.

Views
โ”œโ”€ Theme Setup
โ”œโ”€ AI Route Preview
โ”œโ”€ Station Select
โ”œโ”€ Active Riding
โ”œโ”€ Return Guide
โ””โ”€ Result

Components
โ”œโ”€ ai/
โ”œโ”€ map/
โ”œโ”€ mission/
โ””โ”€ ui/

๋ผ์šฐํŠธ ๋‹จ์œ„ ์ฝ”๋“œ ์Šคํ”Œ๋ฆฌํŒ…์„ ์œ„ํ•ด Vue Router์˜ dynamic import๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.


Tech Stack

Area Technology
Framework Vue 3
Build Tool Vite 8
State Pinia 2
Routing Vue Router 4
Styling Tailwind CSS 3, PostCSS
Map Kakao Maps JavaScript SDK
Location Browser Geolocation API
Icons Lucide Vue Next, Twemoji
HTTP Fetch API + custom API client
Image Tooling Sharp
Deployment Config Vercel SPA Rewrite

API Integration

Domain Endpoint / Role
AI Route /api/v1/routes/recommend
Bike Station /api/v1/stations/nearby, /api/v1/stations/{id}
Tourism Spot ์ฃผ๋ณ€ ๊ด€๊ด‘์ง€ ๋ฐ ์ƒ์„ธ ๋ฐ์ดํ„ฐ ๋ณ€ํ™˜
Local Store /api/v1/stores/nearby

ํ”„๋ก ํŠธ์—”๋“œ๋Š” ๊ฐ ๋„๋ฉ”์ธ API๋ฅผ src/api์—์„œ ๋ถ„๋ฆฌํ•˜๊ณ , ํ™”๋ฉด์— ์ „๋‹ฌํ•˜๊ธฐ ์ „์— ์‘๋‹ต ํŒŒ์‹ฑยท์˜ค๋ฅ˜ ์ฒ˜๋ฆฌยทํ•„๋“œ ์ •๊ทœํ™”๋ฅผ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.


Project Structure

src/
โ”œโ”€ api/
โ”‚  โ”œโ”€ client.js             # ๊ณตํ†ต fetch client / API base URL
โ”‚  โ”œโ”€ routes.js             # AI ์ฝ”์Šค ์ถ”์ฒœ
โ”‚  โ”œโ”€ stations.js           # ๋Œ€์—ฌ์†Œ ์กฐํšŒยท์ƒ์„ธยท์‘๋‹ต ์ •๊ทœํ™”
โ”‚  โ”œโ”€ spots.js              # ๊ด€๊ด‘์ง€ ์กฐํšŒยท๋ชจ๋ธ ๋ณ€ํ™˜
โ”‚  โ””โ”€ stores.js             # ์ฃผ๋ณ€ ์ƒ๊ถŒ ์กฐํšŒ
โ”‚
โ”œโ”€ components/
โ”‚  โ”œโ”€ ai/                   # ํ…Œ๋งˆ ์นด๋“œ, AI ์ฑ„ํŒ… ์ž…๋ ฅ
โ”‚  โ”œโ”€ map/                  # KakaoMap, Marker, ์ƒ์„ธ Sheet
โ”‚  โ”œโ”€ mission/              # ์‚ฌ์ง„, O/X, ํœด์‹ ๋ฏธ์…˜
โ”‚  โ””โ”€ ui/                   # ๊ณตํ†ต UI
โ”‚
โ”œโ”€ layouts/                 # ์ƒ๋‹จ Logo / ํ•˜๋‹จ Tab Navigation
โ”‚
โ”œโ”€ router/                  # 6๋‹จ๊ณ„ Journey Routing
โ”‚
โ”œโ”€ stores/
โ”‚  โ”œโ”€ useRideStore.js       # ๋ผ์ด๋”ฉ ์„ธ์…˜
โ”‚  โ”œโ”€ useLocationStore.js   # ์œ„์น˜/GPS ์ƒํƒœ
โ”‚  โ””โ”€ useHistoryStore.js    # ์—ฌํ–‰ ๊ธฐ๋ก
โ”‚
โ”œโ”€ utils/                   # ๊ฑฐ๋ฆฌ ๊ณ„์‚ฐ ๋“ฑ ๊ณตํ†ต ์œ ํ‹ธ
โ”‚
โ””โ”€ views/
   โ”œโ”€ MapTab/
   โ”‚  โ”œโ”€ 1_ThemeSetupView.vue
   โ”‚  โ”œโ”€ 2_AiRoutePreviewView.vue
   โ”‚  โ”œโ”€ 3_StationSelectView.vue
   โ”‚  โ”œโ”€ 4_ActiveRidingView.vue
   โ”‚  โ”œโ”€ 5_ReturnGuideView.vue
   โ”‚  โ””โ”€ 6_ResultView.vue
   โ””โ”€ HistoryTab/

Getting Started

Requirements

  • Node.js
  • npm
  • Kakao Maps JavaScript App Key
  • Nadle Backend API

Installation

git clone https://github.com/Dev-SangWoo/Nadle-Front.git
cd Nadle-Front
npm install

ํ™˜๊ฒฝ ๋ณ€์ˆ˜ ํŒŒ์ผ์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

cp .env.example .env
VITE_KAKAO_MAP_APP_KEY=YOUR_KAKAO_JAVASCRIPT_KEY
VITE_API_BASE_URL=YOUR_BACKEND_BASE_URL

๊ฐœ๋ฐœ ์„œ๋ฒ„ ์‹คํ–‰:

npm run dev

ํ”„๋กœ๋•์…˜ ๋นŒ๋“œ:

npm run build

Current Scope

Nadle์€ ๊ณต๋ชจ์ „ MVP๋ฅผ ๋ชฉํ‘œ๋กœ ํ•ต์‹ฌ ์—ฌํ–‰ ํ๋ฆ„์„ ์šฐ์„  ๊ตฌํ˜„ํ–ˆ์Šต๋‹ˆ๋‹ค.

ํ˜„์žฌ ๊ตฌํ˜„ ์ƒํƒœ๋ฅผ ๋ช…ํ™•ํžˆ ๊ตฌ๋ถ„ํ•˜๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

Implemented

  • ํ…Œ๋งˆ / ์ž์—ฐ์–ด ๊ธฐ๋ฐ˜ AI ๊ฒฝ๋กœ ์š”์ฒญ
  • AI ์ถ”์ฒœ ๊ฒฐ๊ณผ ์žฌ์กฐ์ •
  • ๋ธŒ๋ผ์šฐ์ € GPS ์œ„์น˜ ์ฒ˜๋ฆฌ
  • ์ฃผ๋ณ€ ๊ณต๊ณต ์ž์ „๊ฑฐ ๋Œ€์—ฌ์†Œ ์กฐํšŒ ๋ฐ ์ƒ์„ธ UI
  • Kakao Map ๊ธฐ๋ฐ˜ ์ง€๋„ ๊ฒฝํ—˜
  • 6๋‹จ๊ณ„ ๋ผ์ด๋”ฉ Journey
  • ๋ฏธ์…˜ UI ๋ฐ ์Šคํƒฌํ”„ ์ง„ํ–‰ ์ƒํƒœ
  • ๋ฐ˜๋‚ฉ ๋Œ€์—ฌ์†Œ ์•ˆ๋‚ด
  • ์—ฌํ–‰ ๊ฒฐ๊ณผ ์ง€๋„์™€ ์š”์•ฝ
  • ์ฃผ๋ณ€ ์ƒ๊ถŒ ์ถ”์ฒœยทํ•„ํ„ฐยทํŽ˜์ด์ง€๋„ค์ด์…˜
  • ์—ฌํ–‰ ๊ธฐ๋ก ํ™”๋ฉด

Prototype / Next Step

  • ์‚ฌ์ง„ ๋ฏธ์…˜์˜ ์‹ค์ œ ์ด๋ฏธ์ง€ ์ธ์ฆ
  • ์—ฌํ–‰ ๊ธฐ๋ก์˜ ์„œ๋ฒ„ ์˜์†ํ™”
  • ์‹ค์ œ ์ฃผํ–‰ ๊ฑฐ๋ฆฌยท์‹œ๊ฐ„ GPS Tracking
  • ๋ฏธ์…˜ ์™„๋ฃŒ ์กฐ๊ฑด์˜ ์œ„์น˜ ๊ธฐ๋ฐ˜ ์ž๋™ ๊ฒ€์ฆ
  • ์ถ”์ฒœ ์‹คํŒจ ์ „๋žต๊ณผ ์‚ฌ์šฉ์ž ์žฌ์‹œ๋„ UX ๊ณ ๋„ํ™”
  • ํ…Œ์ŠคํŠธ ์ž๋™ํ™” ๋ฐ CI ๊ตฌ์ถ•

Project Goal

Nadle์ด ํ•ด๊ฒฐํ•˜๋ ค๋Š” ๋ฌธ์ œ๋Š” ๋‹จ์ˆœํžˆ **โ€œ์ž์ „๊ฑฐ ๊ธธ์„ ์ถ”์ฒœํ•˜๋Š” ๊ฒƒโ€**์ด ์•„๋‹™๋‹ˆ๋‹ค.

๊ณต๊ณต ์ž์ „๊ฑฐ์™€ ์ง€์—ญ ๋ฐ์ดํ„ฐ๋ฅผ ํ™œ์šฉํ•ด ์ด๋™ ์ž์ฒด๋ฅผ ํ•˜๋‚˜์˜ ์ž‘์€ ์—ฌํ–‰์œผ๋กœ ๋งŒ๋“ค๊ณ ,

๊ณต๊ณต ์ž์ „๊ฑฐ ์ด์šฉ
      +
์ง€์—ญ ๊ด€๊ด‘์ง€ ๋ฐœ๊ฒฌ
      +
๊ฒŒ์ž„ํ˜• ๋ฏธ์…˜ ๊ฒฝํ—˜
      +
์ฃผ๋ณ€ ์ƒ๊ถŒ ์—ฐ๊ฒฐ

์ด๋ผ๋Š” ํ๋ฆ„์œผ๋กœ ์‚ฌ์šฉ์ž๊ฐ€ ์ต์ˆ™ํ•œ ๋™๋„ค๋ฅผ ๋‹ค์‹œ ๋ฐœ๊ฒฌํ•˜๋„๋ก ๋งŒ๋“œ๋Š” ๊ฒƒ์ด ๋ชฉํ‘œ์ž…๋‹ˆ๋‹ค.

About

๐Ÿšฒ AI ๋ฏธ์…˜ํ˜• ์ž์ „๊ฑฐ ๋™๋„ค ์—ฌํ–‰ - ๋‚˜๋“ค(Nadle) -ใ€ํ–‰์ •์•ˆ์ „๋ถ€ใ€‘ย 2026๋…„ ์ „๊ตญ ํ†ตํ•ฉ๋ฐ์ดํ„ฐ ํ™œ์šฉ ๊ณต๋ชจ์ „

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages