Skip to content

Latest commit

ย 

History

History
282 lines (197 loc) ยท 14.9 KB

File metadata and controls

282 lines (197 loc) ยท 14.9 KB

๐Ÿ“ Insideout - AI ๊ธฐ๋ฐ˜ ์‹ค๋‚ด์™ธ ํ†ตํ•ฉ ๋‚ด๋น„๊ฒŒ์ด์…˜ (Backend API Server)

"์™ธ๋ถ€ ์ง€๋„์™€ ์‹ค๋‚ด ๋„๋ฉด์„ ํ•˜๋‚˜์˜ ๊ธธ์ฐพ๊ธฐ ๊ฒฝํ—˜์œผ๋กœ ์—ฐ๊ฒฐํ•˜๋Š” ๋ฐฑ์—”๋“œ." Insideout Backend๋Š” ์‚ฌ์šฉ์ž ์›น์•ฑ๊ณผ ๊ด€๋ฆฌ์ž ์›น์•ฑ์ด ๊ณตํ†ต์œผ๋กœ ์‚ฌ์šฉํ•˜๋Š” API ์„œ๋ฒ„์ž…๋‹ˆ๋‹ค. ์žฅ์†Œ ๊ฒ€์ƒ‰, ์‹ค๋‚ด์™ธ ํ†ตํ•ฉ ๊ฒฝ๋กœ ํƒ์ƒ‰, AI ๋„๋ฉด ๋ถ„์„ ๊ฒฐ๊ณผ ๊ด€๋ฆฌ, ์ง€๋„ ํŽธ์ง‘ Draft/Publish ํŒŒ์ดํ”„๋ผ์ธ, ๊ฑด๋ฌผยท์ธตยท์ถœ์ž…๊ตฌยทPOI ๋ฐ์ดํ„ฐ ๊ด€๋ฆฌ๋ฅผ ๋‹ด๋‹นํ•˜๋ฉฐ ์ƒ์šฉ ์ง€๋„ API์™€ ์ž์ฒด ์‹ค๋‚ด ๊ทธ๋ž˜ํ”„ ๋ฐ์ดํ„ฐ๋ฅผ ์—ฐ๊ฒฐํ•ด ์ตœ์ข… ๋ชฉ์ ์ง€๊นŒ์ง€ ์ด์–ด์ง€๋Š” ํ•˜์ด๋ธŒ๋ฆฌ๋“œ ๋‚ด๋น„๊ฒŒ์ด์…˜ ์„œ๋น„์Šค๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.


๐Ÿ‘ฅ ํŒ€์› ์†Œ๊ฐœ (Contributors)

Insideout ํ”„๋กœ์ ํŠธ๋ฅผ ์ด๋ˆ ์–‘์–‘์–‘๋ง์„ ์†Œ๊ฐœํ•ฉ๋‹ˆ๋‹ค.

์ฐจ์Šน์€ ์ด๋ฏผ์ง€ ๊น€๋ฏผ์ค€ ๊น€์„ธํ˜„




๐Ÿ”น Hybrid Navigation
์‚ฌ์šฉ์ž ์›น - BE, FE
๐Ÿ”น Auth, Search, Infra
์‚ฌ์šฉ์ž ์›น - BE, FE
๐Ÿ”น AI Map Builder
๊ด€๋ฆฌ์ž ์›น - AI, FE
๐Ÿ”น Map Editor
๊ด€๋ฆฌ์ž ์›น - BE, FE

๐Ÿ› ๏ธ ๊ธฐ์ˆ  ์Šคํƒ (Tech Stack)

Core & Framework

Security

ORM / Data Access

Database / Search

Storage

API / External API

Deployment / CI-CD


๐Ÿ“‚ ํ”„๋กœ์ ํŠธ ๊ตฌ์กฐ

src/main/java/com/insideout/backend
โ”œโ”€โ”€ domain
โ”‚   โ”œโ”€โ”€ ai            # AI ๋„๋ฉด/์บ ํผ์Šค ๋ถ„์„ ์—ฐ๋™
โ”‚   โ”œโ”€โ”€ building      # ์บ ํผ์Šค, ๊ฑด๋ฌผ, ์ธต, ๋„๋ฉด, ์ถœ์ž…๊ตฌ ๊ด€๋ฆฌ
โ”‚   โ”œโ”€โ”€ map           # ์‹ค๋‚ด ์ง€๋„ ํŽธ์ง‘, Draft/Publish, Published Map ์กฐํšŒ
โ”‚   โ”œโ”€โ”€ navigation    # ์‹ค๋‚ด์™ธ ํ†ตํ•ฉ ๊ฒฝ๋กœ ํƒ์ƒ‰
โ”‚   โ”œโ”€โ”€ place         # ์žฅ์†Œ ๊ฒ€์ƒ‰, ์ž๋™์™„์„ฑ, ์ƒ์„ธ/๊ทผ์ ‘ ์กฐํšŒ
โ”‚   โ”œโ”€โ”€ tenant        # ๋ฉ€ํ‹ฐ ํ…Œ๋„ŒํŠธ ๊ด€๋ฆฌ
โ”‚   โ””โ”€โ”€ user          # ์ธ์ฆ ๋ฐ ์‚ฌ์šฉ์ž ์กฐํšŒ
โ”œโ”€โ”€ global
โ”‚   โ”œโ”€โ”€ apiPayload    # ๊ณตํ†ต ์‘๋‹ต/์˜ˆ์™ธ ํฌ๋งท
โ”‚   โ”œโ”€โ”€ config        # OpenAPI, RestTemplate ๋“ฑ ๊ณตํ†ต ์„ค์ •
โ”‚   โ”œโ”€โ”€ infra         # Kakao, AI, S3 ์™ธ๋ถ€ ์ธํ”„๋ผ ์„ค์ •
โ”‚   โ””โ”€โ”€ security      # Spring Security + JWT
โ””โ”€โ”€ resources
    โ”œโ”€โ”€ db/migration  # Flyway migration
    โ””โ”€โ”€ application*.yml

๐Ÿš€ ๋ฐฑ์—”๋“œ ์ฃผ์š” ๊ธฐ๋Šฅ

๐Ÿ” 1. ๋“ฑ๋ก ์žฅ์†Œ์™€ ์™ธ๋ถ€ ์žฅ์†Œ๋ฅผ ํ†ตํ•ฉํ•˜๋Š” ๊ฒ€์ƒ‰ API

์‚ฌ์šฉ์ž๊ฐ€ ์ž…๋ ฅํ•œ ํ‚ค์›Œ๋“œ๋ฅผ ๊ธฐ์ค€์œผ๋กœ Insideout์— ์‹ค๋‚ด ์ง€๋„๊ฐ€ ๊ตฌ์ถ•๋œ ๋“ฑ๋ก ๊ฑด๋ฌผ/POI์™€ Kakao Local ๊ธฐ๋ฐ˜ ์™ธ๋ถ€ ์žฅ์†Œ๋ฅผ ํ•จ๊ป˜ ์กฐํšŒํ•ฉ๋‹ˆ๋‹ค. ๋“ฑ๋ก๋œ ์žฅ์†Œ๋Š” placeId, buildingId, poiId, isRegistered ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ๋ฅผ ํฌํ•จํ•ด ํ”„๋ก ํŠธ์—”๋“œ๊ฐ€ ๊ณง๋ฐ”๋กœ ์‹ค๋‚ด ๋ชฉ์ ์ง€ ๊ธธ์ฐพ๊ธฐ๋กœ ์ด์–ด๊ฐˆ ์ˆ˜ ์žˆ๋„๋ก ์„ค๊ณ„ํ–ˆ์Šต๋‹ˆ๋‹ค.

  • ํ‚ค์›Œ๋“œ ๊ฒ€์ƒ‰: ๋“ฑ๋ก ์žฅ์†Œ ์šฐ์„  ์กฐํšŒ ํ›„ ์™ธ๋ถ€ ์žฅ์†Œ ๋ณ‘ํ•ฉ
  • ์ž๋™์™„์„ฑ: Elasticsearch ๊ฒฐ๊ณผ๋ฅผ ์šฐ์„  ์‚ฌ์šฉํ•˜๊ณ  ๋ถ€์กฑํ•œ ๊ฒฝ์šฐ Kakao Local fallback
  • ์ง€๋„ ํด๋ฆญ ์กฐํšŒ: ์ขŒํ‘œ ๊ธฐ๋ฐ˜ ๊ฐ€์žฅ ๊ฐ€๊นŒ์šด ๋“ฑ๋ก ์žฅ์†Œ ๋˜๋Š” ์™ธ๋ถ€ ์žฅ์†Œ ํƒ์ƒ‰
  • ์ƒ์„ธ ์กฐํšŒ: placeId ๋˜๋Š” externalApiId ๊ธฐ๋ฐ˜ ๊ฑด๋ฌผ/์‹ค๋‚ด POI ์ •๋ณด ์ œ๊ณต

๐Ÿงญ 2. ์‹ค์™ธ-์‹ค๋‚ด ํ•˜์ด๋ธŒ๋ฆฌ๋“œ ๊ฒฝ๋กœ ํƒ์ƒ‰ ์—”์ง„

Tmap์˜ ๋„๋ณดยท์ž๋™์ฐจยท๋Œ€์ค‘๊ตํ†ต ๊ฒฝ๋กœ์™€ ์ž์ฒด ์‹ค๋‚ด ๊ทธ๋ž˜ํ”„ ๋ผ์šฐํŒ…์„ ๊ฒฐํ•ฉํ•ด ํ•˜๋‚˜์˜ ์‘๋‹ต์œผ๋กœ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ๋ชฉ์ ์ง€๊ฐ€ ์‹ค๋‚ด POI์ธ ๊ฒฝ์šฐ ๊ฑด๋ฌผ ์ถœ์ž…๊ตฌ ๋งคํ•‘ ์ •๋ณด๋ฅผ ๊ธฐ์ค€์œผ๋กœ ์™ธ๋ถ€ ๊ฒฝ๋กœ์˜ ๋„์ฐฉ์ ์„ ๋ณด์ •ํ•˜๊ณ , ์ดํ›„ ์‹ค๋‚ด ๋…ธ๋“œ/์—ฃ์ง€ ๊ทธ๋ž˜ํ”„๋ฅผ ๋”ฐ๋ผ ์ตœ์ข… ๋ชฉ์ ์ง€๊นŒ์ง€์˜ ๊ฒฝ๋กœ๋ฅผ ์ด์–ด ๋ถ™์ž…๋‹ˆ๋‹ค.

  • WGS84 ์ขŒํ‘œ ๊ธฐ๋ฐ˜ ์™ธ๋ถ€ ๊ฒฝ๋กœ์™€ ํ”ฝ์…€ ์ขŒํ‘œ ๊ธฐ๋ฐ˜ ์‹ค๋‚ด ๊ฒฝ๋กœ๋ฅผ ํ•˜๋‚˜์˜ Leg ๋ชฉ๋ก์œผ๋กœ ๋ฐ˜ํ™˜
  • ๋„๋ณด, ์ž๋™์ฐจ, ๋Œ€์ค‘๊ตํ†ต ์˜ต์…˜์„ ๋™์ผํ•œ ์‘๋‹ต ๊ตฌ์กฐ๋กœ ์ œ๊ณต
  • ์‹ค๋‚ด-only, ์‹ค์™ธ-to-์‹ค๋‚ด, ์‹ค๋‚ด-to-์‹ค์™ธ, ์‹ค๋‚ด-to-์‹ค๋‚ด ์‹œ๋‚˜๋ฆฌ์˜ค ์ง€์›
  • ๊ณ„๋‹จ/์žฅ์• ๋ฌผ ๊ฐ€์ค‘์น˜ ์กฐ์ •์„ ํ†ตํ•œ ์ตœ๋‹จ ๊ฑฐ๋ฆฌ ๋ฐ ํŽธ์•ˆํ•œ ๊ธธ ์˜ต์…˜ ์ œ๊ณต
  • ์ธต ์ด๋™ ์‹œ ์—˜๋ฆฌ๋ฒ ์ดํ„ฐ/๊ณ„๋‹จ ๋“ฑ ์ˆ˜์ง ์ด๋™์ˆ˜๋‹จ์„ ๋ณ„๋„ ๋‹จ๊ณ„๋กœ ํ‘œํ˜„

๐Ÿ—บ๏ธ 3. ๊ด€๋ฆฌ์ž ์ง€๋„ ํŽธ์ง‘ Draft/Publish ํŒŒ์ดํ”„๋ผ์ธ

๊ด€๋ฆฌ์ž ์›น์•ฑ์—์„œ AI๊ฐ€ ์ถ”์ถœํ•œ ๋„๋ฉด ๊ฐ์ฒด๋ฅผ ๋ฐ”ํƒ•์œผ๋กœ ์‹ค๋‚ด ์ง€๋„ ๋ฐ์ดํ„ฐ๋ฅผ ํŽธ์ง‘ํ•˜๊ณ , ๊ฒ€์ˆ˜ ์™„๋ฃŒ ํ›„ ์‚ฌ์šฉ์ž ์„œ๋น„์Šค์— ๋…ธ์ถœ ๊ฐ€๋Šฅํ•œ Published Map์œผ๋กœ ์ „ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

  • ๊ฑด๋ฌผ ๋‹จ์œ„ Draft ์ดˆ๊ธฐํ™” ๋ฐ ์ธต๋ณ„ ํŽธ์ง‘ ๋ฐ์ดํ„ฐ ์กฐํšŒ
  • Node, Edge, Zone, POI, Floorplan Object ์ €์žฅ
  • ์—˜๋ฆฌ๋ฒ ์ดํ„ฐ/๊ณ„๋‹จ ๋“ฑ ์ˆ˜์ง ์ด๋™์ˆ˜๋‹จ ์ƒ์„ฑยท์ˆ˜์ •ยท์‚ญ์ œยท์ธต๋ณ„ ๋…ธ๋“œ ๋งคํ•‘
  • POI์™€ Kakao ์žฅ์†Œ ID ๋ฐ ์œ„๊ฒฝ๋„ ์ขŒํ‘œ ๋งคํ•‘
  • Draft ๊ฒ€์ฆ ํ›„ Published ๋ฒ„์ „์œผ๋กœ ๋ฐฐํฌ

๐Ÿค– 4. AI ๋„๋ฉด ๋ถ„์„ ์„œ๋น„์Šค ์—ฐ๋™

๋ณ„๋„ AI ์„œ๋ฒ„์™€ ํ†ต์‹ ํ•ด ์‹ค๋‚ด ๋„๋ฉด ๋ฐ ์บ ํผ์Šค ์ง€๋„ ์ด๋ฏธ์ง€ ๋ถ„์„์„ ์š”์ฒญํ•˜๊ณ , ๊ฐ์ง€๋œ ๊ฐ์ฒด๋ฅผ ๋ฐฑ์—”๋“œ ๋ฐ์ดํ„ฐ ๋ชจ๋ธ์— ์ €์žฅํ•ฉ๋‹ˆ๋‹ค. ์ดํ›„ ์ง€๋„ ํŽธ์ง‘๊ธฐ๋Š” ์ €์žฅ๋œ detection ๊ฒฐ๊ณผ๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ Draft ๋งต์„ ์ดˆ๊ธฐํ™”ํ•ฉ๋‹ˆ๋‹ค.

  • ์ธต๋ณ„ ์‹ค๋‚ด ๋„๋ฉด ๋ถ„์„ ์š”์ฒญ ๋ฐ detection ๊ฒฐ๊ณผ ์กฐํšŒ
  • ์บ ํผ์Šค ์ง€๋„ ๋ถ„์„ ์š”์ฒญ ๋ฐ detection ๊ฒฐ๊ณผ ์กฐํšŒ
  • AI ์„œ๋ฒ„ API Key ํ—ค๋” ๊ธฐ๋ฐ˜ ๋‚ด๋ถ€ ์„œ๋น„์Šค ์ธ์ฆ
  • AI ๋ถ„์„ ๊ฒฐ๊ณผ๋ฅผ ๊ด€๋ฆฌ์ž ํŽธ์ง‘ ํ”Œ๋กœ์šฐ์˜ ์ดˆ๊ธฐ ๋ฐ์ดํ„ฐ๋กœ ํ™œ์šฉ

๐Ÿข 5. ๋ฉ€ํ‹ฐ ํ…Œ๋„ŒํŠธ ๊ธฐ๋ฐ˜ ๊ฑด๋ฌผยท์บ ํผ์Šค ์šด์˜ ๊ด€๋ฆฌ

๊ด€๋ฆฌ์ž๋Š” ๋ณธ์ธ์ด ์†Œ์†๋œ Tenant ๋ฒ”์œ„ ์•ˆ์—์„œ ์บ ํผ์Šค, ๊ฑด๋ฌผ, ์ธต, ๋„๋ฉด, ์ถœ์ž…๊ตฌ, ์ถœ์ž…๊ตฌ-๋…ธ๋“œ ๋งคํ•‘์„ ๊ด€๋ฆฌํ•ฉ๋‹ˆ๋‹ค. ์ฃผ์š” ๊ด€๋ฆฌ์ž API๋Š” JWT ์ธ์ฆ ์‚ฌ์šฉ์ž์™€ tenantId ์†Œ์† ๊ด€๊ณ„๋ฅผ ๊ฒ€์ฆํ•œ ๋’ค ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค.

  • Tenant ์ƒ์„ฑ ๋ฐ ํ™œ์„ฑ/๋น„ํ™œ์„ฑ ์ƒํƒœ ๊ด€๋ฆฌ
  • ๊ฑด๋ฌผ, ์ธต, ๋„๋ฉด, ์ถœ์ž…๊ตฌ ์ƒ์„ฑ ๋ฐ ์กฐํšŒ
  • ์บ ํผ์Šค ์ง€๋„ ์—…๋กœ๋“œ ๋ฐ ๊ด€๋ฆฌ
  • S3 ํ˜ธํ™˜ ์Šคํ† ๋ฆฌ์ง€์— ๋„๋ฉด/์ง€๋„ ์ด๋ฏธ์ง€ ์ €์žฅ
  • JWT ๊ธฐ๋ฐ˜ ์‚ฌ์šฉ์ž/๊ด€๋ฆฌ์ž ์ธ์ฆ

๐Ÿ“Œ ์ฃผ์š” API ๋ช…์„ธ ์š”์•ฝ

Place API

Method Endpoint Description
GET /api/v1/places/search ํ‚ค์›Œ๋“œ ๊ธฐ๋ฐ˜ ์žฅ์†Œ ๊ฒ€์ƒ‰
GET /api/v1/places/suggest ๊ฒ€์ƒ‰์–ด ์ž๋™์™„์„ฑ
GET /api/v1/places/nearest ์ขŒํ‘œ ๊ธฐ์ค€ ๊ฐ€์žฅ ๊ฐ€๊นŒ์šด ์žฅ์†Œ ์กฐํšŒ
GET /api/v1/places/detail placeId ๋˜๋Š” externalApiId ๊ธฐ๋ฐ˜ ์ƒ์„ธ ์กฐํšŒ

Navigation API

Method Endpoint Description
POST /api/v1/navigation/routes ๋„๋ณด/์ž๋™์ฐจ/๋Œ€์ค‘๊ตํ†ต ๋ฐ ์‹ค๋‚ด ๊ฒฝ๋กœ ํ†ตํ•ฉ ์กฐํšŒ
POST /api/v1/navigation/transit/routes ๋Œ€์ค‘๊ตํ†ต ์ค‘์‹ฌ ๊ฒฝ๋กœ ์กฐํšŒ

Map Editor API

Method Endpoint Description
GET /api/v1/map-editor/buildings/{buildingId}/floors/{floorId} ์ธต๋ณ„ ์—๋””ํ„ฐ ์ดˆ๊ธฐ ๋ฐ์ดํ„ฐ ์กฐํšŒ
POST /api/v1/map-editor/buildings/{buildingId}/initialize-draft ๊ฑด๋ฌผ Draft ์ผ๊ด„ ์ดˆ๊ธฐํ™”
PUT /api/v1/map-editor/buildings/{buildingId}/floors/{floorId}/draft ์ธต๋ณ„ Draft ์ €์žฅ
POST /api/v1/map-editor/buildings/{buildingId}/publish Draft ์ตœ์ข… ๋ฐฐํฌ
GET /api/v1/map-editor/buildings/{buildingId}/vertical-connectors ์ˆ˜์ง ์ด๋™์ˆ˜๋‹จ ๋ชฉ๋ก ์กฐํšŒ
POST /api/v1/map-editor/buildings/{buildingId}/vertical-connectors ์ˆ˜์ง ์ด๋™์ˆ˜๋‹จ ์ƒ์„ฑ
PATCH /api/v1/map-editor/buildings/{buildingId}/vertical-connectors/{connectorId} ์ˆ˜์ง ์ด๋™์ˆ˜๋‹จ ์ˆ˜์ •
DELETE /api/v1/map-editor/buildings/{buildingId}/vertical-connectors/{connectorId} ์ˆ˜์ง ์ด๋™์ˆ˜๋‹จ ์‚ญ์ œ
PUT /api/v1/map-editor/buildings/{buildingId}/poi-mappings POI ์™ธ๋ถ€ ์žฅ์†Œ ๋งคํ•‘ ์ €์žฅ

AI API

Method Endpoint Description
POST /api/v1/ai/floorplans/{floorplanId}/analyze ์‹ค๋‚ด ๋„๋ฉด AI ๋ถ„์„ ์š”์ฒญ
GET /api/v1/ai/floorplans/{floorplanId}/detections ์‹ค๋‚ด ๋„๋ฉด ๋ถ„์„ ๊ฒฐ๊ณผ ์กฐํšŒ
POST /api/v1/ai/campuses/{campusMapId}/analyze ์บ ํผ์Šค ์ง€๋„ AI ๋ถ„์„ ์š”์ฒญ
GET /api/v1/ai/campuses/{campusMapId}/detections ์บ ํผ์Šค ์ง€๋„ ๋ถ„์„ ๊ฒฐ๊ณผ ์กฐํšŒ

Building / Campus / Tenant API

Method Endpoint Description
GET /api/v1/buildings ๊ฑด๋ฌผ ๋ชฉ๋ก ์กฐํšŒ
POST /api/v1/buildings ๊ฑด๋ฌผ ์ƒ์„ฑ
POST /api/v1/buildings/{buildingId}/floors ์ธต ์ƒ์„ฑ
POST /api/v1/buildings/{buildingId}/floors/{floorId}/floorplans ์ธต ๋„๋ฉด ์—…๋กœ๋“œ
GET /api/v1/buildings/{buildingId}/entrances ๊ฑด๋ฌผ ์ถœ์ž…๊ตฌ ์กฐํšŒ
POST /api/v1/buildings/{buildingId}/entrances ๊ฑด๋ฌผ ์ถœ์ž…๊ตฌ ์ƒ์„ฑ
POST /api/v1/buildings/{buildingId}/entrance-mappings ์ถœ์ž…๊ตฌ์™€ ์‹ค๋‚ด ๋…ธ๋“œ ๋งคํ•‘
GET /api/v1/campuses ์บ ํผ์Šค ๋ชฉ๋ก ์กฐํšŒ
POST /api/v1/campuses ์บ ํผ์Šค ์ƒ์„ฑ
POST /api/v1/campuses/{campusId}/maps ์บ ํผ์Šค ์ง€๋„ ์—…๋กœ๋“œ
GET /api/v1/tenants/me ๋‚ด Tenant ๋ชฉ๋ก ์กฐํšŒ
POST /api/v1/tenants/create Tenant ์ƒ์„ฑ

๐Ÿ”ฅ ๊ธฐ์ˆ ์  ๋„์ „ ๋ฐ ํ•ด๊ฒฐ ๊ณผ์ œ (Technical Challenges)

1. ์™ธ๋ถ€ ์žฅ์†Œ์™€ ๋“ฑ๋ก ์‹ค๋‚ด POI์˜ ๋‹จ์ผ ๊ฒ€์ƒ‰ ์‘๋‹ต ๋ชจ๋ธ ๊ตฌ์„ฑ

  • ๋ฌธ์ œ: Kakao Local ๊ฒ€์ƒ‰ ๊ฒฐ๊ณผ์™€ Insideout ๋“ฑ๋ก ๊ฑด๋ฌผ/POI๋Š” ์‹๋ณ„์ž, ์ขŒํ‘œ, ์‹ค๋‚ด ์ง€๋„ ๋ณด์œ  ์—ฌ๋ถ€๊ฐ€ ์„œ๋กœ ๋‹ค๋ฆ…๋‹ˆ๋‹ค.
  • ํ•ด๊ฒฐ: ๊ฒ€์ƒ‰ ์‘๋‹ต์— externalApiId, buildingId, poiId, isRegistered๋ฅผ ํ•จ๊ป˜ ๋‚ด๋ ค์ฃผ๋Š” ๋‹จ์ผ DTO๋ฅผ ๊ตฌ์„ฑํ–ˆ์Šต๋‹ˆ๋‹ค. ํ”„๋ก ํŠธ์—”๋“œ๋Š” ๋™์ผํ•œ ๊ฒ€์ƒ‰ ๋ชฉ๋ก์—์„œ ์ผ๋ฐ˜ ์žฅ์†Œ์™€ ์‹ค๋‚ด ๊ฒฝ๋กœ ํƒ์ƒ‰ ๊ฐ€๋Šฅํ•œ ์žฅ์†Œ๋ฅผ ๊ตฌ๋ถ„ํ•˜๊ณ , ์ƒ์„ธ ์กฐํšŒ ๋ฐ ๊ธธ์ฐพ๊ธฐ ์š”์ฒญ๊นŒ์ง€ ๊ฐ™์€ ํŒŒ์ดํ”„๋ผ์ธ์œผ๋กœ ์ด์–ด๊ฐˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

2. ์™ธ๋ถ€ ๊ฒฝ๋กœ API ์‹คํŒจ์—๋„ ๊ฐ€๋Šฅํ•œ ๊ฒฝ๋กœ๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ๋ถ€๋ถ„ ์„ฑ๊ณต ์ „๋žต

  • ๋ฌธ์ œ: ๋„๋ณด, ์ž๋™์ฐจ, ๋Œ€์ค‘๊ตํ†ต, ์‹ค๋‚ด ๋ผ์šฐํŒ…์€ ๊ฐ๊ฐ ๋‹ค๋ฅธ ์™ธ๋ถ€/๋‚ด๋ถ€ ๋ฐ์ดํ„ฐ์— ์˜์กดํ•˜๋ฏ€๋กœ ์ผ๋ถ€ ์ˆ˜๋‹จ๋งŒ ์‹คํŒจํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ํ•ด๊ฒฐ: routes, notFoundRouteTypes, failures, routeMessage๋ฅผ ๋ถ„๋ฆฌํ•ด ์‘๋‹ตํ•ฉ๋‹ˆ๋‹ค. ํ•˜๋‚˜์˜ ์ด๋™ ์ˆ˜๋‹จ์ด ์‹คํŒจํ•ด๋„ ์ „์ฒด ์š”์ฒญ์„ ์‹คํŒจ์‹œํ‚ค์ง€ ์•Š๊ณ , ๊ฐ€๋Šฅํ•œ ๊ฒฝ๋กœ์™€ ์‹คํŒจ ์‚ฌ์œ ๋ฅผ ํ•จ๊ป˜ ์ œ๊ณตํ•ด ์‚ฌ์šฉ์ž ํ™”๋ฉด์—์„œ ์ž์—ฐ์Šค๋Ÿฝ๊ฒŒ fallback UI๋ฅผ ๊ตฌ์„ฑํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ–ˆ์Šต๋‹ˆ๋‹ค.

3. Draft ์ง€๋„์™€ Published ์ง€๋„์˜ ๋ถ„๋ฆฌ

  • ๋ฌธ์ œ: ๊ด€๋ฆฌ์ž๊ฐ€ ํŽธ์ง‘ ์ค‘์ธ ์ง€๋„ ๋ฐ์ดํ„ฐ๊ฐ€ ์ฆ‰์‹œ ์‚ฌ์šฉ์ž ์„œ๋น„์Šค์— ๋…ธ์ถœ๋˜๋ฉด ๊ฒ€์ˆ˜ ์ „ ๊ฒฝ๋กœ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ํ•ด๊ฒฐ: ํŽธ์ง‘ ์ค‘์ธ ๋ฐ์ดํ„ฐ๋Š” Draft MapVersion์— ์ €์žฅํ•˜๊ณ , ๊ฒ€์ˆ˜ ์™„๋ฃŒ ์‹œ Published MapVersion์œผ๋กœ ์ „ํ™˜ํ•ฉ๋‹ˆ๋‹ค. ์‚ฌ์šฉ์ž ์•ฑ์€ Published ๋ฐ์ดํ„ฐ๋งŒ ์กฐํšŒํ•˜๊ณ , ๊ด€๋ฆฌ์ž ์•ฑ์€ Draft๋ฅผ ์ดˆ๊ธฐํ™”ยท์ˆ˜์ •ยท๋ฐฐํฌํ•˜๋Š” ๋ณ„๋„ ํ”Œ๋กœ์šฐ๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

4. ์ธต๊ฐ„ ์ด๋™์„ ํฌํ•จํ•œ ๊ทธ๋ž˜ํ”„ ๋ผ์šฐํŒ… ๊ฐ€์ค‘์น˜ ์„ค๊ณ„

  • ๋ฌธ์ œ: ์‹ค๋‚ด ๊ฒฝ๋กœ๋Š” ๋‹จ์ˆœ 2D ์ตœ๋‹จ ๊ฑฐ๋ฆฌ๋ฟ ์•„๋‹ˆ๋ผ ์—˜๋ฆฌ๋ฒ ์ดํ„ฐ, ๊ณ„๋‹จ, ์žฅ์• ๋ฌผ, ์ธต ์ด๋™ ๋น„์šฉ์„ ํ•จ๊ป˜ ๊ณ ๋ คํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
  • ํ•ด๊ฒฐ: ๋…ธ๋“œ/์—ฃ์ง€ ๊ทธ๋ž˜ํ”„์— ์ˆ˜์ง ์ด๋™์ˆ˜๋‹จ๊ณผ ์žฅ์• ๋ฌผ ๊ฐ€์ค‘์น˜๋ฅผ ๋ฐ˜์˜ํ•˜๊ณ , ๊ฒฝ๋กœ ์˜ต์…˜์— ๋”ฐ๋ผ ๊ณ„๋‹จ/์žฅ์• ๋ฌผ ํŒจ๋„ํ‹ฐ๋ฅผ ๋‹ค๋ฅด๊ฒŒ ์ ์šฉํ–ˆ์Šต๋‹ˆ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ๋น ๋ฅธ ๊ธธ๊ณผ ํŽธ์•ˆํ•œ ๊ธธ์„ ๊ฐ™์€ ๊ทธ๋ž˜ํ”„ ๊ตฌ์กฐ ์œ„์—์„œ ๊ณ„์‚ฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

5. AI ๋ถ„์„ ๊ฒฐ๊ณผ๋ฅผ ์šด์˜ ๊ฐ€๋Šฅํ•œ ์ง€๋„ ๋ฐ์ดํ„ฐ๋กœ ์ „ํ™˜

  • ๋ฌธ์ œ: AI detection ๊ฒฐ๊ณผ๋Š” ๊ทธ๋Œ€๋กœ ์‚ฌ์šฉ์ž ๊ธธ์ฐพ๊ธฐ์— ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ์ •์ œ๋œ ์ง€๋„ ๋ฐ์ดํ„ฐ๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค.
  • ํ•ด๊ฒฐ: AI ๊ฒฐ๊ณผ๋ฅผ Draft ์ดˆ๊ธฐ ๋ฐ์ดํ„ฐ๋กœ ๋ณ€ํ™˜ํ•˜๊ณ , ๊ด€๋ฆฌ์ž๊ฐ€ Node/Edge/POI/Zone์„ ์ง์ ‘ ๊ฒ€์ˆ˜ยท๋ณด์ •ํ•œ ๋’ค Published Map์œผ๋กœ ๋ฐฐํฌํ•˜๋Š” ๊ตฌ์กฐ๋ฅผ ์ฑ„ํƒํ–ˆ์Šต๋‹ˆ๋‹ค. ์ž๋™ํ™”์˜ ์†๋„์™€ ์šด์˜ ๋ฐ์ดํ„ฐ์˜ ์‹ ๋ขฐ์„ฑ์„ ๋™์‹œ์— ํ™•๋ณดํ–ˆ์Šต๋‹ˆ๋‹ค.

๐Ÿงพ ๊ณตํ†ต ์‘๋‹ต ํฌ๋งท

๋ชจ๋“  API๋Š” ApiResponse ๋ž˜ํผ๋ฅผ ํ†ตํ•ด ์„ฑ๊ณต/์‹คํŒจ ์‘๋‹ต ๊ตฌ์กฐ๋ฅผ ํ†ต์ผํ•ฉ๋‹ˆ๋‹ค.

{
  "isSuccess": true,
  "code": "COMMON200",
  "message": "์„ฑ๊ณต์ž…๋‹ˆ๋‹ค.",
  "result": {}
}

์˜ˆ์™ธ๋Š” ๋„๋ฉ”์ธ๋ณ„ ErrorCode์™€ GlobalExceptionHandler๋ฅผ ํ†ตํ•ด ์ผ๊ด€๋œ HTTP ์‘๋‹ต์œผ๋กœ ๋ณ€ํ™˜๋ฉ๋‹ˆ๋‹ค.


๐Ÿ—๏ธ ์‹œ์Šคํ…œ ์•„ํ‚คํ…์ฒ˜ (System Architecture)

image

๐Ÿ”„ ๋ฐ์ดํ„ฐ ํ๋ฆ„๋„ (Data Flow)

image

๐Ÿ’พ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๋ชจ๋ธ๋ง (ERD)

image