# 점심 월드컵 기능 개발 및 슬랙 연동 ## 개발 일시 2025-09-22 ## 요구사항 - 100가지 한국 음식으로 점심 메뉴 월드컵 게임 구현 - 매일 12시 Company-X 슬랙 채널 자동 알림 ## 작업 내용 ### 1. 프론트엔드 (frontend-customer) #### 컴포넌트 생성 ``` src/pages/LunchWorldcup.tsx ``` - 100개 한국 음식 데이터 배열 - 32강/16강/8강 선택 가능 - 토너먼트 방식 구현 #### 라우팅 설정 ```typescript // src/App.tsx ``` #### 이미지 처리 - 위치: `public/images/foods/NNN_메뉴명.jpg` - 100개 한국 음식 이미지 (위키백과/나무위키) - 형식: 001_비빔밥.jpg ~ 100_샐러드.jpg ### 2. 백엔드 (rb8001) #### 알림 모듈 생성 ``` app/notifications/ ├── __init__.py └── lunch.py ``` #### lunch.py 구조 ```python async def send_lunch_worldcup_notification(channel_id: str = None): # Slack WebClient 사용 # COMPANYX_SLACK_BOT_TOKEN 환경변수 # 채널 ID: C09CP4MDX71 (Company-X) # 랜덤 메시지 + 버튼 링크 ``` #### 스케줄러 모듈 생성 (2025-09-27 리팩토링) ``` app/scheduler/jobs/lunch_worldcup.py ``` ```python # register(scheduler) 패턴 사용 # 환경변수: LUNCH_WORLDCUP_ENABLED, LUNCH_WORLDCUP_SCHEDULE # 참조: naverworks_briefing.py ``` #### main.py 스케줄 등록 ```python from app.scheduler.jobs import lunch_worldcup lunch_worldcup.register(scheduler) ``` ## 배포 정보 - URL: https://ro-being.com/lunch-worldcup - 슬랙 채널: Company-X (C09CP4MDX71) - 실행 시간: 평일 12:00 (Asia/Seoul) ## 교훈 1. **main.py 역할 명확화**: 스케줄 등록만, 로직은 별도 모듈 2. **파일 구조 설계**: 알림은 notifications/, 스킬은 skills/, 스케줄은 scheduler/jobs/ 3. **라우팅 경로 확인**: 404 에러시 App.tsx Route 확인 4. **이미지 파일명**: 한글 파일명도 웹에서 동작하지만 영문 권장 5. **환경변수 vs 하드코딩**: 절대 하드코딩 금지, 환경변수로 on/off 및 스케줄 제어 필수 6. **스케줄러 패턴 통일**: register(scheduler) 함수로 모듈화, 에러 격리, 로깅 표준화 ## 파일 변경 목록 - frontend-customer: - src/pages/LunchWorldcup.tsx (생성) - src/App.tsx (라우팅 추가) - public/images/foods/*.jpg (100개 이미지) - rb8001: - app/notifications/lunch.py (생성) - app/notifications/__init__.py (생성) - app/scheduler/jobs/lunch_worldcup.py (생성, 2025-09-27) - main.py (스케줄 등록 → register 호출로 변경, 2025-09-27) ## 트러블슈팅 - 이미지 다운로드: Unsplash API 실패 → 나무위키 성공 - 라우팅 404: /lunch → /lunch-worldcup 경로 수정 - main.py 복잡도: 로직 분리하여 notifications 모듈 생성 - 하드코딩 스케줄 (2025-09-27): main.py에 평일 12시 고정 → scheduler/jobs 모듈로 분리, 환경변수 제어