Skip to content

[FEATURE] Discord Webhook 알림 연동 #161

@ryuwldnjs

Description

@ryuwldnjs

배경

현재 스케줄러 작업(문제 추천, 이메일 발송)의 성공/실패 여부나 주요 비즈니스 이벤트(회원가입)를 확인하려면 로그를 직접 확인해야 한다.
Discord Webhook을 통해 실시간 알림을 받으면 운영 가시성이 크게 향상된다.

알림 대상

채널 이벤트
#scheduler 문제 추천 생성 완료/실패, 이메일 발송 완료/실패
#events 회원가입
#errors 외부 API 실패 (solved.ac 등), 예상치 못한 서버 에러

채널별 메시지 내용

#scheduler — 문제 추천

성공:

필드 예시
제목 문제 추천 완료
대상 팀 수 3개
총 추천 문제 수 15개
소요 시간 2.3s
타임스탬프 2026-02-17 06:00:00

실패:

필드 예시
제목 문제 추천 실패
실패 팀 TeamA
에러 메시지 DB connection timeout
성공/실패 2팀 성공 / 1팀 실패
타임스탬프 2026-02-17 06:00:00

#scheduler — 이메일 발송

성공:

필드 예시
제목 이메일 발송 완료
발송 건수 12건
소요 시간 5.1s
타임스탬프 2026-02-17 09:00:00

실패:

필드 예시
제목 이메일 발송 실패
실패 건수 3건
에러 메시지 SES rate limit exceeded
성공/실패 9건 성공 / 3건 실패
타임스탬프 2026-02-17 09:00:00

#events — 회원가입

필드 예시
제목 새 회원 가입
닉네임 ryu
BOJ 핸들 ryu123
타임스탬프 2026-02-17 14:30:00

#errors — 에러

필드 예시
제목 외부 API 실패
예외 클래스 SolvedAcApiException
메시지 429 Too Many Requests
요청 URL /api/v3/user/show
요청 메서드 GET
타임스탬프 2026-02-17 12:00:00

구현 방향

방식

  • Discord Webhook (단방향 HTTP POST)
  • 채널별 Webhook URL 분리

설정

discord:
  webhooks:
    scheduler-url: ${DISCORD_WEBHOOK_SCHEDULER_URL}
    events-url: ${DISCORD_WEBHOOK_EVENTS_URL}
    errors-url: ${DISCORD_WEBHOOK_ERRORS_URL}

환경 분리

  • prod 프로필에서만 활성화
  • 로컬/테스트 환경에서는 로그만 출력

호출 방식

  • 현재: 필요한 곳에서 DiscordWebhookSender 직접 호출
  • 추후: Spring Event + @Async로 비동기 분리 (별도 이슈)

패키지 구조

infrastructure/
  └── discord/
      ├── DiscordWebhookSender.java   # Webhook HTTP 호출
      └── DiscordMessage.java         # 메시지 구조 (Embed)

메시지 형태

Discord Embed 사용 (색상, 제목, 필드, 타임스탬프)

범위 외

  • 비동기 이벤트 처리 (별도 이슈)
  • Discord Bot (불필요)
  • 글로벌 500 에러 전체 알림 (특정 예외만 대상)

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    Status

    Done

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions