TripTalkμ μ¬μ©μμ μ¬ν μ€νμΌκ³Ό μ νΈλλ₯Ό κΈ°λ°μΌλ‘ AIκ° μ΅μ μ μ¬ν μΌμ μ μμ±ν΄μ£Όλ νλ«νΌμ λλ€. FastAPI κΈ°λ° AI μλ²μ μ°λνμ¬ κ°μΈ λ§μΆ€ν μ¬ν κ³νμ μ 곡νλ©°, μ€μκ° νκ³΅κΆ λ° μμ μ 보λ₯Ό μ‘°ννμ¬ νΈλ¦¬ν μ¬ν μ€λΉλ₯Ό μ§μν©λλ€.
- π€ AI λ§μΆ€ μΆμ²: μ¬μ©μ μ·¨ν₯ κΈ°λ° μ¬ν μΌμ μλ μμ±
βοΈ μ€μκ° μ 보: Amadeus API μ°λ νκ³΅κΆ μ‘°ν- πΊοΈ 컀μ νμ΄μ§: 무ν μ€ν¬λ‘€ λ°©μμ λΆλλ¬μ΄ UX
- π 보μ: JWT κΈ°λ° μΈμ¦/μΈκ° μμ€ν
- νμκ°μ /λ‘κ·ΈμΈ (JWT Access & Refresh Token)
- ν ν° μ¬λ°κΈ (Refresh Token κΈ°λ°)
- λ‘κ·Έμμ (Refresh Token μμ )
- μ¬ν μΆμ² μΉ΄λ λ° λ°°λ
- μΈκΈ° μ¬νμ§ μκ° (μ μ£Όλ, λΆμ°, ν리, λ΄μ λ±)
- μΉ΄ν κ³ λ¦¬λ³ μ¬ν μν νμ
- AI μ¬ν νλλ λ°λ‘κ°κΈ°
- FastAPI AI μλ² μ°λ
- μ¬ν μ€νμΌ λΆμ (체νΒ·μ‘ν°λΉν°, μμ°, νλ§, λ‘컬 λ± 9κ°μ§)
- λͺ©μ μ§, κΈ°κ°, μμ°, λνμΈ κΈ°λ° λ§μΆ€ μΌμ μμ±
- μΌμ μλ μ μ₯
- μΌλ³ μμΈ μ€μΌμ€ (DailySchedule β ScheduleItem)
- κ΅ν΅νΈ μ 보 (μΆλ°/κ·ν)
- μμ μ 보
- μ¬ν νμ΄λΌμ΄νΈ
- μνλ³ μ‘°ν
- PLANNED (κ³ν μ€)
- TRAVELED (μ¬ν μλ£)
- 컀μ κΈ°λ° λ¬΄νμ€ν¬λ‘€ (νμ΄μ§ μ¬μ΄μ¦ 5κ°)
- μ¬ν μν λ³κ²½ (PLANNED β TRAVELED)
- μ¬ν κ³ν μμΈ μ‘°ν
- μ 체 μΌμ , κ΅ν΅νΈ, μμ, νμ΄λΌμ΄νΈ ν¬ν¨
- Amadeus API μ°λ
- μΈκΈ° λ
Έμ μλ μ‘°ν
- κ΅λ΄: κΉν¬βμ μ£Ό, κΉν¬βλΆμ°
- μΌλ³Έ: μΈμ²βλμΏ/μ€μ¬μΉ΄/νμΏ μ€μΉ΄ λ±
- κΈ°ν: λ°©μ½, μ±κ°ν¬λ₯΄, ν콩, λ΄μ, ν리 λ± 20κ° λ Έμ
- μ£Όκ° μ€μΌμ€λ¬ (λ§€μ£Ό μμμΌ μλ²½ 4μ μλ μ λ°μ΄νΈ)
- 컀μ κΈ°λ° λ¬΄νμ€ν¬λ‘€ (νμ΄μ§ μ¬μ΄μ¦ 10κ°)
- κ΅κ°λ³ λν μ΄λ―Έμ§ λ§€ν
- μΆμ² μμ μ‘°ν
- 18κ° λμ Γ 3κ° νΈν
- λ€μν 체ν¬μΈ/체ν¬μμ λ μ§ (μ€λ +7~14μΌ)
- 컀μ κΈ°λ° λ¬΄νμ€ν¬λ‘€ (νμ΄μ§ μ¬μ΄μ¦ 10κ°)
- ν
λ§λ³ μ‘°ν
- NATURE (μμ°)
- SEA (λ°λ€)
- CULTURE (λ¬Έν)
- HEALING (νλ§)
- HISTORY (μμ¬)
- 컀μ κΈ°λ° λ¬΄νμ€ν¬λ‘€ (νμ΄μ§ μ¬μ΄μ¦ 10κ°)
- κ°μΈ νλ‘ν κ΄λ¦¬
- μ¬ν ν΅κ³ (μλ£ν μ¬ν, κ³ν μ€μΈ μ¬ν, μ 립 ν¬μΈνΈ)
- λ±μ§ μμ€ν (첫 μ¬ν, μκ° λ§λμ, νλ²κ° λ±)
- κ³μ μ€μ λ° κ°μΈμ 보 λ³κ²½
- Language: Java 21
- Framework: Spring Boot 3.5.6
- ORM: Spring Data JPA (Hibernate 6.6.29)
- Database: MySQL 8.0 (AWS RDS)
- Security: Spring Security + JWT (jjwt 0.12.3)
- API Docs: Swagger (SpringDoc OpenAPI 2.7.0)
- Build Tool: Gradle 8.x
- Amadeus API: μ€μκ° νκ³΅κΆ μ 보 μ‘°ν
- FastAPI: AI κΈ°λ° μ¬ν μΌμ μμ± μλ²
- Server: AWS EC2
- Database: AWS RDS (MySQL)
- Container: Docker
βββββββββββββββ ββββββββββββββββ βββββββββββββββ
β Client β βββ> β Spring Boot β βββ> β MySQL β
β (Mobile) β β (REST API) β β (RDS) β
βββββββββββββββ ββββββββββββββββ βββββββββββββββ
β
βββββββ> FastAPI (AI μλ²)
β
βββββββ> Amadeus API (ν곡κΆ)
ββββββββββββββββββββββββββββββββββββββββ
β Controller Layer β β REST API μλν¬μΈνΈ
ββββββββββββββββββββββββββββββββββββββββ€
β Service Layer β β λΉμ¦λμ€ λ‘μ§
ββββββββββββββββββββββββββββββββββββββββ€
β Converter Layer β β DTO β Entity λ³ν
ββββββββββββββββββββββββββββββββββββββββ€
β Repository Layer β β DB μ κ·Ό (JPA)
ββββββββββββββββββββββββββββββββββββββββ
http://54.180.99.252:8080
http://52.78.55.147:8080/swagger-ui/index.html#/
- Java 21
- MySQL 8.0
- Gradle 8.x
git clone https://github.com/your-repo/triptalk.git
cd triptalkCREATE DATABASE triptalk_db CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;spring:
datasource:
url: jdbc:mysql://localhost:3306/triptalk_db
username: your-username
password: your-password
jwt:
secret: your-jwt-secret-key-at-least-32-characters
access-token-expiration: 3600000 # 1μκ°
refresh-token-expiration: 1209600000 # 2μ£Ό
amadeus:
api-key: your-amadeus-api-key
api-secret: your-amadeus-api-secret# λΉλ
./gradlew clean build
# μ€ν
./gradlew bootRun
# λλ JAR νμΌ μ€ν
java -jar build/libs/triptalk-0.0.1-SNAPSHOT.jardocker-compose up -d- Server: AWS EC2 (Amazon Linux 2)
- Database: AWS RDS MySQL 8.0
- Domain: 54.180.99.252:8080
- Swagger: http://54.180.99.252:8080/swagger-ui/index.html
- Offset λ°©μ λλΉ λμ©λ λ°μ΄ν° μ²λ¦¬ μ±λ₯ μ°μ
- μ€μκ° λ°μ΄ν° λ³κ²½μλ μμ μ
- 무ν μ€ν¬λ‘€ UX μ΅μ ν
- Access Token (1μκ°) + Refresh Token (2μ£Ό)
- Stateless μΈμ¦ λ°©μ
- Spring Security FilterChain μ μ©
- DTO β Entity λ³ν λ‘μ§ λΆλ¦¬
- Service κ³μΈ΅ κ°κ²°ν
- μ¬μ¬μ©μ± λ° μ μ§λ³΄μμ± ν₯μ
- μ¬ν μ€νμΌ νκΈ λ¬Έμμ΄ β Enum μλ λ³ν
- DB μ κ·ν λ° νμ μμ μ± ν보
- μ€μκ° νκ³΅κΆ κ°κ²© μ‘°ν
- μ£Όκ° μ€μΌμ€λ¬ μλ μ λ°μ΄νΈ
- νμ¨ μλ λ³ν (EUR/USD β KRW)
src/main/java/com/example/triptalk/
βββ domain/
β βββ user/
β β βββ controller/ # μ¬μ©μ κ΄λ ¨ API
β β βββ service/ # μ¬μ©μ λΉμ¦λμ€ λ‘μ§
β β βββ repository/ # μ¬μ©μ DB μ κ·Ό
β β βββ entity/ # User, RefreshToken μν°ν°
β β βββ dto/ # μμ²/μλ΅ DTO
β β
β βββ tripPlan/
β β βββ controller/ # μ¬ν κ³ν, ν곡κΆ, μμ API
β β βββ service/ # μ¬ν κ³ν μμ±/κ΄λ¦¬ λ‘μ§
β β βββ converter/ # DTO β Entity λ³ν
β β βββ repository/ # JPA Repository
β β βββ entity/ # TripPlan, DailySchedule λ±
β β βββ dto/ # Request/Response DTO
β β βββ enums/ # TravelStyle, TripStatus
β β βββ scheduler/ # νκ³΅κΆ μλ μ
λ°μ΄νΈ
β β βββ util/ # κ΅κ° μ΄λ―Έμ§ λ§€ν
β β
β βββ tripPlace/
β βββ controller/ # μ¬νμ§ μΆμ² API
β βββ service/ # μ¬νμ§ μ‘°ν λ‘μ§
β βββ repository/ # μ¬νμ§ DB μ κ·Ό
β βββ entity/ # TripPlace μν°ν°
β
βββ global/
β βββ apiPayload/ # κ³΅ν΅ μλ΅ ν¬λ§·
β βββ config/ # Security, Swagger μ€μ
β βββ security/ # JWT μΈμ¦/μΈκ°
β
βββ TriptalkApplication.java
π TripTalkκ³Ό ν¨κ» μλ²½ν μ¬νμ κ³ννμΈμ!