- z0713 (λ°μΈμ)
- annalee8595 (μ΄μλ)
- Lee-Hyeongkyeong (μ΄νκ²½)
- ChoiJaeHun313 (μ΅μ¬ν)
- Chrome μμ μ€ν
- λ°±μλ μλ² λ‘λμ μ½κ°μ μκ°μ΄ μμλ μ μμ΅λλ€
μ¬νμμ μ·¨ν₯μ λΆμνμ¬ λ§μΆ€ν μ¬ν λμμ 컨ν μΈ λ₯Ό μΆμ²ν΄μ£Όλ μμ€ν μ λλ€.
μΉκ·Όνκ³ κ·μ¬μ΄ μ±λ΄μ ν΅ν΄ μ¬μ©μμκ² μ¦κ°μ μΈ μ¬ν μ 보λ₯Ό μ 곡ν©λλ€.
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μ μ₯μ μ 보λ₯Ό μ 곡νλ μ§μμλ΅ μ±λ΄ κΈ°λ₯μ νμ¬νκ³ μμ΅λλ€. μ΄ μ±λ΄μ μ¬μ©μμ μ¬ν μ·¨ν₯κ³Ό μμΉ μ 보λ₯Ό λ°μνμ¬ κ°μΈ λ§μΆ€ν μ¬ν μ 보λ₯Ό μ€μκ°μΌλ‘ μ 곡ν©λλ€.
β μ£Όμ κΈ°λ₯
- μμ°μ΄ κΈ°λ° μ λ ₯ μ²λ¦¬ μ¬μ©μλ βμμΈμμ κ°λ³Όλ§ν λ° μλ €μ€β, βλΆμ° λ§μ§ μΆμ²ν΄μ€β μ κ°μ μ§λ¬Έμ μμ λ‘κ² μ λ ₯ν μ μμ΅λλ€.
Trippickμ μ¬μ©μμ μμ°μ€λ¬μ΄ λν κΈ°λ° μ§μμλ΅ μμ€ν μ μ 곡νλ μ±λ΄ κΈ°λ₯μ νμ¬νκ³ μμ΅λλ€. μ΄ μ±λ΄μ λ¨μν ν μ€νΈ μλ΅μ λμ΄, μ¬μ©μμ μ¬ν μ·¨ν₯κ³Ό μμΉ μ 보λ₯Ό λ°μνμ¬ κ°μΈ λ§μΆ€ν μ¬ν μ 보λ₯Ό μ€μκ°μΌλ‘ μ 곡ν©λλ€.
β μ£Όμ κΈ°λ₯
- μμ°μ΄ κΈ°λ° μ λ ₯ μ²λ¦¬ μ¬μ©μλ βμμΈμμ κ°λ³Όλ§ν λ° μλ €μ€β, βλΆμ° λ§μ§ μΆμ²ν΄μ€βμ κ°μ μ§λ¬Έμ μμ λ‘κ² μ λ ₯ν μ μμ΅λλ€.
β μμ€ν μ μ΄λ₯Ό νμ±νμ¬ λμ/μΉ΄ν κ³ λ¦¬ μ 보 μΆμΆ ν, μ μ ν API νΈμΆμ ν΅ν΄ μλ΅ν©λλ€.
-
OpenAI GPT κΈ°λ° μ²λ¦¬ OpenAI GPT-4.1-nano μμ§μ μ¬μ©νμ¬ μ¬μ©μμ μ§λ¬Έμμ ν΅μ¬ μ 보λ₯Ό μΆμΆνκ³ , μ΄λ₯Ό ν΅ν΄ κ°μ₯ μ ν©ν μ½ν μΈ λ₯Ό μΆμ²ν©λλ€. β μ: chatbot: "κ²½μ£Όμμ μΌκ²½ μ’μ κ³³" β β city='κ²½μ£Ό', tag='μΌκ²½' μΆμΆ β μ½ν μΈ μΆμ² API νΈμΆ
-
μΆμ² κ²°κ³Όμ λν λΆκ° μ 보 μ 곡 μ½ν μΈ μΆμ² κ²°κ³Όμ ν¨κ»:
-
ν΄λΉ μ₯μμ Google Maps URL
-
거리 κΈ°λ° μΆμ² μ°μ μμ
-
μΉ΄ν κ³ λ¦¬(κ΄κ΄μ§/λ§μ§/μ‘ν°λΉν°) κ΅¬λΆ λ±μ ν¬ν¨ν μμΈ μ 보λ₯Ό μ 곡ν©λλ€.
π μμΉ κΈ°λ° λμ
-
μ¬μ©μκ° νμ¬ μμΉλ₯Ό μ€μ νλ©΄, μ±λ΄μ μ¬μ©μμ κ° μΆμ² μ₯μ κ°μ 거리λ₯Ό κ³μ°νμ¬ μ΅μ μ μμΉλ₯Ό μ 곡ν©λλ€.
-
거리 κ³μ°μ 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 무μ νμΌ λͺ©λ‘
-
κ°μνκ²½ μμ± λ° νμ±ν
cd <νλ‘μ νΈ λ£¨νΈ> python -m venv venv source venv/bin/activate # Linux/Mac # λλ Set-ExecutionPolicy -Scope Process -ExecutionPolicy Bypass #powershell μ¬μ©ν λλ§ .\venv\Scripts\activate # Windows
-
μμ‘΄μ± μ€μΉ
pip install -r requirements.txt
-
νκ²½ λ³μ μ€μ
.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
-
μλ² μ€ν νλ‘μ νΈ λ£¨νΈμμ
python wsgi.py
-
μμ‘΄μ± μ€μΉ
cd frontend npm install # λλ yarn install
-
κ°λ° μλ² μ€ν
npm start # λλ yarn start
- React.js
- Node.js
- npm
- Python
- Flask
- SQLAlchemy
- Google Maps API
- OpenAI API
- React (v19.1.0) - https://github.com/facebook/react
- React DOM (v19.1.0) - https://github.com/facebook/react
- React Router DOM (v6.22.3) - https://github.com/remix-run/react-router
- React Scripts (v5.0.1) - https://github.com/facebook/create-react-app
- Styled Components (v6.1.18) - https://github.com/styled-components/styled-components
- @hello-pangea/dnd (v18.0.1) - https://github.com/hello-pangea/dnd
- @react-oauth/google (v0.12.2) - https://github.com/MomenSherif/react-oauth
- Axios (v1.9.0) - https://github.com/axios/axios
- @testing-library/dom (v10.4.0) - https://github.com/testing-library/dom-testing-library
- @testing-library/jest-dom (v6.6.3) - https://github.com/testing-library/jest-dom
- @testing-library/react (v16.3.0) - https://github.com/testing-library/react-testing-library
- @testing-library/user-event (v14.6.1) - https://github.com/testing-library/user-event
- Web Vitals (v2.1.4) - https://github.com/GoogleChrome/web-vitals
- Flask-Login - https://github.com/maxcountryman/flask-login
- Flask-CORS (v3.0.10) - https://github.com/corydolphin/flask-cors
- Flask-SQLAlchemy (v3.1.1) - https://github.com/pallets-eco/flask-sqlalchemy
- OpenAI (v1.3.0) - https://github.com/openai/openai-python
- Pydantic (v2.6.1) - https://github.com/pydantic/pydantic
- Pydantic Core (v2.16.2) - https://github.com/pydantic/pydantic-core
- Flask (v2.2.5) - https://github.com/pallets/flask
- OAuthlib - https://github.com/oauthlib/oauthlib
- Python-dotenv (v0.19.2) - https://github.com/theskumar/python-dotenv
- HTTPX (v0.24.1) - https://github.com/encode/httpx
- PyOpenSSL - https://github.com/pyca/pyopenssl
- Requests (v2.26.0) - https://github.com/psf/requests
- Google Maps (v4.10.0) - https://github.com/googlemaps/google-maps-services-python
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.
This project is licensed under the MIT License - see the LICENSE file for details.