Java/Spring Boot
[Java] Spring Boot 환경에서 Slack Incoming Webhook 이해하고 구성하기 -1 : 초기 구성 및 간단 메시지 전송
adjh54
2024. 9. 20. 20:00
반응형
해당 글에서는 Spring Boot 기반의 Java를 활용하여서 Slack Incoming Webhook을 API 호출을 통해 간단한 메시지를 전송하는 방법에 대해 확인합니다.
💡[참고] Spring Boot 환경에서 Slack을 활용한 예시 글들입니다.
분류 | 링크 |
Slack Incoming Webhook 이해하고 구성하기 -1 : 초기 구성 및 간단 메시지 전송 | https://adjh54.tistory.com/568 |
Slack Incoming Webhook 이해하고 구성하기 -2 : 다양한 메시지 전송 방법 | https://adjh54.tistory.com/569 |
Spring Boot 환경에서 Slack Incoming Webhook 활용 코드 : GitRepository | https://github.com/adjh54ir/blog-codes/tree/main/spring-boot-slack |
1) Slack Incoming Webhook
💡Slack Incoming Webhook
- 외부 애플리케이션에서 Slack 채널로 메시지를 보내는 간단하고 효율적인 방법을 의미합니다.
- Incoming Webhook을 만들면 고유한 URL이 생기고, 이 URL에 메시지와 몇 가지 옵션이 포함된 JSON 페이로드를 보냅니다.
💡[참고] Curl을 이용하여 아래와 같이 Webhook URL을 통해서 메시지를 전송하는 CURL 예제입니다.
curl -X POST \\
-H 'Content-type: application/json' \\
-d '{"text":"Hello, World!"}' \\
<https://hooks.slack.com/services/T1234567/AAAAAAAA/ZZZZZZ>
1. 문자열을 통한 페이로드 전송 방법
💡문자열을 통한 페이로드 전송 방법
- Slack Webhook URL로 JSON 형식의 문자열을 직접 전송하는 방법을 의미합니다.
- 이 방법은 간단하고 직관적이지만 복잡한 메시지 구조를 만들기 어렵습니다.
import com.slack.api.Slack;
import com.slack.api.webhook.WebhookResponse;
Slack slack = Slack.getInstance();
String webhookUrl = System.getenv("SLACK_WEBHOOK_URL"); // <https://hooks.slack.com/services/T1234567/AAAAAAAA/ZZZZZZ>
String payload = "{\\"text\\":\\"Hello, World!\\"}";
WebhookResponse response = slack.send(webhookUrl, payload);
System.out.println(response); // WebhookResponse(code=200, message=OK, body=ok)
2. 객체를 통한 페이로드 전송방법
💡객체를 통한 페이로드 전송방법
- Slack SDK에서 제공하는 객체를 사용하여 메시지 구조를 만들고 전송하는 방법입니다.
- 이 방법은 Payload 객체의 Builder를 이용하여 구성하여 복잡한 메시지 구조를 쉽게 만들 수 있고, 타입 안정성을 제공합니다.
- 첨부파일(attachments)이나 블록(blocks)을 포함한 메시지를 만들 때 특히 유용합니다.
import com.slack.api.Slack;
import com.slack.api.webhook.Payload;
import com.slack.api.webhook.WebhookResponse;
Slack slack = Slack.getInstance();
String webhookUrl = System.getenv("SLACK_WEBHOOK_URL"); // <https://hooks.slack.com/services/T1234567/AAAAAAAA/ZZZZZZ>
Payload payload = Payload.builder().text("Hello, World!").build();
WebhookResponse response = slack.send(webhookUrl, payload);
System.out.println(response); // WebhookResponse(code=200, message=OK, body=ok)
반응형
2) Slack 환경 설정
1. Slack에서 채널을 하나 생성해 줍니다.
💡Slack에서 채널을 하나 생성해 줍니다.
- 해당 채널은 이제 Webhook을 통해 메시지를 전달받을 채널입니다.
2. Slack Apps - Add apps 버튼을 누릅니다.
3. "webhook"을 검색하고 "Incoming WebHooks" 앱을 "Add" 합니다.
4. 아래 페이지로 연결이 되고 “Add to Slack” 버튼을 누릅니다.
5. 사전에 생성한 채널을 선택하고 ‘Add Incoming WebHooks integration’ 버튼을 누릅니다.
6. 아래와 같이 최하단으로 내리면 WebHook URL 등 설정 정보를 지정할 수 있습니다. 이를 설정하고 Save Settings를 선택합니다.
요소 | 설명 |
Post to Channel | 앞으로 Java 내에서 전송하는 메시지가 수신되어 게시될 채널을 의미합니다. |
Webhook URL | 해당 URL로 JSON 페이로드 정보를 보내어 메시지가 수신되어 게시됩니다. |
Descriptive Label | 통합 목록에 추가 컨텍스트를 제공하기 위해 이 라벨을 사용합니다 (선택사항). |
Customize Name | 이 통합이 게시할 때 사용할 사용자 이름을 선택합니다. |
Customize Icon | 이 통합의 메시지에 사용될 아이콘을 변경합니다. |
7. Slack 채널로 돌아가서 확인하면 아래와 같은 메시지를 확인할 수 있습니다.
8. Postman을 이용하여 Slack 전송을 테스트해 봅니다.
💡Postman을 이용하여 Slack 전송을 테스트해 봅니다
- 이전에 확인된 Slack Webhook URL에 HTTP Method "POST" 방식을 통해서 JSON 형태의 데이터를 전송합니다.
{
"text": "Postman Test!!! "
}
9. Slack 내에서 수신이 확인되었습니다.
3) Slack API Client 설정 : Webhooks URL을 이용하는 방식
💡Slack API Client
- Slack의 Web API와 상호 작용하기 위한 Java 라이브러리입니다. 이 클라이언트를 사용하면 Slack의 다양한 기능에 프로그래밍 방식으로 접근할 수 있습니다.
Maven Repository: com.slack.api » slack-api-client
[ 더 알아보기 ]
💡 Slack Incoming Webhook을 이용하는 방법도 있던데 Slack API Client와의 차이점은 무엇일까?
- Java 환경에서는 Slack API Client 라이브러리를 활용해서 둘 다 사용이 가능하지만 아래와 같은 차이점이 있습니다.
특성 | Slack Incoming Webhook | Slack API Client |
용도 | 주로 메시지 전송에 사용 | 다양한 Slack 기능에 접근 가능 (메시지 전송, 채널 관리, 사용자 정보 조회 등) |
설정 복잡도 | 간단함 (URL만 필요) | 더 복잡함 (OAuth 토큰 필요) |
기능 범위 | 제한적 (메시지 전송 위주) | 광범위 (Slack의 거의 모든 기능 사용 가능) |
보안 | URL 기반 (상대적으로 덜 안전) | 토큰 기반 (더 안전하고 세밀한 권한 제어 가능) |
응답 처리 | 제한적 (성공/실패 정도만 확인 가능) | 상세한 응답 처리 가능 (에러 메시지, 상태 코드 등) |
1. 구성 개발 환경
구성 환경 | 버전 |
Java | jdk 17 |
Spring Boot | 3.3.3 |
Spring Boot Web | 3.3.3 |
com.slack.api:slack-api-client | 1.43.0 |
💡 아래의 코드 내용은 아래의 Repository 내에서 확인이 가능합니다.
2. 라이브러리 추가
💡 라이브러리 추가
- 해당 라이브러리는 API 형태를 구성하기 위해서 spring-boot-web을 이용하였고, Slack 채널과의 연동하여 서비스를 구성하기 위해 slack-api-client를 추가하였습니다.
dependencies {
implementation 'org.springframework.boot:spring-boot-starter-web:3.3.3'
implementation 'com.slack.api:slack-api-client:1.43.0'
}
Maven Repository: com.slack.api » slack-api-client » 1.43.0
3. application-xxx.yml 구성
💡application-xxx.yml 구성
- 발급받은 Slack URL을 통해서 접근하여 메시지를 전송하기 위해 yml 파일 내에 이를 저장합니다.
slack:
webhook:
url: <https://hooks.slack.com/services/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>
4. Service 구성
💡Service 구성
- Slack Webhook을 이용한 서비스를 구성한 클래스입니다.
1. @Value()
- 해당 어노테이션을 통해서 Slack의 접속정보를 조회해 옵니다.
2. Slack.getInstance()
- Slack 서비스를 이용하기 위해서 최초 인스턴스를 생성합니다.
3. Payload
- Slack으로 전달할 메시지를 .text() 메서드 내에 담아서 builder 패턴을 이용하여 구성합니다.
4. slack.send()
- 인스턴스의 .send()메서드를 통해 URL과 Payload를 담아서 전송합니다.
package com.blog.springbootslack.service;
import com.slack.api.Slack;
import com.slack.api.webhook.Payload;
import com.slack.api.webhook.WebhookResponse;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import java.io.IOException;
/**
* Slack Webhook 서비스
*/
@Service
public class SlackWebhookService {
@Value("${slack.webhook.url}")
private String webhookUrl; // application.properties 내에서 정의한 환경 정보를 가져옵니다.
private final Slack slack = Slack.getInstance(); // Slack 인스턴스를 생성합니다.
/**
* 간단한 Slack 메시지 전송 서비스
*
* @param paramText 전송 메시지
* @return Slack 응답 값
*/
public WebhookResponse sendToSimpleText(String paramText) {
Payload payload = Payload.builder().text(paramText).build(); // Slack에 전달할 Payload 구성
WebhookResponse response;
try {
response = slack.send(webhookUrl, payload); // Slack 메시지 전송
// WebhookResponse(code=200, message=OK, body=ok)
System.out.println(response);
return response;
} catch (IOException e) {
throw new RuntimeException(e);
}
}
}
5. Controller 구성
💡Controller 구성
- 해당 Controller에서는 간단한 Slack 메시지 전송을 위한 엔드포인트로 구성하였습니다.
- localhost 환경에 8080 포트에 접근하여 최종적으로 “/api/v1/slack/message” 엔드포인트를 호출하여서 해당 slack 메시지를 전송합니다.
package com.blog.springbootslack.controller;
import com.blog.springbootslack.dto.MessagesDto;
import com.blog.springbootslack.service.SlackWebhookService;
import com.slack.api.webhook.WebhookResponse;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;
@RestController
@RequestMapping(value = "/api/v1/slack")
public class SlackWebhookController {
private final SlackWebhookService slackWebhookService;
public SlackWebhookController(SlackWebhookService slackWebhookService) {
this.slackWebhookService = slackWebhookService;
}
/**
* 간단한 Slack 메시지 전송
*
* @param messageDto 서비스로 전달할 요청 객체
* @return
*/
@PostMapping("/message")
public ResponseEntity<Object> sendToMessage(@RequestBody MessagesDto messageDto) {
WebhookResponse wr = slackWebhookService.sendToSimpleText(messageDto.getMessage());
return new ResponseEntity<>(wr, HttpStatus.OK);
}
}
4) 결과화면
1. 구성한 API Endpoint로 구성한 API를 호출합니다.
💡 구성한 API Endpoint로 구성한 API를 호출합니다.
2. 해당 API 호출로 Slack 채널로 메시지가 전송됨을 확인하였습니다
오늘도 감사합니다. 😀
반응형