📍개요
이번에 진행하는 프로젝트에서 신고하는 로직이 있습니다.
이 로직을 서버에서 빠르게 인지하기 위해서 많이 사용하는 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 요청을 보내고 응답을 받으면 끝입니다.
📍결과 확인
다양한 방식으로 데이터를 커스텀해서 보내보았습니다.
앞으로 유저가 보내는 신고는 바로 디스코드로 확인할 수 있으니 편리할 것 같습니다 ^^
'springboot' 카테고리의 다른 글
[SpringBoot] Spring Batch로 csv파일을 db에 저장해보자 (0) | 2025.03.08 |
---|---|
[SpringBoot] Google Places API 사용해보기 (0) | 2025.03.06 |
[SpringBoot] JPA, Hibernate, 그리고 Spring Data JPA 톺아보기 (0) | 2025.02.19 |
[SpringBoot] @Transactional을 정확하게 알아보자 (1) | 2025.01.15 |
[SpringBoot] N+1 문제와 해결 방법 (0) | 2025.01.10 |