AI ๊ธฐ๋ฐ ์บ ํผ์ค ๊ณต๊ฐ ์ถ์ฒ ์๋น์ค์ ๋ฐฑ์๋(Spring Boot) ๋ ํฌ์งํ ๋ฆฌ์ ๋๋ค. ์ฌ์ฉ์์ ๋ชฉ์ ยท์์นยทํผ์ก๋๋ฅผ ๋ฐ์ํ์ฌ ์ต์ ์ ๊ณต๊ฐ์ ์ถ์ฒํ๋ฉฐ, FastAPI ๊ธฐ๋ฐ AI ์๋ฒ์ ํต์ ํ์ฌ ์ถ๋ก ๊ฒฐ๊ณผ๋ฅผ ํตํฉํฉ๋๋ค.
Java 21
Spring Boot 3.x
Gradle
Lombok
FastAPI (AI ์๋ฒ, Python)
ํด๋ผ์ด์ธํธ(React Native)์์ ์์ฒญํ ์ถ์ฒ API ์ ๊ณต
AI ์๋ฒ(FastAPI)์ NLP/์ถ์ฒ ๋ชจ๋ธ๊ณผ ํต์
์ฌ์ฉ์ ์์น ๊ธฐ๋ฐ ๊ฑฐ๋ฆฌ ๊ณ์ฐ (Haversine ๊ณต์)
DB ์์ด ํ๋์ฝ๋ฉ๋ ๊ณต๊ฐ ์ ๋ณด๋ก ์๋น์ค ์ด์ (ํด์ปคํค ์ต์ ํ)
2.1 application.properties ์ค์
src/main/resources/application.properties
server.port=8080
ai.server.url=http://localhost:8001
spring.jackson.deserialization.fail-on-unknown-properties=false spring.jackson.deserialization.accept-single-value-as-array=true
-
FastAPI AI ์๋ฒ ์คํ cd ai-server uvicorn main:app --reload --port 8001
-
Spring Boot ์คํ
IntelliJ / VSCode์์ EverywhereApplication.java ์คํ ๋๋
./gradlew bootRun
3.1 ์ธ์์ ์กฐํ API (View 1) Method URL ์ค๋ช GET /api/v1/congestion ํน์ ๊ณต๊ฐ์ ์์ธก ์ธ์์ ์กฐํ Request Params ํ๋ ํ์ ์์ spaceId Long 201 latitude Double 37.5526 longitude Double 126.9392
3.2 ์ต์ ๊ณต๊ฐ ์ถ์ฒ API (View 2) Method URL ์ค๋ช POST /api/v1/recommendation ์ฌ์ฉ์ ๋ชฉ์ ยท์์น ๊ธฐ๋ฐ ์ต์ ๊ณต๊ฐ ์ถ์ฒ Request Body (JSON) ํ๋ ํ์ (BE DTO) ์์ ์ค๋ช userId String "1001" ๋ฌธ์์ด๋ก ์ ๋ฌํด์ผ ํ์ฑ ์ค๋ฅ ๋ฐฉ์ง currentLatitude Double 37.5520 ์ฌ์ฉ์ ์๋ currentLongitude Double 126.9390 ์ฌ์ฉ์ ๊ฒฝ๋ currentFloor String "1" ํ์ฌ ์ธต (๋ฌธ์์ด๋ก ์ ๋ฌ) purpose String "study" ์ถ์ฒ ๋ชฉ์ ํ ์คํธ
4.1 FastAPI ํธ์ถ ๊ตฌ์กฐ ๋ชฉ์ BE ๋ฉ์๋ FastAPI ์๋ํฌ์ธํธ ํผ์ก๋ ์์ธก (Model 1) aiServerService.callAiModel1() POST /ai/predict/count ๊ณต๊ฐ ์ถ์ฒ (NLP + Model2) aiServerService.callAiModel2() POST /api/internal/ai/recommendation
4.2 ๊ณต๊ฐ ์ถ์ฒ ์ฒ๋ฆฌ ํ๋ฆ
Spring Boot๊ฐ ์ฌ์ฉ์ ์์น๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ๋ชจ๋ ๊ณต๊ฐ๊ณผ์ ๊ฑฐ๋ฆฌ(Haversine) ๋ฅผ ๊ณ์ฐ
๊ณต๊ฐ ํน์ง + ๊ฑฐ๋ฆฌ + ์ฌ์ฉ์ ๋ชฉ์ ์ ์กฐํฉํ์ฌ AiRecommendationRequest DTO ์์ฑ
FastAPI์ ์ ๋ฌ โ NLP ๊ธฐ๋ฐ purposeScore ๊ณ์ฐ
๋ชจ๋ธ2 ๊ฐ์ค์น๋ก ์ถ์ฒ ์ ์ ์ต์ข ์ฐ์ถ
Spring Boot๊ฐ ์๋ต์ ์ ๋ ฌํ์ฌ ํด๋ผ์ด์ธํธ์ ๋ฐํ
์๋ฒ ์คํ ์ค ์๋ URL ์ ์: