코딩마을방범대

SpringBoot에서 Slack Webhoook 사용하기 본문

💡 백엔드/Java

SpringBoot에서 Slack Webhoook 사용하기

신짱구 5세 2023. 7. 25. 15:36
728x90

 

 

REST API로 구축된 웹서비스의 경우 해당 URL에 맞는 하나의 API를 호출하면 하나의 응답을 제공한다.

따라서 어떠한 이벤트가 발생했는지를 조회하기 위해서는 LOG 등을 통해 개발자가 직접 확인해야 알 수 있는 구조이다.

 

만약 서버에 예상치 못한 예외가 발생했을 때 개발자가 실시간으로 바로 알 수 있는 방법은 없다.

스케줄러 등을 이용해 주기적으로 확인한다쳐도 이미 이벤트가 발생한 한참 뒤일 수도 있다.

 

이 단점을 극복하기 위해 웹훅을 사용하며, 이 웹훅에 대해서 알아볼 예정이다.

 

 

 

 


 

웹훅이란?

  • 웹페이지 or 웹앱에서 발생하는 특정 행동(이벤트)들을 커스텀 Callback으로 변환해주는 방법
  • 행동 정보를 실시간으로 제공하는데 사용됨
  • 서버에서 특정 이벤트가 발생했을 때, 클라이언트를 호출하는 방식으로써 역방향 API라고도 불림
    (일반적인 API(Polling)는 클라이언트가 서버를 호출하는 방식)

Callback URL이란?
서버측에서 클라이언트의 어떤 URL로 데이터를 보낼지 정해놓은 주소

 

 


 

 

Webhook Endpoint이란?

  • 이벤트의 목적지인 Target
  • 이벤트가 어디로 전달되어야 하는가에 대한 것

 

💣 주의할 점

  • 웹앱이 중단된 경우, 웹훅으로부터 오는 데이터가 유실될 가능성이 존재함
  • 웹훅으로부터 오는 요청을 처리 완료했지만, response를 제대로 보내지 못했을 경우에 웹훅에서 response가 실패인 것으로 확인하고 동일한 정보를 다시 보낼 가능성

 

 


 

 

 

 

 

🔊 Slack Webhook 링크 가져오는 방법

 

1. Webhook을 설치할 채널의 설정 -> 앱 추가 선택

 

 

2. Incoming WebHooks 설치

 

3. url 복사

 

 

 

 

 


 

 

 

 

Java에서 Slack 보내기

 

자바에서 보낼 때 간단하게 메소드에 모든 설정을 넣는 것과 logback을 통해 보내는 방법 두가지가 있다.

 

 

 


 

 

 

url을 호출하여 메소드로 사용하기

 

// API 호출을 위한 인스턴스 선언
RestTemplate restTemplate = new RestTemplate();
String url = //Webhook URL

// 메시지 정보
Map<String,Object> sendMsg = new HashMap<String,Object>();
sendMsg.put("username", "이름");
sendMsg.put("text", "보낼 내용");

HttpEntity<Map<String,Object>> entity = new HttpEntity<Map<String,Object>>(sendMsg);

restTemplate.exchange(url, HttpMethod.POST, entity, String.class);

HttpEntity란?
헤더와 바디로 이루어진 HTTP request, response 엔티티

 

 

 


 

 

Logback을 이용하기

 

1. application.yml

logging:
  slack:
    webhook-uri: //웹훅링크 
  config: classpath:logback-slack.xml

 

2. logback-slack.xml

※ Level을 ERROR로 설정했기 때문에 ERROR로 찍은 로그로만 발송됨.

<?xml version="1.0" encoding="UTF-8" ?>
<configuration>
    <springProperty name="SLACK_WEBHOOK_URI" source="logging.slack.webhook-uri"/>
    <appender name="SLACK" class="com.github.maricn.logback.SlackAppender">
        <!-- Slack API token -->
        <!-- <token>1111111111-1111111-11111111-111111111</token>-->
        <!-- Slack incoming webhook uri. Uncomment the lines below to use incoming webhook uri instead of API token. -->
        <webhookUri>${SLACK_WEBHOOK_URI}</webhookUri>
        <!-- Channel that you want to post - default is #general -->
        <!-- <channel>#api-test</channel>-->
        <!-- Formatting (you can use Slack formatting - URL links, code formatting, etc.) -->
        <layout class="ch.qos.logback.classic.PatternLayout">
            <pattern>%msg%n</pattern>
        </layout>
        <!-- Username of the messages sender -->
        <username>error_msg</username>
        <!-- If color coding of log levels should be used -->
        <colorCoding>true</colorCoding>
    </appender>
    
    <!-- Currently recommended way of using Slack appender -->
    <appender name="ASYNC_SLACK" class="ch.qos.logback.classic.AsyncAppender">
        <appender-ref ref="SLACK"/>
        <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
            <level>ERROR</level>
        </filter>
    </appender>
    
    <root>
        <level value="ALL"/>
        <appender-ref ref="ASYNC_SLACK"/>
    </root>
</configuration>

 

3. build.gradle

dependencies {
	implementation 'com.github.maricn:logback-slack-appender:1.6.1'
	implementation group: 'eu.bitwalker', name: 'UserAgentUtils', version: '1.17'
	implementation 'net.gpedro.integrations.slack:slack-webhook:1.4.0'
}

 

4. 사용

  • @Slf4j 어노테이션 추가 후, log.error()를 통해 오류 메시지 전송
@Slf4j
public class Controller {
	public void test(){
    	log.error("전송된 데이터에 오류가 있습니다.");
    }
}

 

 

 

 

 

 

 


 

 

 

 

RestTemplate 이란?

Rest 방식 API를 호출할 수 있는 Spring 내장 클래스

 

RestTemplate의 메소드

exchange

  • 접속할 url, httmlMethod 타입, request entity, responseType

 

 

 

 

 

 

 


참고사이트

[Spring]스프링 RestTemplate

웹훅[Webhook]이란 무엇일까?

[Spring Boot] 슬랙 메시지 보내기(Incoming WebHooks)

 

 

728x90