Skip to content

TripTalk/BE_FastAPI

Folders and files

NameName
Last commit message
Last commit date

Latest commit

ย 

History

58 Commits
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 

Repository files navigation

๐Ÿค– TripTalk AI Server - FastAPI

Google Gemini 2.0 Flash ๊ธฐ๋ฐ˜ ๋งž์ถคํ˜• ์—ฌํ–‰ ์ผ์ • ์ƒ์„ฑ AI ์„œ๋ฒ„

image

๐Ÿ‘ฅ ํŒ€ ์ •๋ณด

๐Ÿ“‹ ๋ชฉ์ฐจ


๐ŸŽฏ ํ”„๋กœ์ ํŠธ ๊ฐœ์š”

image

TripTalk AI Server๋Š” ์‚ฌ์šฉ์ž์˜ ์—ฌํ–‰ ์Šคํƒ€์ผ, ๋ชฉ์ ์ง€, ์˜ˆ์‚ฐ, ๋™ํ–‰์ธ ์ •๋ณด๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ Google Gemini 2.0 Flash API๋ฅผ ํ™œ์šฉํ•˜์—ฌ ๋งž์ถคํ˜• ์—ฌํ–‰ ์ผ์ •์„ ์ž๋™ ์ƒ์„ฑํ•˜๋Š” FastAPI ๊ธฐ๋ฐ˜ AI ์„œ๋ฒ„์ž…๋‹ˆ๋‹ค.

์ƒ์„ฑ๋œ ์—ฌํ–‰ ๊ณ„ํš์€ JSON ํŒŒ์ผ๋กœ ์ž„์‹œ ์ €์žฅ๋˜๋ฉฐ, ์‚ฌ์šฉ์ž ํ™•์ธ ํ›„ Spring Boot ์„œ๋ฒ„๋กœ ์ „์†ก๋˜์–ด MySQL DB์— ์˜๊ตฌ ์ €์žฅ๋ฉ๋‹ˆ๋‹ค.

ํ•ต์‹ฌ ๊ฐ€์น˜

  • ๐Ÿค– AI ๋งž์ถค ์ถ”์ฒœ: Google Gemini 2.0 Flash ๊ธฐ๋ฐ˜ ๊ฐœ์ธํ™”๋œ ์—ฌํ–‰ ์ผ์ • ์ƒ์„ฑ
  • ๐Ÿ“… ์ƒ์„ธ ์ผ์ •: ์ผ๋ณ„/์‹œ๊ฐ„๋Œ€๋ณ„ ๊ตฌ์ฒด์ ์ธ ์—ฌํ–‰ ๊ณ„ํš (์‹๋‹น, ๊ด€๊ด‘์ง€, ๊ตํ†ตํŽธ ํฌํ•จ)
  • ๐Ÿจ ๊ตํ†ตํŽธ/์ˆ™์†Œ ์ •๋ณด: ์ถœ๋ฐœํŽธ, ๊ท€ํ™˜ํŽธ, ์ˆ™์†Œ ์˜ˆ์•ฝ ์ •๋ณด ์ž๋™ ์ƒ์„ฑ
  • ๐Ÿ”— Spring Boot ์—ฐ๋™: RESTful API ํ†ต์‹ ์œผ๋กœ ์™„๋ฒฝํ•œ ์‹œ์Šคํ…œ ํ†ตํ•ฉ

โœจ ์ฃผ์š” ๊ธฐ๋Šฅ

1. ๐Ÿ—บ๏ธ AI ์—ฌํ–‰ ์ผ์ • ์ƒ์„ฑ

  • Google Gemini 2.0 Flash API ์—ฐ๋™

    • ์‚ฌ์šฉ์ž ์ž…๋ ฅ ๊ธฐ๋ฐ˜ ํ”„๋กฌํ”„ํŠธ ์ƒ์„ฑ
    • ์ž์—ฐ์–ด ๊ธฐ๋ฐ˜ ๊ตฌ์กฐํ™”๋œ JSON ์‘๋‹ต
    • 9๊ฐ€์ง€ ์—ฌํ–‰ ์Šคํƒ€์ผ ๋ถ„์„ (์ฒดํ—˜ยท์•กํ‹ฐ๋น„ํ‹ฐ, ์ž์—ฐ๊ณผ ํ•จ๊ป˜, ์—ฌ์œ ๋กญ๊ฒŒ ํž๋ง ๋“ฑ)
  • ์ƒ์„ธ ์ผ์ • ์ƒ์„ฑ

    • ์ผ๋ณ„ ์Šค์ผ€์ค„ (DailySchedule)
    • ์‹œ๊ฐ„๋Œ€๋ณ„ ์ƒ์„ธ ๊ณ„ํš (ScheduleItem)
    • ์‹ค์ œ ์‹๋‹นยท๊ด€๊ด‘์ง€ ์ด๋ฆ„ ํฌํ•จ
    • ๊ตํ†ตํŽธ ์ •๋ณด (ํ•ญ๊ณต์‚ฌ๋ช…, ์ถœ๋ฐœ/๋„์ฐฉ ์‹œ๊ฐ„, ๊ฐ€๊ฒฉ)
    • ์ˆ™์†Œ ์ •๋ณด (ํ˜ธํ…”๋ช…, ์ฃผ์†Œ, 1๋ฐ• ๊ฐ€๊ฒฉ)
  • ํ•˜์ด๋ผ์ดํŠธ ์ถ”์ถœ

    • ์—ฌํ–‰์˜ ์ฃผ์š” ํฌ์ธํŠธ 3-5๊ฐœ ์ž๋™ ์ƒ์„ฑ
    • ๊ฐ ํ•˜์ด๋ผ์ดํŠธ 100์ž ์ด๋‚ด
image

2. ๐Ÿ“‹ ์—ฌํ–‰ ๊ณ„ํš ๊ด€๋ฆฌ

  • JSON ํŒŒ์ผ ๊ธฐ๋ฐ˜ ์ €์žฅ

    • data/travel_data.json์— ์˜๊ตฌ ์ €์žฅ
    • UUID ๊ธฐ๋ฐ˜ ๊ณ ์œ  ID ์ƒ์„ฑ
    • ์ค‘๋ณต ๋ฐฉ์ง€ ๋กœ์ง (๋™์ผ ์กฐ๊ฑด ์‹œ ์—…๋ฐ์ดํŠธ)
  • ์—ฌํ–‰ ๋ชฉ๋ก ์กฐํšŒ

    • ์ „์ฒด ์—ฌํ–‰ ๋ชฉ๋ก ๋ฐ˜ํ™˜
    • ํŠน์ • ์—ฌํ–‰ ์ƒ์„ธ ์กฐํšŒ
image

3. ๐Ÿ”— Spring Boot ์—ฐ๋™

  • HTTP POST ํ†ต์‹ 

    • FastAPI โ†’ Spring Boot REST API ํ˜ธ์ถœ
    • JSON ๋ฐ์ดํ„ฐ ์ž๋™ ์ง๋ ฌํ™” (camelCase ๋ณ€ํ™˜)
    • ์—๋Ÿฌ ํ•ธ๋“ค๋ง ๋ฐ ์žฌ์‹œ๋„ ๋กœ์ง
  • ๋ฐ์ดํ„ฐ ๋ณ€ํ™˜

    • Pydantic ๋ชจ๋ธ โ†’ JSON (by_alias=True)
    • snake_case โ†’ camelCase ์ž๋™ ๋ณ€ํ™˜
    • Spring Boot DTO ํ˜•์‹์— ๋งž์ถ˜ ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ

๐Ÿ›  ๊ธฐ์ˆ  ์Šคํƒ

Backend

  • Language: Python 3.11+
  • Framework: FastAPI 0.115.5
  • AI: Google Gemini 2.0 Flash API
  • Data Validation: Pydantic 2.10.3
  • HTTP Client: httpx 0.28.1
  • CORS: FastAPI CORS Middleware

Storage

  • File System: JSON ํŒŒ์ผ ๊ธฐ๋ฐ˜ ๋ฐ์ดํ„ฐ ์ €์žฅ
  • Data Format: UTF-8 JSON (ensure_ascii=False)

External APIs

  • Google Gemini API: Gemini 2.0 Flash ๊ธฐ๋ฐ˜ ์—ฌํ–‰ ์ผ์ • ์ƒ์„ฑ
  • Spring Boot API: ์—ฌํ–‰ ๊ณ„ํš DB ์ €์žฅ

๐Ÿ— ์‹œ์Šคํ…œ ์•„ํ‚คํ…์ฒ˜

โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”      โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”      โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚   Client    โ”‚ โ”€โ”€โ”€> โ”‚   FastAPI    โ”‚ โ”€โ”€โ”€> โ”‚   Google    โ”‚
โ”‚  (Mobile)   โ”‚      โ”‚  (AI Server) โ”‚      โ”‚ Gemini 2.0  โ”‚
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜      โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜      โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
                            โ”‚
                            โ”œโ”€โ”€โ”€โ”€โ”€โ”€> Spring Boot API
                            โ”‚        (DB ์ €์žฅ)
                            โ”‚
                            โ””โ”€โ”€โ”€โ”€โ”€โ”€> data/travel_data.json
                                     (์ž„์‹œ ์ €์žฅ)

๋ฐ์ดํ„ฐ ํ”Œ๋กœ์šฐ

1. ์‚ฌ์šฉ์ž ์ž…๋ ฅ (๋ชฉ์ ์ง€, ๊ธฐ๊ฐ„, ์˜ˆ์‚ฐ, ๋™ํ–‰์ธ, ์—ฌํ–‰ ์Šคํƒ€์ผ)
   โ†“
2. FastAPI โ†’ Google Gemini 2.0 Flash API ์š”์ฒญ
   โ†“
3. Gemini โ†’ ๊ตฌ์กฐํ™”๋œ ์—ฌํ–‰ ๊ณ„ํš JSON ์ƒ์„ฑ
   โ†“
4. FastAPI โ†’ Pydantic ๋ชจ๋ธ ๊ฒ€์ฆ ๋ฐ ์ €์žฅ (travel_data.json)
   โ†“
5. ์‚ฌ์šฉ์ž ํ™•์ธ ํ›„ "์ €์žฅ" ๋ฒ„ํŠผ ํด๋ฆญ
   โ†“
6. FastAPI โ†’ Spring Boot API ํ˜ธ์ถœ (POST /api/trip-plan/from-fastapi)
   โ†“
7. Spring Boot โ†’ MySQL DB ์ €์žฅ

๐Ÿ“ฆ ๋ฐ์ดํ„ฐ ๋ชจ๋ธ

Pydantic ๋ชจ๋ธ ๊ตฌ์กฐ

TravelStyle (์—ฌํ–‰ ์Šคํƒ€์ผ)

class TravelStyle(BaseModel):
    category: str  # "์ฒดํ—˜ยท์•กํ‹ฐ๋น„ํ‹ฐ", "์ž์—ฐ๊ณผ ํ•จ๊ป˜", "์—ฌ์œ ๋กญ๊ฒŒ ํž๋ง" ๋“ฑ

ScheduleItem (์ƒ์„ธ ์ผ์ •)

class ScheduleItem(BaseModel):
    order_index: int      # ์ˆœ์„œ
    time: str             # "09:00"
    title: str            # "๊น€ํฌ๊ณตํ•ญ ์ถœ๋ฐœ"
    description: str      # "์ง„์—์–ด LJ313ํŽธ์œผ๋กœ ์ œ์ฃผ ์ถœ๋ฐœ"

DailySchedule (์ผ๋ณ„ ์ผ์ •)

class DailySchedule(BaseModel):
    day: int                          # 1, 2, 3...
    date: str                         # "2025-12-13"
    schedules: List[ScheduleItem]     # ์ƒ์„ธ ์ผ์ • ๋ฆฌ์ŠคํŠธ

TripTransportation (๊ตํ†ตํŽธ)

class TripTransportation(BaseModel):
    origin: str          # "๊น€ํฌ๊ณตํ•ญ"
    destination: str     # "์ œ์ฃผ๊ณตํ•ญ"
    name: str            # "์ง„์—์–ดLJ313"
    price: int           # 45000

TripAccommodation (์ˆ™์†Œ)

class TripAccommodation(BaseModel):
    name: str            # "์ œ์ฃผ์‹ ํ™”์›”๋“œ ํ˜ธํ…”"
    address: str         # "์ œ์ฃผ ์„œ๊ท€ํฌ์‹œ..."
    pricePerNight: int   # 200000

TripPlan (์ „์ฒด ์—ฌํ–‰ ๊ณ„ํš)

class TripPlan(BaseModel):
    title: str                                      # "์ œ์ฃผ๋„ 2๋ฐ• 3์ผ ์šฐ์ • ์—ฌํ–‰"
    destination: str                                # "์ œ์ฃผ๋„"
    departure: str                                  # "์„œ์šธ"
    startDate: str (alias='start_date')            # "2025-12-13"
    endDate: str (alias='end_date')                # "2025-12-15"
    companions: str                                 # "์นœ๊ตฌ"
    budget: str                                     # "70๋งŒ์›"
    travelStyles: List[TravelStyle]                # ์—ฌํ–‰ ์Šคํƒ€์ผ ๋ฆฌ์ŠคํŠธ
    highlights: List[TripHighlight]                # ํ•˜์ด๋ผ์ดํŠธ ๋ฆฌ์ŠคํŠธ
    fullPlan: str (alias='full_plan')              # ์ „์ฒด ํ…์ŠคํŠธ ๊ณ„ํš
    dailySchedules: List[DailySchedule]            # ์ผ๋ณ„ ์ผ์ •
    outboundTransportation: TripTransportation     # ์ถœ๋ฐœ ๊ตํ†ตํŽธ
    returnTransportation: TripTransportation       # ๊ท€ํ™˜ ๊ตํ†ตํŽธ
    accommodations: List[TripAccommodation]        # ์ˆ™์†Œ ๋ฆฌ์ŠคํŠธ

๐Ÿ“ก API ๋ช…์„ธ

Base URL

Production: http://52.78.55.147:8000
Local Development: http://localhost:8000

1. ์—ฌํ–‰ ๊ณ„ํš ์ƒ์„ฑ

์—ฌํ–‰ ๊ณ„ํš ์ƒ์„ฑ ์š”์ฒญ

POST /Travel-Plan
Content-Type: application/json

{
  "companions": "์นœ๊ตฌ",
  "departure": "์„œ์šธ",
  "destination": "์ œ์ฃผ๋„",
  "start_date": "2025-12-13",
  "end_date": "2025-12-15",
  "style": ["์ž์—ฐ๊ณผ ํ•จ๊ป˜", "์—ฌ์œ ๋กญ๊ฒŒ ํž๋ง"],
  "budget": "50๋งŒ์›~70๋งŒ์›"
}

์‘๋‹ต ์˜ˆ์‹œ:

{
  "travel_id": "37488429-3759-4320-9603-a0db0277bd56",
  "title": "์ œ์ฃผ๋„ 2๋ฐ• 3์ผ ์šฐ์ • ์—ฌํ–‰",
  "destination": "์ œ์ฃผ๋„",
  "departure": "์„œ์šธ",
  "start_date": "2025-12-13",
  "end_date": "2025-12-15",
  "companions": "์นœ๊ตฌ",
  "budget": "70๋งŒ์›",
  "travel_styles": [
    {"category": "์ž์—ฐ๊ณผ ํ•จ๊ป˜"}
  ],
  "highlights": [
    {"content": "๊ฒจ์šธ ๋ฐ”๋‹ค ๋งŒ๋ฝํ•˜๋ฉฐ ์šฐ์ • ์Šค๋ƒ… ์ดฌ์˜"},
    {"content": "๋”ฐ๋œปํ•œ ์˜จ์ฒœ์œผ๋กœ ํ”ผ๋กœ ํ’€๊ธฐ"},
    {"content": "์ œ์ฃผ ํ‘๋ผ์ง€ ๋ง›์ง‘ ํƒ๋ฐฉ"}
  ],
  "daily_schedules": [
    {
      "day": 1,
      "date": "2025-12-13",
      "schedules": [
        {
          "order_index": 1,
          "time": "07:30",
          "title": "๋น„ํ–‰๊ธฐ ํƒ‘์Šน",
          "description": "๊น€ํฌ๊ณตํ•ญ์—์„œ ์ง„์—์–ด LJ313ํŽธ์œผ๋กœ ์ œ์ฃผ๋กœ ์ถœ๋ฐœ"
        }
      ]
    }
  ],
  "outbound_transportation": {
    "origin": "๊น€ํฌ๊ณตํ•ญ",
    "destination": "์ œ์ฃผ๊ณตํ•ญ",
    "name": "์ง„์—์–ดLJ313",
    "price": 45000
  },
  "return_transportation": {...},
  "accommodations": [...]
}

2. ์—ฌํ–‰ ๋ชฉ๋ก ์กฐํšŒ

์ „์ฒด ์—ฌํ–‰ ๋ชฉ๋ก

GET /travel-summaries

ํŠน์ • ์—ฌํ–‰ ์ƒ์„ธ ์กฐํšŒ

GET /travel-summary/{travel_id}

3. Spring Boot ์—ฐ๋™

์—ฌํ–‰ ๊ณ„ํš ์ €์žฅ (Spring Boot๋กœ ์ „์†ก)

POST /save-plan/{travel_id}

Response:
{
  "success": true,
  "message": "์—ฌํ–‰ ๊ณ„ํš์ด Spring Boot ์„œ๋ฒ„์— ์„ฑ๊ณต์ ์œผ๋กœ ์ €์žฅ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.",
  "spring_response": {
    "id": 123,
    "title": "์ œ์ฃผ๋„ 2๋ฐ• 3์ผ ์šฐ์ • ์—ฌํ–‰",
    ...
  },
  "fastapi_travel_id": "37488429-3759-4320-9603-a0db0277bd56"
}

๐Ÿš€ ์„ค์น˜ ๋ฐ ์‹คํ–‰

๋ฐฐํฌ ํ™˜๊ฒฝ

ํ˜„์žฌ AWS EC2 (52.78.55.147)์— Docker Compose๋กœ ๋ฐฐํฌ ์šด์˜ ์ค‘์ž…๋‹ˆ๋‹ค.

์„œ๋ฒ„ ์ •๋ณด

Docker Compose๋กœ ์‹คํ–‰

# ์„œ๋ฒ„์—์„œ ์‹คํ–‰
cd /path/to/TripTalk
docker-compose up -d

# ๋กœ๊ทธ ํ™•์ธ
docker-compose logs -f fastapi

# ์žฌ์‹œ์ž‘
docker-compose restart fastapi

# ์ค‘์ง€
docker-compose down

ํ™˜๊ฒฝ๋ณ€์ˆ˜ ์„ค์ •

.env ํŒŒ์ผ:

# Google Gemini API Key
GOOGLE_API_KEY=your-google-gemini-api-key-here

# Spring Boot Server URL (๋ฐฐํฌ ํ™˜๊ฒฝ)
SPRING_BOOT_URL=http://52.78.55.147:8080

๋กœ์ปฌ ๊ฐœ๋ฐœ ํ™˜๊ฒฝ (์„ ํƒ์‚ฌํ•ญ)

์š”๊ตฌ์‚ฌํ•ญ

  • Python 3.11 ์ด์ƒ
  • Google Gemini API Key

1. ๊ฐ€์ƒํ™˜๊ฒฝ ์ƒ์„ฑ ๋ฐ ํ™œ์„ฑํ™”

# ๊ฐ€์ƒํ™˜๊ฒฝ ์ƒ์„ฑ
python3 -m venv venv

# ํ™œ์„ฑํ™” (macOS/Linux)
source venv/bin/activate

2. ํŒจํ‚ค์ง€ ์„ค์น˜

pip install -r requirements.txt

requirements.txt:

fastapi==0.115.5
uvicorn==0.34.0
pydantic==2.10.3
google-generativeai==0.8.3
httpx==0.28.1
python-dotenv==1.0.1

3. ํ™˜๊ฒฝ๋ณ€์ˆ˜ ์„ค์ • (๋กœ์ปฌ)

.env ํŒŒ์ผ:

GOOGLE_API_KEY=your-api-key
SPRING_BOOT_URL=http://localhost:8080

4. ๋กœ์ปฌ ์‹คํ–‰

# ๊ฐœ๋ฐœ ๋ชจ๋“œ
uvicorn AI_Chat:app --reload --host 0.0.0.0 --port 8000

5. API ํ…Œ์ŠคํŠธ

# ๋ฐฐํฌ ์„œ๋ฒ„ ํ…Œ์ŠคํŠธ
curl http://52.78.55.147:8000/travel-summaries

# ๋กœ์ปฌ ํ…Œ์ŠคํŠธ
curl http://localhost:8000/travel-summaries

๐Ÿณ ๋ฐฐํฌ ํ™˜๊ฒฝ (Docker)

ํ˜„์žฌ ๋ฐฐํฌ ์ƒํƒœ

Docker Compose๋กœ ์šด์˜ ์ค‘์ด๋ฉฐ, docker-compose.yml ์„ค์ •:

version: "3.9"

services:
  fastapi:
    build: .
    container_name: fastapi-server
    ports:
      - "8000:8000"
    restart: always
    environment:
      GOOGLE_API_KEY: ${GOOGLE_API_KEY}
      SPRING_BOOT_URL: http://52.78.55.147:8080
    volumes:
      - ./data:/app/data
      - ./outputs:/app/outputs

Dockerfile

FROM python:3.11-slim

WORKDIR /app

COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt

COPY . .

CMD ["uvicorn", "AI_Chat:app", "--host", "0.0.0.0", "--port", "8000"]

๋ฐฐํฌ ๊ด€๋ฆฌ ๋ช…๋ น์–ด

# ์„œ๋ฒ„ ๋ฐฐํฌ (์ฒ˜์Œ ๋˜๋Š” ์ฝ”๋“œ ๋ณ€๊ฒฝ ์‹œ)
docker-compose up -d --build

# ์„œ๋ฒ„ ์žฌ์‹œ์ž‘
docker-compose restart

# ๋กœ๊ทธ ํ™•์ธ
docker-compose logs -f fastapi

# ์„œ๋ฒ„ ์ค‘์ง€
docker-compose down

# ์ปจํ…Œ์ด๋„ˆ ์ƒํƒœ ํ™•์ธ
docker-compose ps

๐Ÿ”— Spring Boot ์—ฐ๋™

์—ฐ๋™ ํ”Œ๋กœ์šฐ

1. FastAPI์—์„œ ์—ฌํ–‰ ๊ณ„ํš ์ƒ์„ฑ โ†’ travel_data.json ์ €์žฅ
2. ์‚ฌ์šฉ์ž ํ™•์ธ ํ›„ "์ €์žฅ" ๋ฒ„ํŠผ ํด๋ฆญ
3. FastAPI โ†’ Spring Boot API ํ˜ธ์ถœ
   POST http://52.78.55.147:8080/api/trip-plan/from-fastapi
4. Spring Boot โ†’ MySQL DB ์ €์žฅ
5. ์ €์žฅ ๊ฒฐ๊ณผ ๋ฐ˜ํ™˜

๋ฐ์ดํ„ฐ ๋ณ€ํ™˜ ๊ณผ์ •

FastAPI (snake_case) โ†’ Spring Boot (camelCase)

# TripPlan ๋ชจ๋ธ (FastAPI)
plan_data = plan_response.model_dump(by_alias=True)
# startDate, endDate, dailySchedules... (camelCase)

# Spring Boot๋กœ ์ „์†ก (๋ฐฐํฌ ํ™˜๊ฒฝ)
async with httpx.AsyncClient() as client:
    response = await client.post(
        "http://52.78.55.147:8080/api/trip-plan/from-fastapi",
        json=plan_data
    )

Spring Boot CreateFromFastAPIDTO:

public static class CreateFromFastAPIDTO {
    private String startDate;  // FastAPI์—์„œ "startDate" ์ „์†ก
    private String endDate;
    private String budget;
    private List<DailyScheduleDTO> dailySchedules;
    // ...
}

๋ฐฐํฌ ํ™˜๊ฒฝ ๊ตฌ์„ฑ

โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚   Client App    โ”‚
โ”‚   (Mobile/Web)  โ”‚
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
         โ”‚
         โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
         โ”‚                      โ”‚                     โ”‚
         โ–ผ                      โ–ผ                     โ–ผ
โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”  โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”  โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚  FastAPI Server โ”‚  โ”‚ Spring Boot API  โ”‚  โ”‚   Google        โ”‚
โ”‚   (Docker)      โ”‚โ”€>โ”‚  (AWS EC2)       โ”‚  โ”‚   Gemini API    โ”‚
โ”‚   Port: 8000    โ”‚  โ”‚  52.78.55.147    โ”‚  โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜  โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
         โ”‚                     โ”‚
         โ–ผ                     โ–ผ
โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”  โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚ travel_data.jsonโ”‚  โ”‚   MySQL (RDS)    โ”‚
โ”‚   (๋กœ์ปฌ ์ €์žฅ)     โ”‚  โ”‚   (์˜๊ตฌ ์ €์žฅ)       โ”‚
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜  โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜

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

TripTalk/
โ”œโ”€โ”€ AI_Chat.py              # ๋ฉ”์ธ FastAPI ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜
โ”œโ”€โ”€ main.py                 # ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์—”ํŠธ๋ฆฌ ํฌ์ธํŠธ
โ”œโ”€โ”€ requirements.txt        # Python ํŒจํ‚ค์ง€ ์˜์กด์„ฑ
โ”œโ”€โ”€ .env                    # ํ™˜๊ฒฝ๋ณ€์ˆ˜ (OpenAI API Key)
โ”œโ”€โ”€ Dockerfile              # Docker ์ด๋ฏธ์ง€ ๋นŒ๋“œ ํŒŒ์ผ
โ”œโ”€โ”€ docker-compose.yml      # Docker Compose ์„ค์ •
โ”œโ”€โ”€ README.md               # ํ”„๋กœ์ ํŠธ ๋ฌธ์„œ
โ”œโ”€โ”€ data/
โ”‚   โ””โ”€โ”€ travel_data.json    # ์—ฌํ–‰ ๊ณ„ํš JSON ์ €์žฅ์†Œ
โ””โ”€โ”€ outputs/
    โ””โ”€โ”€ latest_plan.md      # ์ตœ์‹  ์—ฌํ–‰ ๊ณ„ํš ๋งˆํฌ๋‹ค์šด

๐Ÿ”ง ์ฃผ์š” ๊ธฐ์ˆ ์  ํŠน์ง•

1. Pydantic Field Aliases

  • JSON ํŒŒ์ผ: start_date, end_date (snake_case)
  • Python ๋ชจ๋ธ: startDate, endDate (camelCase)
  • Spring Boot ์ „์†ก: startDate, endDate (camelCase)
class TripPlan(BaseModel):
    startDate: str = Field(..., alias='start_date')
    endDate: str = Field(..., alias='end_date')

2. Google Gemini Structured Output

  • Gemini 2.0 Flash์˜ ์ž์—ฐ์–ด ๊ธฐ๋ฐ˜ JSON ์ƒ์„ฑ
  • Pydantic ๋ชจ๋ธ๊ณผ ์ผ์น˜ํ•˜๋Š” ๊ตฌ์กฐํ™”๋œ ์‘๋‹ต
  • ํŒŒ์‹ฑ ์—๋Ÿฌ ์ตœ์†Œํ™”

3. ์ค‘๋ณต ๋ฐฉ์ง€ ๋กœ์ง

  • ๋™์ผ ์กฐ๊ฑด (๋ชฉ์ ์ง€, ๊ธฐ๊ฐ„, ๋™ํ–‰์ž, ์˜ˆ์‚ฐ, ์Šคํƒ€์ผ) ์‹œ ๊ธฐ์กด ๋ฐ์ดํ„ฐ ์—…๋ฐ์ดํŠธ
  • ๋‹ค๋ฅธ ์กฐ๊ฑด ์‹œ ์ƒˆ UUID ์ƒ์„ฑ

4. ์—๋Ÿฌ ํ•ธ๋“ค๋ง

  • Spring Boot ํ†ต์‹  ์‹คํŒจ ์‹œ ์žฌ์‹œ๋„
  • Google Gemini API ํƒ€์ž„์•„์›ƒ ์ฒ˜๋ฆฌ
  • JSON ํŒŒ์‹ฑ ์—๋Ÿฌ ๋ณต๊ตฌ

๐Ÿ“ ์ปค๋ฐ‹ ๋ฉ”์‹œ์ง€ ๊ทœ์น™

ํƒ€์ž…(Type) ์„ค๋ช…(Description)
Feat ์ƒˆ๋กœ์šด ๊ธฐ๋Šฅ์„ ์ถ”๊ฐ€ํ•œ ๊ฒฝ์šฐ
Fix ์—๋Ÿฌยท๋ฒ„๊ทธ๋ฅผ ์ˆ˜์ •ํ•œ ๊ฒฝ์šฐ
Design CSS ๋“ฑ UI ๋””์ž์ธ์„ ๋ณ€๊ฒฝํ•œ ๊ฒฝ์šฐ
HOTFIX ๊ธ‰ํ•˜๊ฒŒ ์น˜๋ช…์ ์ธ ์—๋Ÿฌ๋ฅผ ์ฆ‰์‹œ ์ˆ˜์ •ํ•œ ๊ฒฝ์šฐ
Style ์ฝ”๋“œ ํฌ๋งท ๋ณ€๊ฒฝ, ์„ธ๋ฏธ์ฝœ๋ก  ๋ˆ„๋ฝ ๋“ฑ ๋กœ์ง ๋ณ€๊ฒฝ ์—†๋Š” ์Šคํƒ€์ผ ์ˆ˜์ •
Refactor ๊ธฐ๋Šฅ ๋ณ€ํ™” ์—†์ด ์ฝ”๋“œ๋ฅผ ๋ฆฌํŒฉํ† ๋งํ•œ ๊ฒฝ์šฐ
Comment ์ฃผ์„ ์ถ”๊ฐ€ ๋˜๋Š” ๋ณ€๊ฒฝ
Docs ๋ฌธ์„œ๋ฅผ ์ˆ˜์ •ํ•œ ๊ฒฝ์šฐ (README ๋“ฑ)
Test ํ…Œ์ŠคํŠธ ์ฝ”๋“œ ์ถ”๊ฐ€ยท๋ณ€๊ฒฝยท๋ฆฌํŒฉํ† ๋ง
Chore ๊ธฐํƒ€ ๋ณ€๊ฒฝ์‚ฌํ•ญ (๋นŒ๋“œ, ํŒจํ‚ค์ง€, ์„ค์ • ํŒŒ์ผ ์ˆ˜์ • ๋“ฑ)
Rename ํŒŒ์ผยทํด๋”๋ช…์„ ์ˆ˜์ •ํ•˜๊ฑฐ๋‚˜ ์˜ฎ๊ธฐ๋Š” ๊ฒฝ์šฐ

์˜ˆ์‹œ

git commit -m "Feat: Google Gemini 2.0 Flash ์—ฌํ–‰ ๊ณ„ํš ์ƒ์„ฑ API ์ถ”๊ฐ€"
git commit -m "Fix: Spring Boot ์—ฐ๋™ ์‹œ camelCase ๋ณ€ํ™˜ ์˜ค๋ฅ˜ ์ˆ˜์ •"
git commit -m "Docs: README ๋ฐ์ดํ„ฐ ๋ชจ๋ธ ์„น์…˜ ์ถ”๊ฐ€"

๐Ÿ”„ ๋ฒ„์ „ ํžˆ์Šคํ† ๋ฆฌ

v1.0.0 (2025-12-12)

  • โœ… Google Gemini 2.0 Flash ๊ธฐ๋ฐ˜ ์—ฌํ–‰ ๊ณ„ํš ์ƒ์„ฑ
  • โœ… Pydantic ๋ชจ๋ธ ๊ธฐ๋ฐ˜ ๋ฐ์ดํ„ฐ ๊ฒ€์ฆ
  • โœ… JSON ํŒŒ์ผ ๊ธฐ๋ฐ˜ ์˜๊ตฌ ์ €์žฅ
  • โœ… Spring Boot API ์—ฐ๋™ ์™„๋ฃŒ
  • โœ… camelCase/snake_case ์ž๋™ ๋ณ€ํ™˜

๐Ÿค– TripTalk AI Server - ๋‹น์‹ ๋งŒ์˜ ์™„๋ฒฝํ•œ ์—ฌํ–‰์„ AI๊ฐ€ ์„ค๊ณ„ํ•ฉ๋‹ˆ๋‹ค!

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors