"์ธ๋ถ ์ง๋์ ์ค๋ด ๋๋ฉด์ ํ๋์ ๊ธธ์ฐพ๊ธฐ ๊ฒฝํ์ผ๋ก ์ฐ๊ฒฐํ๋ ๋ฐฑ์๋." Insideout Backend๋ ์ฌ์ฉ์ ์น์ฑ๊ณผ ๊ด๋ฆฌ์ ์น์ฑ์ด ๊ณตํต์ผ๋ก ์ฌ์ฉํ๋ API ์๋ฒ์ ๋๋ค. ์ฅ์ ๊ฒ์, ์ค๋ด์ธ ํตํฉ ๊ฒฝ๋ก ํ์, AI ๋๋ฉด ๋ถ์ ๊ฒฐ๊ณผ ๊ด๋ฆฌ, ์ง๋ ํธ์ง Draft/Publish ํ์ดํ๋ผ์ธ, ๊ฑด๋ฌผยท์ธตยท์ถ์ ๊ตฌยทPOI ๋ฐ์ดํฐ ๊ด๋ฆฌ๋ฅผ ๋ด๋นํ๋ฉฐ ์์ฉ ์ง๋ API์ ์์ฒด ์ค๋ด ๊ทธ๋ํ ๋ฐ์ดํฐ๋ฅผ ์ฐ๊ฒฐํด ์ต์ข ๋ชฉ์ ์ง๊น์ง ์ด์ด์ง๋ ํ์ด๋ธ๋ฆฌ๋ ๋ด๋น๊ฒ์ด์ ์๋น์ค๋ฅผ ์ ๊ณตํฉ๋๋ค.
Insideout ํ๋ก์ ํธ๋ฅผ ์ด๋ ์์์๋ง์ ์๊ฐํฉ๋๋ค.
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
์ฌ์ฉ์๊ฐ ์
๋ ฅํ ํค์๋๋ฅผ ๊ธฐ์ค์ผ๋ก Insideout์ ์ค๋ด ์ง๋๊ฐ ๊ตฌ์ถ๋ ๋ฑ๋ก ๊ฑด๋ฌผ/POI์ Kakao Local ๊ธฐ๋ฐ ์ธ๋ถ ์ฅ์๋ฅผ ํจ๊ป ์กฐํํฉ๋๋ค. ๋ฑ๋ก๋ ์ฅ์๋ placeId, buildingId, poiId, isRegistered ๋ฉํ๋ฐ์ดํฐ๋ฅผ ํฌํจํด ํ๋ก ํธ์๋๊ฐ ๊ณง๋ฐ๋ก ์ค๋ด ๋ชฉ์ ์ง ๊ธธ์ฐพ๊ธฐ๋ก ์ด์ด๊ฐ ์ ์๋๋ก ์ค๊ณํ์ต๋๋ค.
- ํค์๋ ๊ฒ์: ๋ฑ๋ก ์ฅ์ ์ฐ์ ์กฐํ ํ ์ธ๋ถ ์ฅ์ ๋ณํฉ
- ์๋์์ฑ: Elasticsearch ๊ฒฐ๊ณผ๋ฅผ ์ฐ์ ์ฌ์ฉํ๊ณ ๋ถ์กฑํ ๊ฒฝ์ฐ Kakao Local fallback
- ์ง๋ ํด๋ฆญ ์กฐํ: ์ขํ ๊ธฐ๋ฐ ๊ฐ์ฅ ๊ฐ๊น์ด ๋ฑ๋ก ์ฅ์ ๋๋ ์ธ๋ถ ์ฅ์ ํ์
- ์์ธ ์กฐํ:
placeId๋๋externalApiId๊ธฐ๋ฐ ๊ฑด๋ฌผ/์ค๋ด POI ์ ๋ณด ์ ๊ณต
Tmap์ ๋๋ณดยท์๋์ฐจยท๋์ค๊ตํต ๊ฒฝ๋ก์ ์์ฒด ์ค๋ด ๊ทธ๋ํ ๋ผ์ฐํ ์ ๊ฒฐํฉํด ํ๋์ ์๋ต์ผ๋ก ์ ๊ณตํฉ๋๋ค. ๋ชฉ์ ์ง๊ฐ ์ค๋ด POI์ธ ๊ฒฝ์ฐ ๊ฑด๋ฌผ ์ถ์ ๊ตฌ ๋งคํ ์ ๋ณด๋ฅผ ๊ธฐ์ค์ผ๋ก ์ธ๋ถ ๊ฒฝ๋ก์ ๋์ฐฉ์ ์ ๋ณด์ ํ๊ณ , ์ดํ ์ค๋ด ๋ ธ๋/์ฃ์ง ๊ทธ๋ํ๋ฅผ ๋ฐ๋ผ ์ต์ข ๋ชฉ์ ์ง๊น์ง์ ๊ฒฝ๋ก๋ฅผ ์ด์ด ๋ถ์ ๋๋ค.
WGS84์ขํ ๊ธฐ๋ฐ ์ธ๋ถ ๊ฒฝ๋ก์ ํฝ์ ์ขํ ๊ธฐ๋ฐ ์ค๋ด ๊ฒฝ๋ก๋ฅผ ํ๋์Leg๋ชฉ๋ก์ผ๋ก ๋ฐํ- ๋๋ณด, ์๋์ฐจ, ๋์ค๊ตํต ์ต์ ์ ๋์ผํ ์๋ต ๊ตฌ์กฐ๋ก ์ ๊ณต
- ์ค๋ด-only, ์ค์ธ-to-์ค๋ด, ์ค๋ด-to-์ค์ธ, ์ค๋ด-to-์ค๋ด ์๋๋ฆฌ์ค ์ง์
- ๊ณ๋จ/์ฅ์ ๋ฌผ ๊ฐ์ค์น ์กฐ์ ์ ํตํ
์ต๋จ ๊ฑฐ๋ฆฌ๋ฐํธ์ํ ๊ธธ์ต์ ์ ๊ณต - ์ธต ์ด๋ ์ ์๋ฆฌ๋ฒ ์ดํฐ/๊ณ๋จ ๋ฑ ์์ง ์ด๋์๋จ์ ๋ณ๋ ๋จ๊ณ๋ก ํํ
๊ด๋ฆฌ์ ์น์ฑ์์ AI๊ฐ ์ถ์ถํ ๋๋ฉด ๊ฐ์ฒด๋ฅผ ๋ฐํ์ผ๋ก ์ค๋ด ์ง๋ ๋ฐ์ดํฐ๋ฅผ ํธ์งํ๊ณ , ๊ฒ์ ์๋ฃ ํ ์ฌ์ฉ์ ์๋น์ค์ ๋ ธ์ถ ๊ฐ๋ฅํ Published Map์ผ๋ก ์ ํํฉ๋๋ค.
- ๊ฑด๋ฌผ ๋จ์ Draft ์ด๊ธฐํ ๋ฐ ์ธต๋ณ ํธ์ง ๋ฐ์ดํฐ ์กฐํ
- Node, Edge, Zone, POI, Floorplan Object ์ ์ฅ
- ์๋ฆฌ๋ฒ ์ดํฐ/๊ณ๋จ ๋ฑ ์์ง ์ด๋์๋จ ์์ฑยท์์ ยท์ญ์ ยท์ธต๋ณ ๋ ธ๋ ๋งคํ
- POI์ Kakao ์ฅ์ ID ๋ฐ ์๊ฒฝ๋ ์ขํ ๋งคํ
- Draft ๊ฒ์ฆ ํ Published ๋ฒ์ ์ผ๋ก ๋ฐฐํฌ
๋ณ๋ AI ์๋ฒ์ ํต์ ํด ์ค๋ด ๋๋ฉด ๋ฐ ์บ ํผ์ค ์ง๋ ์ด๋ฏธ์ง ๋ถ์์ ์์ฒญํ๊ณ , ๊ฐ์ง๋ ๊ฐ์ฒด๋ฅผ ๋ฐฑ์๋ ๋ฐ์ดํฐ ๋ชจ๋ธ์ ์ ์ฅํฉ๋๋ค. ์ดํ ์ง๋ ํธ์ง๊ธฐ๋ ์ ์ฅ๋ detection ๊ฒฐ๊ณผ๋ฅผ ๊ธฐ๋ฐ์ผ๋ก Draft ๋งต์ ์ด๊ธฐํํฉ๋๋ค.
- ์ธต๋ณ ์ค๋ด ๋๋ฉด ๋ถ์ ์์ฒญ ๋ฐ detection ๊ฒฐ๊ณผ ์กฐํ
- ์บ ํผ์ค ์ง๋ ๋ถ์ ์์ฒญ ๋ฐ detection ๊ฒฐ๊ณผ ์กฐํ
- AI ์๋ฒ API Key ํค๋ ๊ธฐ๋ฐ ๋ด๋ถ ์๋น์ค ์ธ์ฆ
- AI ๋ถ์ ๊ฒฐ๊ณผ๋ฅผ ๊ด๋ฆฌ์ ํธ์ง ํ๋ก์ฐ์ ์ด๊ธฐ ๋ฐ์ดํฐ๋ก ํ์ฉ
๊ด๋ฆฌ์๋ ๋ณธ์ธ์ด ์์๋ Tenant ๋ฒ์ ์์์ ์บ ํผ์ค, ๊ฑด๋ฌผ, ์ธต, ๋๋ฉด, ์ถ์
๊ตฌ, ์ถ์
๊ตฌ-๋
ธ๋ ๋งคํ์ ๊ด๋ฆฌํฉ๋๋ค. ์ฃผ์ ๊ด๋ฆฌ์ API๋ JWT ์ธ์ฆ ์ฌ์ฉ์์ tenantId ์์ ๊ด๊ณ๋ฅผ ๊ฒ์ฆํ ๋ค ์คํ๋ฉ๋๋ค.
- Tenant ์์ฑ ๋ฐ ํ์ฑ/๋นํ์ฑ ์ํ ๊ด๋ฆฌ
- ๊ฑด๋ฌผ, ์ธต, ๋๋ฉด, ์ถ์ ๊ตฌ ์์ฑ ๋ฐ ์กฐํ
- ์บ ํผ์ค ์ง๋ ์ ๋ก๋ ๋ฐ ๊ด๋ฆฌ
- S3 ํธํ ์คํ ๋ฆฌ์ง์ ๋๋ฉด/์ง๋ ์ด๋ฏธ์ง ์ ์ฅ
- JWT ๊ธฐ๋ฐ ์ฌ์ฉ์/๊ด๋ฆฌ์ ์ธ์ฆ
| 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 ๊ธฐ๋ฐ ์์ธ ์กฐํ |
| Method | Endpoint | Description |
|---|---|---|
POST |
/api/v1/navigation/routes |
๋๋ณด/์๋์ฐจ/๋์ค๊ตํต ๋ฐ ์ค๋ด ๊ฒฝ๋ก ํตํฉ ์กฐํ |
POST |
/api/v1/navigation/transit/routes |
๋์ค๊ตํต ์ค์ฌ ๊ฒฝ๋ก ์กฐํ |
| 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 ์ธ๋ถ ์ฅ์ ๋งคํ ์ ์ฅ |
| 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 |
์บ ํผ์ค ์ง๋ ๋ถ์ ๊ฒฐ๊ณผ ์กฐํ |
| 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 ์์ฑ |
- ๋ฌธ์ : Kakao Local ๊ฒ์ ๊ฒฐ๊ณผ์ Insideout ๋ฑ๋ก ๊ฑด๋ฌผ/POI๋ ์๋ณ์, ์ขํ, ์ค๋ด ์ง๋ ๋ณด์ ์ฌ๋ถ๊ฐ ์๋ก ๋ค๋ฆ ๋๋ค.
- ํด๊ฒฐ: ๊ฒ์ ์๋ต์
externalApiId,buildingId,poiId,isRegistered๋ฅผ ํจ๊ป ๋ด๋ ค์ฃผ๋ ๋จ์ผ DTO๋ฅผ ๊ตฌ์ฑํ์ต๋๋ค. ํ๋ก ํธ์๋๋ ๋์ผํ ๊ฒ์ ๋ชฉ๋ก์์ ์ผ๋ฐ ์ฅ์์ ์ค๋ด ๊ฒฝ๋ก ํ์ ๊ฐ๋ฅํ ์ฅ์๋ฅผ ๊ตฌ๋ถํ๊ณ , ์์ธ ์กฐํ ๋ฐ ๊ธธ์ฐพ๊ธฐ ์์ฒญ๊น์ง ๊ฐ์ ํ์ดํ๋ผ์ธ์ผ๋ก ์ด์ด๊ฐ ์ ์์ต๋๋ค.
- ๋ฌธ์ : ๋๋ณด, ์๋์ฐจ, ๋์ค๊ตํต, ์ค๋ด ๋ผ์ฐํ ์ ๊ฐ๊ฐ ๋ค๋ฅธ ์ธ๋ถ/๋ด๋ถ ๋ฐ์ดํฐ์ ์์กดํ๋ฏ๋ก ์ผ๋ถ ์๋จ๋ง ์คํจํ ์ ์์ต๋๋ค.
- ํด๊ฒฐ:
routes,notFoundRouteTypes,failures,routeMessage๋ฅผ ๋ถ๋ฆฌํด ์๋ตํฉ๋๋ค. ํ๋์ ์ด๋ ์๋จ์ด ์คํจํด๋ ์ ์ฒด ์์ฒญ์ ์คํจ์ํค์ง ์๊ณ , ๊ฐ๋ฅํ ๊ฒฝ๋ก์ ์คํจ ์ฌ์ ๋ฅผ ํจ๊ป ์ ๊ณตํด ์ฌ์ฉ์ ํ๋ฉด์์ ์์ฐ์ค๋ฝ๊ฒ fallback UI๋ฅผ ๊ตฌ์ฑํ ์ ์๊ฒ ํ์ต๋๋ค.
- ๋ฌธ์ : ๊ด๋ฆฌ์๊ฐ ํธ์ง ์ค์ธ ์ง๋ ๋ฐ์ดํฐ๊ฐ ์ฆ์ ์ฌ์ฉ์ ์๋น์ค์ ๋ ธ์ถ๋๋ฉด ๊ฒ์ ์ ๊ฒฝ๋ก ์ค๋ฅ๊ฐ ๋ฐ์ํ ์ ์์ต๋๋ค.
- ํด๊ฒฐ: ํธ์ง ์ค์ธ ๋ฐ์ดํฐ๋ Draft MapVersion์ ์ ์ฅํ๊ณ , ๊ฒ์ ์๋ฃ ์ Published MapVersion์ผ๋ก ์ ํํฉ๋๋ค. ์ฌ์ฉ์ ์ฑ์ Published ๋ฐ์ดํฐ๋ง ์กฐํํ๊ณ , ๊ด๋ฆฌ์ ์ฑ์ Draft๋ฅผ ์ด๊ธฐํยท์์ ยท๋ฐฐํฌํ๋ ๋ณ๋ ํ๋ก์ฐ๋ฅผ ์ฌ์ฉํฉ๋๋ค.
- ๋ฌธ์ : ์ค๋ด ๊ฒฝ๋ก๋ ๋จ์ 2D ์ต๋จ ๊ฑฐ๋ฆฌ๋ฟ ์๋๋ผ ์๋ฆฌ๋ฒ ์ดํฐ, ๊ณ๋จ, ์ฅ์ ๋ฌผ, ์ธต ์ด๋ ๋น์ฉ์ ํจ๊ป ๊ณ ๋ คํด์ผ ํฉ๋๋ค.
- ํด๊ฒฐ: ๋ ธ๋/์ฃ์ง ๊ทธ๋ํ์ ์์ง ์ด๋์๋จ๊ณผ ์ฅ์ ๋ฌผ ๊ฐ์ค์น๋ฅผ ๋ฐ์ํ๊ณ , ๊ฒฝ๋ก ์ต์ ์ ๋ฐ๋ผ ๊ณ๋จ/์ฅ์ ๋ฌผ ํจ๋ํฐ๋ฅผ ๋ค๋ฅด๊ฒ ์ ์ฉํ์ต๋๋ค. ์ด๋ฅผ ํตํด ๋น ๋ฅธ ๊ธธ๊ณผ ํธ์ํ ๊ธธ์ ๊ฐ์ ๊ทธ๋ํ ๊ตฌ์กฐ ์์์ ๊ณ์ฐํ ์ ์์ต๋๋ค.
- ๋ฌธ์ : AI detection ๊ฒฐ๊ณผ๋ ๊ทธ๋๋ก ์ฌ์ฉ์ ๊ธธ์ฐพ๊ธฐ์ ์ฌ์ฉํ ์ ์๋ ์ ์ ๋ ์ง๋ ๋ฐ์ดํฐ๊ฐ ์๋๋๋ค.
- ํด๊ฒฐ: AI ๊ฒฐ๊ณผ๋ฅผ Draft ์ด๊ธฐ ๋ฐ์ดํฐ๋ก ๋ณํํ๊ณ , ๊ด๋ฆฌ์๊ฐ Node/Edge/POI/Zone์ ์ง์ ๊ฒ์ยท๋ณด์ ํ ๋ค Published Map์ผ๋ก ๋ฐฐํฌํ๋ ๊ตฌ์กฐ๋ฅผ ์ฑํํ์ต๋๋ค. ์๋ํ์ ์๋์ ์ด์ ๋ฐ์ดํฐ์ ์ ๋ขฐ์ฑ์ ๋์์ ํ๋ณดํ์ต๋๋ค.
๋ชจ๋ API๋ ApiResponse ๋ํผ๋ฅผ ํตํด ์ฑ๊ณต/์คํจ ์๋ต ๊ตฌ์กฐ๋ฅผ ํต์ผํฉ๋๋ค.
{
"isSuccess": true,
"code": "COMMON200",
"message": "์ฑ๊ณต์
๋๋ค.",
"result": {}
}์์ธ๋ ๋๋ฉ์ธ๋ณ ErrorCode์ GlobalExceptionHandler๋ฅผ ํตํด ์ผ๊ด๋ HTTP ์๋ต์ผ๋ก ๋ณํ๋ฉ๋๋ค.



