Skip to content

feat: 전체 성능 개선 및 텍스트·슬래시 명령 로직 리팩토링 - #72

Merged
koreahghg merged 3 commits into
developfrom
feat/performance-refactor
Sep 24, 2026
Merged

koreahghg merged 3 commits into
developfrom
feat/performance-refactor

Conversation

@koreahghg

Copy link
Copy Markdown
Member

개요

봇 전반의 응답 속도, DB 부하, 안정성을 개선하고 텍스트/슬래시 명령의 중복 로직을 정리했습니다.

성능

  • 외부 API: NEIS/기상청 호출을 keep-alive fetch로 통일해 매 요청마다 하던 TLS 핸드셰이크를 없앰
  • 캐시 (cache.ts): 동시에 들어온 같은 요청은 한 번만 호출하고, "결과 없음"도 짧게 캐시 (시간표·학사일정·날씨)
  • 슬래시 3초 제한: 캐시 미스일 때 먼저 defer해서 "상호작용 실패" 방지
  • DB
    • 카지노 버튼 정산 왕복 최대 6회 → 2회, getUser 2회 → 대부분 1회
    • !랭킹용 (guild_id, balance) 인덱스 추가
    • 부팅마다 기본키를 재생성하던 마이그레이션을 스키마 확인 후 필요할 때만 실행
  • 스케줄러: 매분 DB 전체 조회 → 메모리 캐시 (등록/삭제 시와 매시 정각에 갱신)
  • 메모리: 디스코드 메시지 캐시 제한, GIF blob 캐시 64MB LRU
  • 라우팅: !로 시작하지 않는 일반 채팅은 GIF 키워드·알림 마법사만 확인

버그 수정

  • 응답 실패(권한 없음 등)로 발생한 unhandled rejection이 봇 프로세스 전체를 종료시키던 문제
  • 코인/룰렛/바카라 버튼을 안 누르면 도박이 재시작 전까지 영구 잠기던 문제 (5분 후 만료)
  • 버튼 연타나 옛 게임 메시지 버튼으로 중복 정산되던 문제 (customId에 게임 id 추가)
  • !출석/!일/!지원금/!송금 연타 시 중복 지급·잔액 초과 송금 (조건부 UPDATE로 원자 처리)
  • 코인플립 정산 시 잔액 미확인으로 음수 잔액이 가능하던 문제
  • 알림이 많으면 !알림목록이 2000자 제한으로 전송 실패하던 문제
  • 앞 분 발송이 늦으면 다음 분 알림을 건너뛰던 문제

리팩토링

  • Ctx에 defer / replyPrivate / isAdmin 추가, 음악·카지노·스케줄러·시간표의 텍스트/슬래시 중복 제거 (음악 642 → 410줄)
  • 도박 on/off를 공통 handleAdminToggle로 이동
  • deprecated된 ephemeral: true → MessageFlags.Ephemeral
  • npm test 스크립트, 캐시·게임 세션 단위 테스트 추가

동작 변화

  • !play의 "검색 중..." 메시지 → 입력 중 표시 (API 호출 2회 절약)
  • 배포 전에 올라온 게임 메시지 버튼은 "만료된 게임" 안내
  • DB 커넥션 timezone: "Z" 설정 (Docker 환경은 원래 UTC라 동일)

테스트

  • npm run typecheck, npm run format:check, npm test (30개) 통과
  • ⚠️ 실제 DB/디스코드 환경에서는 아직 실행해 보지 않았습니다. 머지 전 로컬 docker-compose로 부팅(마이그레이션)과 출석·송금·도박 확인 필요

🤖 Generated with Claude Code

feat: 급식 캐시 개선 및 관리자 권한 에러를 본인만 보이게 변경
@koreahghg
koreahghg merged commit a268ac4 into develop Sep 24, 2026
6 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant