springboot

[SpringBoot] Discord WebHook 연동해보기

inhooo00 2025. 3. 4. 03:29

📍개요

이번에 진행하는 프로젝트에서 신고하는 로직이 있습니다.
이 로직을 서버에서 빠르게 인지하기 위해서 많이 사용하는 Discord와 연결해보고자 합니다.

 

 

 

📍디스코드 설정

먼저 디스코드 알림을 위한 채널을 생성합니다.

그 후 연동 -> 웹후크 -> 새 웹후크로 웹후크를 생성한 후, 웹후크 URL을 복사해줍니다.

이제 이 URL를 사용해서 연결해주기만하면 끝!

 

 

 

📍코드로 구현하기

package shop.babsim.babsim_betta.global.discord.dto;

import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;

public record DiscordWebhookMessage(
        String content
) {
    public static DiscordWebhookMessage of(String content, String memberId) {
        String timestamp = getCurrentTime(); // 현재 시간 가져오기
        String formattedMessage = formatMessage(content, memberId, timestamp);

        if (formattedMessage.length() >= 2000) {
            formattedMessage = formattedMessage.substring(0, 1993) + "\n...```";
        }
        return new DiscordWebhookMessage(formattedMessage);
    }

    private static String formatMessage(String content, String memberId, String timestamp) {
        return """
                **[시스템 알림]**
                📢 메시지: `%s`
                👤 멤버 ID: `%s`
                🕒 시간: `%s`
                """.formatted(content, memberId, timestamp);
    }

    private static String getCurrentTime() {
        return LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
    }
}

스프링 코드로 가서 디스코드에 전달되는 content를 만들어 보겠습니다. 
기존에 DTO를 만들 듯이 구현해줍니다. 

알림 정보는 현재 시간과, 멤버 ID (기본키), 메세지로 구성하였습니다.

멤버의 이름이나, 에러 코드 등 다양한 정보도 포함할 수 있겠습니다.🌝

 

 

@Service
public class DiscordWebhookUtil {

    @Value("${logging.discord.webhook-url}")
    private String discordWebhookUrl;

    public void sendDiscordMessage(String message, String memberId) {
        try {
            DiscordWebhookMessage discordMessage = DiscordWebhookMessage.of(message, memberId);

            HttpHeaders headers = new HttpHeaders();
            headers.setContentType(MediaType.APPLICATION_JSON);

            HttpEntity<DiscordWebhookMessage> request = new HttpEntity<>(discordMessage, headers);

            new RestTemplate().postForEntity(discordWebhookUrl, request, String.class);

            System.out.println("✅ 디스코드 알림 전송 완료: " + message);
        } catch (Exception e) {
            System.err.println("❌ 디스코드 메시지 전송 실패: " + e.getMessage());
        }
    }
}

sendDiscordMessage 메서드입니다. 이 메서드를 호출함으로써 디스코드에 알림이 오게 됩니다.

아까 복사한 디스코드 웹훅 URL을 주입해줍니다. yml 파일 등 선호하는 방법으로 환경변수를 관리하면 되겠습니다.

 

디스코드 API는 JSON 형식의 데이터를 받습니다. 따라서 Content-Type을 application/json으로 설정해야 합니다.

그 후, 디스코드로 전송할 데이터(discordMessage)와 HTTP 헤더를 묶어서 요청 객체 생성하고 RestTemplate를 통해 HTTP POST 요청을 보내고 응답을 받으면 끝입니다.

 

 

 

📍결과 확인

다양한 방식으로 데이터를 커스텀해서 보내보았습니다.

앞으로 유저가 보내는 신고는 바로 디스코드로 확인할 수 있으니 편리할 것 같습니다 ^^