Skip to content

feat: 주간 랭킹 자동 발송 기능 구현#22

Merged
choihooo merged 6 commits intodevfrom
feat/weekly-ranking-scheduler
Mar 9, 2026
Merged

feat: 주간 랭킹 자동 발송 기능 구현#22
choihooo merged 6 commits intodevfrom
feat/weekly-ranking-scheduler

Conversation

@choihooo
Copy link
Copy Markdown
Collaborator

@choihooo choihooo commented Mar 9, 2026

🎯 Summary

이 PR의 목적을 한 줄로 요약해주세요
매주 일요일 22:00 KST에 전체 멤버 랭킹을 자동으로 발송하는 Discord 봇 스케줄러 구현


🔴 AS-IS

기존 상태 또는 문제점

  • 주간 랭킹이 자동으로 발송되지 않음
  • pg-boss에서 "Queue weekly-ranking not found" 에러 발생
  • 랭킹 계산 로직이 없음

🟢 TO-BE

변경 후 상태 또는 개선점

  • 매주 일요일 22:00 KST에 주간 랭킹 자동 발송
  • pg-boss 큐 초기화 문제 해결 (boss.createQueue() 활용)
  • RankingService로 활동 점수 기반 랭킹 계산
  • Discord Embed 메시지로 포디엄 + 전체 랭킹 표시
  • Property-Based Test 15개 통과

💬 참고사항

리뷰어가 알아야 할 내용, 논의 포인트, 주의사항 등

구현 내용

  1. WeeklyRanking 스케줄러: 매주 일요일 22:00 KST 실행
  2. RankingService: 총점 = (포스트 수 × 30) + 활동 점수
  3. pg-boss 해결: boss.createQueue()로 큐 명시적 생성

테스트 현황

  • ✅ Property-Based Test 15개 통과 (최소 100회 반복)
  • ✅ 로컬에서 봇 시작 후 스케줄 등록 확인 (8개 스케줄러)
  • ⏳ Discord 채널 ID 등록 필요
  • ⏳ 실제 랭킹 발송 테스트 필요

커밋 분리

  1. feat: 주간 랭킹 자동 발송 스케줄러 구현 - 새로운 기능
  2. fix: pg-boss 큐 초기화 문제 해결 - 버그 수정
  3. docs: 주간 랭킹 구현 플랜 및 문제 해결 가이드 추가 - 문서화

관련 문서

  • docs/plans/26-03-09-weekly-ranking-implementation.md - 구현 플랜
  • docs/plans/26-03-09-pg-boss-queue-troubleshooting.md - 문제 해결 가이드

choihooo and others added 3 commits March 9, 2026 15:26
- WeeklyRanking 스케줄러 추가 (매주 일요일 22:00 KST)
- RankingService 추가 (활동 점수 기반 랭킹 계산)
- Property-Based Test 15개 통과
- Discord Embed 메시지 포맷 (포디엄 + TOP 15)
- KST 날짜 처리 (월요일 00:00 ~ 일요일 23:59)

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- boss.createQueue() 내부 API로 큐 명시적 생성
- weekly-ranking 스케줄러 활성화 (8개 스케줄러 정상 등록)
- job-queue.ts에 pg-boss 설정 추가 (_uuid: 'v1')
- scheduler-registry.ts에 큐 생성 로직 추가

문제: boss.schedule()은 큐를 자동 생성하지 않음
해결: boss.work() 전에 boss.createQueue()로 큐 먼저 생성

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- 26-03-09-weekly-ranking-implementation.md: 구현 플랜 (상태: 완료)
- 26-03-09-pg-boss-queue-troubleshooting.md: 문제 해결 가이드

pg-boss 문제 해결 과정:
1. boss.work() 후 boss.schedule() 순서 변경 (실패)
2. 대기 시간 추가 (실패)
3. boss.send()로 더미 잡 전송 (실패)
4. pg-boss 설정 변경 (실패)
5. boss.createQueue() 내부 API 사용 (성공)

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
@choihooo choihooo requested a review from bbbang105 as a code owner March 9, 2026 06:57
@vercel
Copy link
Copy Markdown

vercel bot commented Mar 9, 2026

The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Actions Updated (UTC)
study-admin-web Ready Ready Preview, Comment Mar 9, 2026 7:52am

@bbbang105 bbbang105 added ✅ test 테스트 코드 📄 docs 문서 추가 및 수정 🚀 feat 새로운 기능 추가 / 일부 코드 추가 / 일부 코드 수정 (리팩토링과 구분) / 디자인 요소 수정 🚨 fix 버그 수정 / 에러 해결 labels Mar 9, 2026
- @ts-ignore@ts-expect-error로 변경
- 사용하지 않는 discordIdArb 변수 제거

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- PgBoss 생성자 두 번째 인자 제거 (_uuid 설정)
- 사용하지 않는 @ts-expect-error 지시자 제거

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
@bbbang105 bbbang105 added the 🔧 ci CI/CD 파이프라인 변경 label Mar 9, 2026
## 수정 내용

### 🔴 심각한 이슈
- **KST 날짜 처리 불일치 수정**: `formatKSTDate()` 헬퍼 함수 추가로 KST 시간에서 직접 날짜 포맷팅
- **활동 점수 쿼리 타입 안전성 개선**: 하드코딩된 문자열을 `ActivityScoreType` enum 상수로 변경

### 🟡 중간 우선순위 이슈
- **경쟁 조건 해결**: `isRunning` 플래그를 Promise 기반 뮤텍스(`runningLock`)로 대체하여 동시 실행 문제 해결
- **빈 랭킹 경고 추가**: `WeeklyRankingResult`에 `warnings` 필드 추가

### 🟢 낮은 우선순위 이슈
- **매직 넘버 제거**: 포스트 점수 상수 `BLOG_POST_SCORE_POINTS = 30` 추출
- 테스트 코드에서도 동일한 상수 사용

## 테스트 결과
- ✅ 타입 체크 통과
- ✅ 모든 테스트 통과 (133개 테스트)
- ✅ 린트 통과

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
@choihooo choihooo merged commit 8d45abd into dev Mar 9, 2026
7 checks passed
@choihooo choihooo deleted the feat/weekly-ranking-scheduler branch March 9, 2026 13:35
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

🔧 ci CI/CD 파이프라인 변경 📄 docs 문서 추가 및 수정 🚀 feat 새로운 기능 추가 / 일부 코드 추가 / 일부 코드 수정 (리팩토링과 구분) / 디자인 요소 수정 🚨 fix 버그 수정 / 에러 해결 ✅ test 테스트 코드

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants