Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
22 commits
Select commit Hold shift + click to select a range
95ebcf2
TRI-186 rds connection point setting.
Daehyun-Bigbread Mar 6, 2025
32f1de8
TRI-186 data sync setting.
Daehyun-Bigbread Mar 10, 2025
a45dbbb
TRI-186 user_data sync part & test code add.
Daehyun-Bigbread Mar 10, 2025
9d900ad
TRI-186 data pipeline add from db.
Daehyun-Bigbread Mar 13, 2025
f1396b2
Add temporary config.py
Daehyun-Bigbread Mar 13, 2025
e0fc979
Remove config.py in favor of config package
Daehyun-Bigbread Mar 13, 2025
2e377ea
Resolve conflict: remove app/config.py in favor of config/__init__.py
Daehyun-Bigbread Mar 13, 2025
7ff97ac
Merge pull request #31 from Trinity-goorm/TRI-186-data-import-from-rds
Daehyun-Bigbread Mar 13, 2025
ba91a44
TRI-200 mongodb connection setting.
Daehyun-Bigbread Mar 25, 2025
e8cedb2
TRI-200 data sync test code add.
Daehyun-Bigbread Mar 25, 2025
1958fa7
TRI-200 dockerfile fix.
Daehyun-Bigbread Mar 25, 2025
78f2856
Merge pull request #34 from Trinity-goorm/TRI-200-user-data-preprocess
Daehyun-Bigbread Mar 27, 2025
7fc3500
TRI-247 preprocess directory fix.
Daehyun-Bigbread Mar 28, 2025
de32c9e
TRI-247 data loader part add.
Daehyun-Bigbread Mar 29, 2025
f221d6d
TRI-247 user data pipeline add.
Daehyun-Bigbread Mar 30, 2025
66e8198
TRI-247 user data pipeline setting error fix.
Daehyun-Bigbread Mar 30, 2025
80e2d8f
Merge pull request #36 from Trinity-goorm/TRI-247-user-data-reprocessing
Daehyun-Bigbread Mar 30, 2025
f216902
hotfix: directory gitkeep fix.
Daehyun-Bigbread Mar 30, 2025
bbaae36
hotfix: catboost file ignore set.
Daehyun-Bigbread Mar 30, 2025
157173f
충돌 해결: .gitignore 수정 및 catboost 파일 제거
Daehyun-Bigbread Mar 30, 2025
13f0a29
충돌 해결: main 브랜치 병합
Daehyun-Bigbread Mar 30, 2025
02745e1
hotfix: gitignore file fix.
Daehyun-Bigbread Mar 30, 2025
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Binary file modified .DS_Store
Binary file not shown.
4 changes: 4 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@ venv/
# Ignore all __pycache__ directories
__pycache__/
**/__pycache__/
**/**/__pycache__/

# Ignore logs directory
logs/
Expand All @@ -24,3 +25,6 @@ logs/
/storage/input_json/restaurants/.gitkeep
/storage/input_json/user/.gitkeep
/storage/output_feedback_json/.gitkeep

# CatBoost 관련 파일 무시
catboost_info/
11 changes: 11 additions & 0 deletions Dockerfile
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,17 @@ ENV PYTHONUNBUFFERED=1
# 컨테이너 내 작업 디렉토리 설정
WORKDIR /app

# MongoDB 환경 변수 설정
ENV MONGO_HOST=$MONGO_HOST
ENV MONGO_PORT=$MONGO_PORT
ENV MONGO_USER=$MONGO_USER
ENV MONGO_PASSWORD=$MONGO_PASSWORD
ENV MONGO_DATABASE=$MONGO_DATABASE
ENV MONGO_COLLECTION=$MONGO_COLLECTION

# 터널링 비활성화 (명시적으로 설정)
ENV USE_SSH_TUNNEL=false

# libgomp 설치: LightGBM 등에서 필요한 OpenMP 라이브러리 설치
RUN apt-get update && apt-get install -y libgomp1 && rm -rf /var/lib/apt/lists/*

Expand Down
49 changes: 0 additions & 49 deletions app/config.py

This file was deleted.

70 changes: 70 additions & 0 deletions app/config/__init__.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,70 @@
from dotenv import load_dotenv
from pathlib import Path
import os
import logging

# settings.py에서 하이퍼파라미터 값들을 가져옴
try:
from app.setting import A_VALUE, B_VALUE, REVIEW_WEIGHT, CAUTION_WEIGHT, CONVENIENCE_WEIGHT
except ImportError:
# 설정 값이 없을 경우 기본값 설정
A_VALUE, B_VALUE = 1.0, 1.0
REVIEW_WEIGHT, CAUTION_WEIGHT, CONVENIENCE_WEIGHT = 1.0, 1.0, 1.0

# 로거 설정
logger = logging.getLogger("app.config")

# .env 파일 로드
load_dotenv()

# Docker 환경 감지 및 BASE_DIR 설정
try:
# Docker 환경인지 확인 (Linux의 /proc/1/cgroup 파일 존재 여부 활용)
with open('/proc/1/cgroup', 'rt') as f:
cgroup_content = f.read()
if 'docker' in cgroup_content:
BASE_DIR = Path("/app")
logger.info("Docker 환경으로 감지되었습니다.")
else:
BASE_DIR = Path(__file__).resolve().parent.parent.parent
logger.info("로컬 환경으로 감지되었습니다.")
except FileNotFoundError:
BASE_DIR = Path(__file__).resolve().parent.parent.parent
logger.info("로컬 환경으로 간주합니다. BASE_DIR를 기본값으로 설정합니다.")
except Exception as e:
logger.error(f"환경 감지 중 오류 발생: {e}")
raise Exception("환경 감지 중 오류 발생")

# 환경 변수에서 설정을 로드하거나 기본값 사용
def get_env_path(env_var, default_path, create=True):
path_str = os.environ.get(env_var)

if path_str:
path = Path(path_str)
logger.info(f"{env_var} 환경 변수로부터 경로를 설정합니다: {path}")
else:
path = Path(BASE_DIR) / default_path
logger.info(f"로컬 환경으로 간주합니다. {env_var}를 기본값으로 설정합니다.")

if create and not path.exists():
path.mkdir(parents=True, exist_ok=True)
logger.info(f"디렉토리가 생성되었습니다: {path}")

if path.exists():
logger.info(f"디렉토리가 준비되었습니다: {path}")

return path

# 저장소 기본 디렉토리
STORAGE_DIR = get_env_path('STORAGE_DIR', 'storage')

# 레스토랑 데이터 저장 디렉토리
RESTAURANTS_DIR = get_env_path('RESTAURANTS_DIR', 'storage/input_json/restaurants')

# 사용자 데이터 저장 디렉토리
USER_DIR = get_env_path('USER_DIR', 'storage/input_json/user')

# 피드백 JSON 파일 디렉토리 (추천 결과 저장)
FEEDBACK_DIR = get_env_path('FEEDBACK_DIR', 'storage/output_feedback_json')

# 추가 설정이 필요한 경우 여기에 정의
50 changes: 50 additions & 0 deletions app/config/mongo_config.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,50 @@
# app/config/mongo_config.py

from dotenv import load_dotenv
from pathlib import Path
import os
import logging

# 로거 설정
logger = logging.getLogger("app.config.mongo")

# .env 파일 로드
load_dotenv()

# MongoDB 설정
MONGO_HOST = os.environ.get('MONGO_HOST')
MONGO_PORT = int(os.environ.get('MONGO_PORT', 27017))
MONGO_USER = os.environ.get('MONGO_USER')
MONGO_PASSWORD = os.environ.get('MONGO_PASSWORD')
MONGO_DATABASE = os.environ.get('MONGO_DATABASE')
MONGO_COLLECTION = os.environ.get('MONGO_COLLECTION', 'recsys_data')

# 필수 환경 변수 확인
if not all([MONGO_HOST, MONGO_USER, MONGO_PASSWORD, MONGO_DATABASE]):
logger.warning("MongoDB 연결에 필요한 일부 환경 변수가 설정되지 않았습니다.")
logger.warning("설정을 확인하거나 .env 파일을 추가해 주세요.")

# SSH 터널링 설정
USE_SSH_TUNNEL = os.environ.get('USE_SSH_TUNNEL', 'false').lower() == 'true'
SSH_HOST = os.environ.get('SSH_HOST')
SSH_PORT = int(os.environ.get('SSH_PORT', 22))
SSH_USER = os.environ.get('SSH_USER')
SSH_PASSWORD = os.environ.get('SSH_PASSWORD')
SSH_KEY_PATH = os.environ.get('SSH_KEY_PATH')

# SSH 터널링이 활성화된 경우 필수 환경 변수 확인
if USE_SSH_TUNNEL and not all([SSH_HOST, SSH_USER]) and not (SSH_PASSWORD or SSH_KEY_PATH):
logger.warning("SSH 터널링이 활성화되었지만 필요한 환경 변수가 설정되지 않았습니다.")
logger.warning("SSH_HOST, SSH_USER 및 SSH_PASSWORD 또는 SSH_KEY_PATH를 확인해주세요.")

# 동기화 설정
SYNC_INTERVAL_HOURS = float(os.environ.get('SYNC_INTERVAL_HOURS', 1.0))
SYNC_ON_STARTUP = os.environ.get('SYNC_ON_STARTUP', 'false').lower() == 'true'

# MongoDB 설정 로드 알림 (민감한 정보는 로깅하지 않음)
if MONGO_HOST:
logger.info(f"MongoDB 설정 로드: {MONGO_HOST}:{MONGO_PORT}/{MONGO_DATABASE}")
if USE_SSH_TUNNEL and SSH_HOST:
logger.info(f"SSH 터널링 활성화: {SSH_HOST}:{SSH_PORT}")
else:
logger.info("SSH 터널링 비활성화")
106 changes: 106 additions & 0 deletions app/config/queries.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,106 @@
# SQL 쿼리 설정 파일
# 각 테이블에서 필요한 필드만 선택하는 쿼리 정의

# 식당 데이터 쿼리 (이미 정상 작동)
RESTAURANT_QUERY = """
SELECT
r.id as restaurant_id,
r.name,
r.address,
r.average_price,
r.caution,
r.convenience,
r.expanded_days,
r.is_deleted,
r.operating_hour,
r.phone_number,
r.rating as score,
r.review_count as review,
r.time_range as duration_hours,
rc.category_id
FROM restaurant r
JOIN restaurant_category rc ON r.id = rc.restaurant_id
WHERE r.is_deleted = 0
"""

# 사용자 기본 정보 쿼리 (테이블명 수정)
USER_QUERY = """
SELECT
id as user_id,
sex,
status,
is_deleted,
empty_ticket_count,
normal_ticket_count
FROM user
WHERE status = 'ACTIVE' AND is_deleted = 0
"""

# 사용자 가격 범위 선호도 쿼리 (테이블명 수정, deleted_at 조건 제거)
USER_PREFERENCES_QUERY = """
SELECT
user_id,
min_price,
max_price
FROM user_preference
"""

# 사용자 카테고리 선호도 쿼리 (테이블명 수정, deleted_at 조건 제거)
USER_PREFERENCE_CATEGORIES_QUERY = """
SELECT
user_preference_id,
category_id
FROM user_preference_category
"""

# 찜 데이터 쿼리 (deleted_at 조건 제거)
LIKES_QUERY = """
SELECT
user_id,
restaurant_id
FROM likes
"""

# 예약 데이터 쿼리 (테이블명 수정, deleted_at 조건 제거)
RESERVATIONS_QUERY = """
SELECT
user_id,
restaurant_id,
status,
reservation_time_id,
reservation_date,
seat_type_id
FROM reservation
WHERE status = 'COMPLETED'
"""

# 파라미터가 있는 쿼리 함수도 수정
def get_user_reservations_query(user_id):
"""특정 사용자의 예약 데이터를 가져오는 쿼리"""
return f"""
SELECT
user_id,
restaurant_id,
status,
reservation_time_id,
reservation_date,
seat_type_id
FROM reservation
WHERE user_id = {user_id}
AND status = 'COMPLETED'
"""

def get_reservations_by_date_range_query(start_date, end_date):
"""특정 날짜 범위의 예약 데이터를 가져오는 쿼리"""
return f"""
SELECT
user_id,
restaurant_id,
status,
reservation_time_id,
reservation_date,
seat_type_id
FROM reservation
WHERE reservation_date BETWEEN '{start_date}' AND '{end_date}'
AND status = 'COMPLETED'
"""
Loading