Springboot 활용하여 Discord , Telegram , Slack webHook 보내기

2023. 3. 19. 14:56BackEnd/Spring&Spring Boot

작성자알 수 없는 사용자

728x90
반응형

 

안녕하세요. 기깔나는 사람들에서 백인드를 맡고있는 Hardy입니다.

 

해당 글에서는 springboot를 베이스로 Discord , Telegram , Slack에 webHook을 사용하는 방법을 기재하려고 합니다.

 

이번 목차에서는 Discord를 활용하는 방법에 대해서 알아보겠습니다.

 


Springboot 프로젝트 생성(gradle)

- gradle 속성추가(starter)

implementation 'org.springframework.boot:spring-boot-starter-web'
implementation group: 'org.springframework.boot',name:'spring-boot-starter-webflux',version:'2.7.3'

 


Webhook에 보낼 데이터 

- webHook으로 보낼데이터를 먼저 확인해보겠습니다.

- 서버에서 발생하는 Error 로그를 남기는 데이터 입니다.

 

-  webhook으로 보낼 데이터는 stackTrace , error내용 , HttpHeader , Body , 사용자 환경정보 , 요청 url등을 보내야 합니다.

- 여기서 Header , Body , 사용자 환경정보 , 요청 url은 클라이언트의 요청으로 부터 얻을 수 있는 내용들입니다.

 

HttpRequest 요청 정제하기

- 먼저 HttpRequest데이터를 정제하기 위해 Filter를 사용했습니다.

 

- OncePerRequestFilter

  • 한번의 요청에 대해 한번만 실행하는 필터입니다.
  • 다른 필터에의해서는 다시 실행되지 않음을 보장하게 되는 filter 입니다.

- MDC

  • slf4j에서 제공하는 것으로 현재 실행중인 쓰레드에 메타 정보를 넣고 관리하는 공간입니다.
  • 요청마다 해당 데이터가 생성되고 관리됩니다.

- CaheServletRequest는 제가 정의한 HttpServletRequestWrapper 입니다.

  • 직접 정의한 이유는 HttpServletRequest에서 body정보를 가져오기 위해서는 InputStream을 사용하게 되는데 한번 사용하게 되면, Controller단에 들어왔을때 요청값을 사용할 수 없게 됩니다.
  • 이와 같은 이유로 요청 데잍터를 저장하고 , body데이터를 다시 사용하기 위해 새롭게 정의했습니다.
  • 아래 두 클래스를 정의하게 되면 클라이언트로 부터 넘어온 데이터를 다시 사용할 수 있습니다.

CacheSevletRequest
CacheSevletInputStrema

 

- parser의 역할은 HttpHeader에서 파싱한 데이터를 직접 적으로 원하는 데이터를 생성하고 , json값으로 변경합니다.

 

 

- BodyParser은 parser의 구현체로 body 정보를 가지고 오는 역할을 합니다. 이와 같이 Parser을 구현해 주시면 됩니다.

BodyParser

 

- 위에 과정이 끝났다면 webHook으로 보낼 데이터를 정제하는것까지 완료 되었습니다.

 

DiscordWebHook 설정 하기

- 우선 discordWebHook url을 획득 해야 합니다. 아래 두 이미지처럼 진행하면 webHookUrl을 얻을 수 있습니다.

 

webhook을 보내고자 하는 서버 설정누르기
-

- webHook url을 획득 했다면 springboot -> application.yml에 해당 설정을 넣어주시면 됩니다.

discord:
  webhook-uri: ~~

 

여기까지 왔다면 보낼 준비는 끝이 났습니다.

 

DiscordWebHook 보내기(DiscordAppender)

 

- AppenderBaser<ILoggingEvent> 상속하여 DiscordAppender를 구현했습니다.

  • 해당 클래스의 역할은 서버에서 발생한 로그를 받는 역할을 합니다.
  • 로그 이벤트가 발생하면 append메소드가 호출이 되고 , append메소드 안에서 디스코드에 메시지를 보내게 됩니다.
  • 해당 클래스는 커스텀한 Log Appender 이기 때문에 LoggerContext에 등록해주어 햡니다.
    • 등록하기 위해서 @PostContstruct를 사용해 빈이 생성되고 난 이후에 수행 되도록 구현했습니다.

 

DiscordWebHook 클래스

- 해당 클래스에서는 디스코드에 보낼 메시지를 생성합니다.

- 생성된 메시지는 WebClient를 통해서 요청을 보내게 되며 , 요청이 성공했다면 디스코드에 내가 보낸 메시지가 노출이 됩니다.

 

 

DiscordMessageGenerator 클래스

 

- 디스코드에 메시지를 보내기 위해서 디스코드에서 정해준 형식에 맞는 데이터로 정재하는 역할을 수행합니다.

- 디스코드에 보내기 위한 메시지 형태는 https://discohook.org/ 해당 사이트에서 확인할 수 있으면 , 데이터도 보낼 수 있습니다.

- 디스코드에 보낼 수 있는 각각의 필드마다 데이터 length가 정해져 있기 때문에 Length를 제한하도록 했습니다.

 

여기까지 완료 되었으면 모든 준비가 완료 되었습니다.

 

 

DiscordWebHook 확인하기

- NullPointerException이 발생하는 컨트롤러를 생성합니다.

- 그 이후 서버를 구동 시키고, 해당 컨트롤러에 요청을 보내도록 해봅시다.

 

- 해당 컨트롤러에 요청을 보내면 디스코드에 해당 메시지가 전송된걸 확인 할 수 있습니다.

 

여기까지 디스코드 웹훅 보내기였습니다~~ 다음글에서는 slack에 보내는 코드도 살펴보겠습니다.


 

 


💡 참고 사항
<양식>

참고자료

🔗 - https://medium.com/chequer/springboot-slack-logback%EC%9D%84-%EC%9D%B4%EC%9A%A9%ED%95%9C-%EC%8B%A4%EC%8B%9C%EA%B0%84-%EC%97%90%EB%9F%AC-%EB%AA%A8%EB%8B%88%ED%84%B0%EB%A7%81-%EA%B5%AC%ED%98%84%ED%95%98%EA%B8%B0-7f231812d3fc

 

 

 

 

 

 

728x90
반응형