Skip to content

Lee-Hyeongkyeong/OSSW_githubushim

Folders and files

NameName
Last commit message
Last commit date

Latest commit

Β 

History

162 Commits
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 

Repository files navigation

OSSW_githubushim


Contributors

  • z0713 (λ°•μΈμ˜)
  • annalee8595 (μ΄μ˜ˆλ‚˜)
  • Lee-Hyeongkyeong (μ΄ν˜•κ²½)
  • ChoiJaeHun313 (μ΅œμž¬ν›ˆ)

Trippick - λ– λ‚˜μž, λ‚˜λ‹΅κ²Œ

https://trippick.vercel.app

  • Chrome μ—μ„œ μ‹€ν–‰
  • λ°±μ—”λ“œ μ„œλ²„ λ‘œλ“œμ— μ•½κ°„μ˜ μ‹œκ°„μ΄ μ†Œμš”λ  수 μžˆμŠ΅λ‹ˆλ‹€

Travel Recommendation System with Chatbot

μ—¬ν–‰μžμ˜ μ·¨ν–₯을 λΆ„μ„ν•˜μ—¬ λ§žμΆ€ν˜• μ—¬ν–‰ λ„μ‹œμ™€ 컨텐츠λ₯Ό μΆ”μ²œν•΄μ£ΌλŠ” μ‹œμŠ€ν…œμž…λ‹ˆλ‹€.
μΉœκ·Όν•˜κ³  κ·€μ—¬μš΄ 챗봇을 톡해 μ‚¬μš©μžμ—κ²Œ 즉각적인 μ—¬ν–‰ 정보λ₯Ό μ œκ³΅ν•©λ‹ˆλ‹€.


μ£Όμš” κΈ°λŠ₯

둜그인 κΈ°λŠ₯

Trippick은 Google OAuth 2.0 λ‘œκ·ΈμΈμ„ μ§€μ›ν•˜μ—¬ μ‚¬μš©μžκ°€ κ°„νŽΈν•˜κ³  μ•ˆμ „ν•˜κ²Œ λ‘œκ·ΈμΈν•  수 μžˆλ„λ‘ ν•©λ‹ˆλ‹€. 둜그인된 μ‚¬μš©μžλŠ” μΆ”μ²œ κ²°κ³Όλ₯Ό 기반으둜 μžμ‹ μ˜ μ—¬ν–‰ μ·¨ν–₯ 데이터λ₯Ό μ €μž₯ν•˜κ³ , ν–₯ν›„ λ‹€μ‹œ λ°©λ¬Έ μ‹œ λ™μΌν•œ 쑰건으둜 μž¬μΆ”μ²œμ„ 받을 수 μžˆλŠ” κΈ°λŠ₯으둜 ν™•μž₯ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

  • Google OAuth 연동 (@react-oauth/google μ‚¬μš©)

  • 둜그인 ν›„ μ‚¬μš©μž 정보 DB μ €μž₯ (googleLogin/db.py, googleLogin/user.py)

  • Access Token을 ν†΅ν•œ 인증 처리 및 μ‚¬μš©μž μƒνƒœ μœ μ§€

πŸ”§ ν–₯ν›„ κΈ°λŠ₯ (κ³„νš):

  • μ‚¬μš©μž μΆ”μ²œ 이λ ₯ μ €μž₯

  • 즐겨찾기/찜 κΈ°λŠ₯

  • μ‚¬μš©μžλ³„ μΆ”μ²œ 둜그 기반 κ°œμΈν™” λͺ¨λΈ κ°œμ„ 


μ—¬ν–‰ μΆ”μ²œ μ‹œμŠ€ν…œ

Trippick의 핡심 κΈ°λŠ₯은 μ„€λ¬Έ κ²°κ³Όλ₯Ό 기반으둜 ν•œ λ§žμΆ€ν˜• λ„μ‹œ 및 μ½˜ν…μΈ  μΆ”μ²œμž…λ‹ˆλ‹€. μ‚¬μš©μžμ˜ μ—¬ν–‰ μ·¨ν–₯을 λ‹€κ°λ„λ‘œ λΆ„μ„ν•˜μ—¬, κ°€μž₯ μ ν•©ν•œ λ„μ‹œμ™€ κ·Έ λ„μ‹œμ—μ„œ 즐길 수 μžˆλŠ” μ½˜ν…μΈ (κ΄€κ΄‘μ§€, λ§›μ§‘, μ•‘ν‹°λΉ„ν‹°)λ₯Ό μΆ”μ²œν•©λ‹ˆλ‹€.

βœ… λ„μ‹œ μΆ”μ²œ

  • μ„€λ¬Έ κ²°κ³Ό(μ—¬ν–‰ μœ ν˜•, μ„ ν˜Έ μ§€μ—­, μ˜ˆμ‚° λ“±)λ₯Ό 기반으둜 각 λ„μ‹œμ˜ νƒœκ·Έ 점수λ₯Ό 계산

  • city_recommend.pyμ—μ„œ μœ μ‚¬ νƒœκ·Έ 기반 점수 계산 둜직 κ΅¬ν˜„

  • κ²°κ³ΌλŠ” λ„μ‹œλ³„ 점수 순으둜 μ •λ ¬λ˜μ–΄ μΆ”μ²œ

βœ… μ½˜ν…μΈ  μΆ”μ²œ

  • λ„μ‹œλ₯Ό μ„ νƒν•˜λ©΄, ν•΄λ‹Ή λ„μ‹œμ˜ κ΄€κ΄‘μ§€/λ§›μ§‘/ν™œλ™μ„ μΉ΄ν…Œκ³ λ¦¬λ³„λ‘œ μΆ”μ²œ

  • content_recommend.pyμ—μ„œ μ‚¬μš©μž νƒœκ·Έμ™€ μ½˜ν…μΈ  νƒœκ·Έμ˜ μœ μ‚¬λ„λ₯Ό 비ꡐ해 μ μˆ˜ν™”

  • μ •μ œλœ TourAPI 데이터λ₯Ό 기반으둜 함 (OS_data.py, OS_tag.py)

πŸ“ μœ„μΉ˜ 기반 μΆ”μ²œ

  • Google Maps API와 Haversine 곡식을 ν™œμš©ν•˜μ—¬ μ‚¬μš©μžμ™€ μΆ”μ²œ μž₯μ†Œ κ°„μ˜ 거리λ₯Ό 계산

  • μ½˜ν…μΈ  정보에 Google Maps 기반 κΈΈμ°ΎκΈ° 링크도 μ œκ³΅ν•˜μ—¬, μ‹€μ œ 이동 경둜 μ•ˆλ‚΄κΉŒμ§€ κ°€λŠ₯

πŸ€– 챗봇 연계

  • μ‚¬μš©μžκ°€ "μ„œμšΈμ—μ„œ λ§›μ§‘ μ•Œλ €μ€˜", "λΆ€μ‚° κ΄€κ΄‘μ§€ 뭐가 μ’‹μ•„?"와 같이 μžμ—°μ–΄λ‘œ μž…λ ₯ν•˜λ©΄, 챗봇이 μΆ”μ²œ APIλ₯Ό ν˜ΈμΆœν•΄ μ‹€μ‹œκ°„μœΌλ‘œ 응닡

  • OpenAI GPT-4.1-nanoλ₯Ό ν™œμš©ν•œ μžμ—°μ–΄ νŒŒμ‹±κ³Ό 연동


챗봇 μΈν„°νŽ˜μ΄μŠ€

Trippick은 μž₯μ†Œ 정보λ₯Ό μ œκ³΅ν•˜λŠ” μ§ˆμ˜μ‘λ‹΅ 챗봇 κΈ°λŠ₯을 νƒ‘μž¬ν•˜κ³  μžˆμŠ΅λ‹ˆλ‹€. 이 챗봇은 μ‚¬μš©μžμ˜ μ—¬ν–‰ μ·¨ν–₯κ³Ό μœ„μΉ˜ 정보λ₯Ό λ°˜μ˜ν•˜μ—¬ 개인 λ§žμΆ€ν˜• μ—¬ν–‰ 정보λ₯Ό μ‹€μ‹œκ°„μœΌλ‘œ μ œκ³΅ν•©λ‹ˆλ‹€.

βœ… μ£Όμš” κΈ°λŠ₯

  • μžμ—°μ–΄ 기반 μž…λ ₯ 처리 μ‚¬μš©μžλŠ” β€œμ„œμšΈμ—μ„œ κ°€λ³Όλ§Œν•œ 데 μ•Œλ €μ€˜β€, β€œλΆ€μ‚° λ§›μ§‘ μΆ”μ²œν•΄μ€˜β€ 와 같은 μ§ˆλ¬Έμ„ 자유둭게 μž…λ ₯ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

챗봇 μΈν„°νŽ˜μ΄μŠ€ (chatbot 브랜치)

Trippick은 μ‚¬μš©μžμ˜ μžμ—°μŠ€λŸ¬μš΄ λŒ€ν™” 기반 μ§ˆμ˜μ‘λ‹΅ μ‹œμŠ€ν…œμ„ μ œκ³΅ν•˜λŠ” 챗봇 κΈ°λŠ₯을 νƒ‘μž¬ν•˜κ³  μžˆμŠ΅λ‹ˆλ‹€. 이 챗봇은 λ‹¨μˆœν•œ ν…μŠ€νŠΈ 응닡을 λ„˜μ–΄, μ‚¬μš©μžμ˜ μ—¬ν–‰ μ·¨ν–₯κ³Ό μœ„μΉ˜ 정보λ₯Ό λ°˜μ˜ν•˜μ—¬ 개인 λ§žμΆ€ν˜• μ—¬ν–‰ 정보λ₯Ό μ‹€μ‹œκ°„μœΌλ‘œ μ œκ³΅ν•©λ‹ˆλ‹€.

βœ… μ£Όμš” κΈ°λŠ₯

  • μžμ—°μ–΄ 기반 μž…λ ₯ 처리 μ‚¬μš©μžλŠ” β€œμ„œμšΈμ—μ„œ κ°€λ³Όλ§Œν•œ 데 μ•Œλ €μ€˜β€, β€œλΆ€μ‚° λ§›μ§‘ μΆ”μ²œν•΄μ€˜β€μ™€ 같은 μ§ˆλ¬Έμ„ 자유둭게 μž…λ ₯ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

β†’ μ‹œμŠ€ν…œμ€ 이λ₯Ό νŒŒμ‹±ν•˜μ—¬ λ„μ‹œ/μΉ΄ν…Œκ³ λ¦¬ 정보 μΆ”μΆœ ν›„, μ μ ˆν•œ API ν˜ΈμΆœμ„ 톡해 μ‘λ‹΅ν•©λ‹ˆλ‹€.

  • OpenAI GPT 기반 처리 OpenAI GPT-4.1-nano 엔진을 μ‚¬μš©ν•˜μ—¬ μ‚¬μš©μžμ˜ μ§ˆλ¬Έμ—μ„œ 핡심 정보λ₯Ό μΆ”μΆœν•˜κ³ , 이λ₯Ό 톡해 κ°€μž₯ μ ν•©ν•œ μ½˜ν…μΈ λ₯Ό μΆ”μ²œν•©λ‹ˆλ‹€. β†’ 예: chatbot: "κ²½μ£Όμ—μ„œ μ•Όκ²½ 쒋은 κ³³" β†’ β†’ city='κ²½μ£Ό', tag='μ•Όκ²½' μΆ”μΆœ β†’ μ½˜ν…μΈ  μΆ”μ²œ API 호좜

  • μΆ”μ²œ 결과에 λŒ€ν•œ λΆ€κ°€ 정보 제곡 μ½˜ν…μΈ  μΆ”μ²œ 결과와 ν•¨κ»˜:

  1. ν•΄λ‹Ή μž₯μ†Œμ˜ Google Maps URL

  2. 거리 기반 μΆ”μ²œ μš°μ„ μˆœμœ„

  3. μΉ΄ν…Œκ³ λ¦¬(κ΄€κ΄‘μ§€/λ§›μ§‘/μ•‘ν‹°λΉ„ν‹°) ꡬ뢄 등을 ν¬ν•¨ν•œ 상세 정보λ₯Ό μ œκ³΅ν•©λ‹ˆλ‹€.

πŸ“ μœ„μΉ˜ 기반 λŒ€μ‘

  • μ‚¬μš©μžκ°€ ν˜„μž¬ μœ„μΉ˜λ₯Ό μ„€μ •ν•˜λ©΄, 챗봇은 μ‚¬μš©μžμ™€ 각 μΆ”μ²œ μž₯μ†Œ κ°„μ˜ 거리λ₯Ό κ³„μ‚°ν•˜μ—¬ 졜적의 μœ„μΉ˜λ₯Ό μ œκ³΅ν•©λ‹ˆλ‹€.

  • 거리 계산은 Haversine 곡식을 기반으둜 ν•˜λ©°, Google Maps Directions APIλ₯Ό 톡해 λŒ€μ€‘κ΅ν†΅ κ²½λ‘œλ„ μ•ˆλ‚΄ κ°€λŠ₯ν•©λ‹ˆλ‹€.

πŸ› οΈ ν–₯ν›„ κ³„νš (To-do)

  • 동일 μ‘°κ±΄μ—μ„œ μΆ”κ°€ μž₯μ†Œ μž¬μΆ”μ²œ κΈ°λŠ₯ (e.g., "λ‹€λ₯Έ 데도 λ³΄μ—¬μ€˜")

  • GPT λͺ¨λΈ 응닡 μ΅œμ ν™” (νƒœκ·Έ λˆ„λ½ λ°©μ§€, 의미 νŒŒμ•… 정밀도 κ°œμ„ )

  • μ‚¬μš©μžλ³„ λŒ€ν™” 이λ ₯ 기반 μ»¨ν…μŠ€νŠΈ μΆ”μ²œ κ°•ν™”


ν”„λ‘œμ νŠΈ ꡬ쑰

OSSW_githubushim/
β”œβ”€β”€ frontend/                 # ν”„λ‘ νŠΈμ—”λ“œ 디렉토리
β”‚   β”œβ”€β”€ src/                 # μ†ŒμŠ€ μ½”λ“œ
β”‚   β”‚   β”œβ”€β”€ assets/         # 이미지, 폰트 λ“± 정적 μžμ›
β”‚   β”‚   β”œβ”€β”€ components/     # μž¬μ‚¬μš© κ°€λŠ₯ν•œ μ»΄ν¬λ„ŒνŠΈ
β”‚   β”‚   β”œβ”€β”€ pages/         # νŽ˜μ΄μ§€ μ»΄ν¬λ„ŒνŠΈ
β”‚   β”‚   β”œβ”€β”€ styles/        # CSS μŠ€νƒ€μΌ 파일
β”‚   β”‚   β”œβ”€β”€ App.js         # 메인 μ• ν”Œλ¦¬μΌ€μ΄μ…˜ μ»΄ν¬λ„ŒνŠΈ
β”‚   β”‚   β”œβ”€β”€ App.css        # 메인 μŠ€νƒ€μΌ
β”‚   β”‚   β”œβ”€β”€ index.js       # μ§„μž…μ 
β”‚   β”‚   └── index.css      # μ „μ—­ μŠ€νƒ€μΌ
β”‚   β”œβ”€β”€ public/              # 정적 파일
β”‚   β”œβ”€β”€ package.json         # npm νŒ¨ν‚€μ§€ μ„€μ •
β”‚   └── package-lock.json    # npm νŒ¨ν‚€μ§€ 잠금 파일
β”‚
β”œβ”€β”€ backend/                 # λ°±μ—”λ“œ 디렉토리
β”‚   β”œβ”€β”€ googleLogin/        # ꡬ글 둜그인 κ΄€λ ¨
β”‚   β”‚   β”œβ”€β”€ db.py          # λ°μ΄ν„°λ² μ΄μŠ€ κ΄€λ ¨
β”‚   β”‚   β”œβ”€β”€ user.py        # μ‚¬μš©μž κ΄€λ ¨
β”‚   β”‚   β”œβ”€β”€ requirements.txt # ꡬ글 둜그인 κ΄€λ ¨ μ˜μ‘΄μ„± νŒ¨ν‚€μ§€ λͺ©λ‘
β”‚   β”‚   └── __init__.py    # νŒ¨ν‚€μ§€ μ΄ˆκΈ°ν™”
β”‚   β”‚
β”‚   β”œβ”€β”€ recommend/          # μΆ”μ²œ μ‹œμŠ€ν…œ
β”‚   β”‚   β”œβ”€β”€ city_routes.py     # λ„μ‹œ μΆ”μ²œ 라우트
β”‚   β”‚   β”œβ”€β”€ content_routes.py  # μ½˜ν…μΈ  μΆ”μ²œ 라우트
β”‚   β”‚   └── detail_routes.py   # 상세 정보 라우트
β”‚   β”‚
β”‚   β”œβ”€β”€ survey/            # μ„€λ¬Έ κ΄€λ ¨
β”‚   β”‚   β”œβ”€β”€ survey.py          # μ„€λ¬Έ 메인 둜직
β”‚   β”‚   β”œβ”€β”€ city_recommend.py  # λ„μ‹œ μΆ”μ²œ 둜직
β”‚   β”‚   β”œβ”€β”€ content_recommend.py # μ½˜ν…μΈ  μΆ”μ²œ 둜직
β”‚   β”‚   β”œβ”€β”€ OS_data.py         # 운영체제 데이터
β”‚   β”‚   └── OS_tag.py          # 운영체제 νƒœκ·Έ
β”‚   β”‚
β”‚   β”œβ”€β”€ test/            # ν…ŒμŠ€νŠΈ μ½”λ“œ
β”‚   β”‚   β”œβ”€β”€ integration/
β”‚   β”‚   β”‚   β”œβ”€β”€ test_api_endpoints.py
β”‚   β”‚   β”‚   └── test_main_app.py
β”‚   β”‚   β”‚
β”‚   β”‚   └── unit/
β”‚   β”‚       β”œβ”€β”€ test_google_user.py
β”‚   β”‚       β”œβ”€β”€ test_survey_logic.py
β”‚   β”‚       β”œβ”€β”€ test_city_recommend.py
β”‚   β”‚       β”œβ”€β”€ test_content_recommend.py
β”‚   β”‚       β”œβ”€β”€ test_city_routes.py
β”‚   β”‚       β”œβ”€β”€ test_content_routes.py
β”‚   β”‚       └── test_detail_routes.py
β”‚   β”‚
β”‚   β”œβ”€β”€ templates/         # HTML ν…œν”Œλ¦Ώ
β”‚   β”œβ”€β”€ user_profiles/     # μ‚¬μš©μž ν”„λ‘œν•„
β”‚   β”œβ”€β”€ app.py             # 메인 μ• ν”Œλ¦¬μΌ€μ΄μ…˜ 파일
β”‚   β”œβ”€β”€ run.py             # μ‹€ν–‰ 파일
β”‚   β”œβ”€β”€ schema.sql         # λ°μ΄ν„°λ² μ΄μŠ€ μŠ€ν‚€λ§ˆ
β”‚   └── __init__.py        # Python νŒ¨ν‚€μ§€ μ΄ˆκΈ°ν™”
β”‚   
β”œβ”€β”€ chatbot_proxy.py       # 챗봇 ν”„λ‘μ‹œ
β”œβ”€β”€ chatbot_backend
β”‚   β”œβ”€β”€ app/
β”‚   β”‚   β”œβ”€β”€ services/
β”‚   β”‚   β”‚   β”œβ”€β”€ directions.py    
β”‚   β”‚   β”‚   β”œβ”€β”€ google_maps_api.py     
β”‚   β”‚   β”‚   └── location.py   
β”‚   β”‚   β”‚    
β”‚   β”‚   β”œβ”€β”€ utils/   
β”‚   β”‚   β”‚   └── parser.py       
β”‚   β”‚   β”œβ”€β”€ __init__.py    
β”‚   β”‚   β”œβ”€β”€ models.py      
β”‚   β”‚   └── routes.py   
β”‚
β”œβ”€β”€ wsgi.py                # WSGI μ„œλ²„ μ„€μ •
β”œβ”€β”€ sqlite_db             # SQLite λ°μ΄ν„°λ² μ΄μŠ€ 파일
└── .gitignore           # Git λ¬΄μ‹œ 파일 λͺ©λ‘

λ°±μ—”λ“œ μ„€μΉ˜ 및 μ‹€ν–‰ 방법

  1. κ°€μƒν™˜κ²½ 생성 및 ν™œμ„±ν™”

    cd <ν”„λ‘œμ νŠΈ 루트>
    python -m venv venv
    source venv/bin/activate  # Linux/Mac
    # λ˜λŠ”
    Set-ExecutionPolicy -Scope Process -ExecutionPolicy Bypass #powershell μ‚¬μš©ν•  λ•Œλ§Œ
    .\venv\Scripts\activate  # Windows
  2. μ˜μ‘΄μ„± μ„€μΉ˜

    pip install -r requirements.txt
  3. ν™˜κ²½ λ³€μˆ˜ μ„€μ • .env 파일 생성 ν›„ λ‚΄μš© μž…λ ₯

    OPENAI_API_KEY=your_openai_api_key_here
    DATABASE_URL=sqlite:///chatbot.db
    FLASK_ENV=development
    FLASK_DEBUG=1
    SECRET_KEY=your_secret_key_here
    GOOGLE_MAPS_API_KEY=your_google_maps_api_here
    GOOGLE_CLIENT_ID=your_google_client_id_here
    GOOGLE_CLIENT_SECRET=upir_google_client_secret_here
  4. μ„œλ²„ μ‹€ν–‰ ν”„λ‘œμ νŠΈ λ£¨νŠΈμ—μ„œ

     python wsgi.py

ν”„λ‘ νŠΈμ—”λ“œ μ„€μΉ˜ 및 μ‹€ν–‰ 방법

  1. μ˜μ‘΄μ„± μ„€μΉ˜

    cd frontend
    npm install
    # λ˜λŠ”
    yarn install
  2. 개발 μ„œλ²„ μ‹€ν–‰

    npm start
    # λ˜λŠ”
    yarn start

기술 μŠ€νƒ

ν”„λ‘ νŠΈμ—”λ“œ

  • React.js
  • Node.js
  • npm

λ°±μ—”λ“œ

  • Python
  • Flask
  • SQLAlchemy
  • Google Maps API
  • OpenAI API

μ˜€ν”ˆμ†ŒμŠ€ λΌμ΄μ„ μŠ€

Frontend Dependencies

MIT License

Apache License 2.0

Backend Dependencies

MIT License

BSD-3-Clause License

Apache License 2.0


License Files

The license files for all dependencies can be found in the licenses directory. Each file is named according to the package name and contains the full text of the respective license.


Project License

This project is licensed under the MIT License - see the LICENSE file for details.

About

Resources

License

Contributing

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors