코딩마을방범대
SpringBoot에서 Slack Webhoook 사용하기 본문
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 Boot] 슬랙 메시지 보내기(Incoming WebHooks)
'💡 백엔드 > Java' 카테고리의 다른 글
Java의 Reflection 기능을 사용하는 방법 (0) | 2023.07.26 |
---|---|
Java에서 OS의 시스템에 접근하기 (0) | 2023.07.25 |
Optional에 대하여 (0) | 2023.07.25 |
웹 소켓을 이용한 메시지 전송 프로세스의 이해 (1) | 2023.07.13 |
Java의 타이머 (Timer) (0) | 2023.06.22 |