[스프링부트] 디스코드 웹훅 연동하기

2024. 9. 22. 01:39·스프링부트 메모

⭐️ 목적

웹훅 연동의 필요성은 신고하기 기능 구현으로부터 나타났다.

 

사용자가 신고를 했을 경우 운영자가 직접 처리해야 했기 때문에
운영측을 위한 알림 기능이 필요했다.

 

알람 구현 방법은 두 가지가 있었다.

  1. Amazon Lambda
  2. Slack 또는 Discord 웹훅 연동

아무래도 아마존 람다의 경우 러닝커브가 굉장히 클 것이라는 팀원의 의견을 수용해서
웹훅을 연동하기로 결정했다.

 

슬랙과 디스코드 중에 결정했어야 했는데 프로젝트 소통 플랫폼이 디스코드였기 때문에
자연스럽게 디스코드 웹훅을 연동하게 되었다.

 

 

✅ 구현 과정 (간략)

1. 연동할 디스코드 채널 생성 및 설정

 

메시지를 받고 싶은 채널을 생성하고 웹후크 설정을 한다.

 

설정한 웹후크의 URL을 사용하여 스프링부트 프로젝트에 연동할 것이다.

 

2. 스프링부트 application.yml에 Config 추가

discord-report-bot:
  name: discord-report-client
  webhook-url: 웹 후크 URL 복붙

 

나는 신고하기 알림용을 쓸 것이기 때문에 이름을 임의로 저렇게 지었다.

 

3. 디스코드 HTTP Client 생성

디스코드에 메시지를 전송하기 위해선 HTTP POST 요청을 보내야 한다.

 

Feign Client를 이용하여 디스코드 클라이언트를 생성하고,

전송용 POST 요청 메소드를 작성하고 이를 이용하면 된다.

@FeignClient(name = "${discord-report-bot.name}", url = "${discord-report-bot.webhook-url}")
public interface DiscordClient {
    @PostMapping
    메시지 전송 함수 구현...
}

 

참고로 디스코드는 요청 본문에 JSON만을 허용한다.

{
	"content": "message"
}


바로 content에 본인이 원하는 메시지를 집어넣어 전송하면 된다.

(디스코드는 마크다운을 지원하기 때문에 기호에 따라 휘뚜루마뚜루 사용하면 된다)

 

실제 예시

 

 

 

✅ 고민한 부분

# HTTP Client 선택

클라이언트를 어떤 방식으로 생성할 지 여러 구현 코드들을 보면서 고민해봤다.

 

구현에서 보통 RestTemplate, Feign Client 이 두 가지를 사용하고 있었다.

 

둘 중 Feign Client를 선택한 이유는

  1. RestTemplate에 비해 코드가 간결하고 직관적이다 (= 코드짜기 쉽다)
  2. 요청 인터페이스가 매우 간단하다 (기존 스프링부트 어노테이션처럼 매핑)

이다.

 

 

✅ 트러블 슈팅

# Feign Client 활성화

단순히 @ForignClient로 클라이언트 정의하고 사용하면 되는줄 알았더니

직접 메인 어플리케이션 클래스에서 활성화 시켜줘야 한다.

@EnableFeignClients("com.gdyd.gdydsupport")
public class ExampleApplication {
    public static void main(String[] args) {
        SpringApplication.run(ExampleApplication.class, args);
    }
}

 

 

 

✅ 공부한 내용

# 웹훅

구현 목적은 스프링부트 프로젝트에 디스코드라는 추가 기능을 가진 서브 파티를 붙이는 것이다.

 

만약 프로젝트가 클라이언트의 관점에서 메시지를 보낼 경우, 디스코드의 상태에 따라 영향을 받게 되는

다시 말해 의존성이 생겨 주종관계가 역전되는 문제가 발생한다.

 

즉, 스프링부트 프로젝트가 서버, 디스코드가 클라이언트의 역할이 되어야만 한다.

 

하지만 클라이언트의 요청 -> 서버의 응답이 일반적인 흐름이기 때문에

디스코드를 통해 이벤트 알림을 받기 위해선, 끊임없는 요청을 날려야한다.

 

디스코드가 이벤트가 발생했는지 계속해서 프로젝트에게 질문을 해야한다는 것이다.

 

이런 경우 웹훅을 사용하면 된다.

 

웹훅 정의를 보면, 웹훅은 '웹페이지 또는 웹앱에서 발생하는 특정 행동(이벤트)들을 커스텀 Callback으로 변환해주는 방법'을 말한다.

(Callback: 특정 이벤트가 발생하거나 작업이 끝난 후, 미리 정의된 동작을 수행하도록 예약된 함수)

 

웹훅을 이용하게 되면 서버에서 이벤트가 발생할 경우 클라이언트를 호출하게 된다. (그래서 역방향 API라고 불린다)

 

여기서 서버가 클라이언트를 호출하기 위해 지정한 주소를 CallbackURL이라고 하며,

이번 케이스에서는 디스코드 웹후크 URL이 여기에 해당한다.

'스프링부트 메모' 카테고리의 다른 글

[스프링부트] Builder 패턴에 대해 알게 된 점  (0) 2024.11.10
[스프링부트] GenerationType.IDENTITY vs GenerationType.SEQUENCE  (0) 2024.11.07
[스프링부트] 자동 답변 봇 구현 (AI 서버와의 연결)  (2) 2024.09.25
[스프링부트] 이메일 전송 기능 구현하기  (0) 2024.09.23
[스프링부트] 메모 시작  (0) 2024.09.22
'스프링부트 메모' 카테고리의 다른 글
  • [스프링부트] GenerationType.IDENTITY vs GenerationType.SEQUENCE
  • [스프링부트] 자동 답변 봇 구현 (AI 서버와의 연결)
  • [스프링부트] 이메일 전송 기능 구현하기
  • [스프링부트] 메모 시작
csb0710
csb0710
  • csb0710
    데모장
    csb0710
  • 전체
    오늘
    어제
    • 분류 전체보기 (51)
      • 스프링부트 메모 (6)
      • 개발 메모 (3)
      • 클라우드 메모 (10)
      • 설치&설정 메모 (2)
      • 알고리즘 메모 (18)
      • 인턴 메모 (7)
      • 데이터베이스 메모 (3)
      • 책 메모 (1)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    ELK Stack
    스프링부트
    코드트리
    디비설정
    자동 답변 봇
    GitHub
    서버배포
    서버생성
    알고리즘
    코드트리조별과제
    서버 연결
    디비설치
    백준
    .gitmodules
    티스토리챌린지
    이지퍼블리싱
    코딩테스트
    submodule
    그리디
    오블완
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.2
csb0710
[스프링부트] 디스코드 웹훅 연동하기
상단으로

티스토리툴바