Java Slack 알림 구현 (Slack Client Api)

종현·2023년 12월 13일
1

Slack

  • Spring Batch에서 오류가 났을 때, 알림이 오도록 설정을 하려고 한다.
  • 여기에서는 Slack Incoming WebHook 기능을 사용하였다.

Slack WebHook App 설정

  • 채널 > View channel details

  • Integrations > Apps > Add an App

  • webook 검색 > Incoming WebHooks 설치

  • 채널 및 기타정보 세팅 후, Webhook URL 가져오기

Java에서 Slack 알림 구현

  • 의존성 추가
  • maven
<dependency>
	<groupId>com.slack.api</groupId>
	<artifactId>slack-api-client</artifactId>
	<version>1.30.0</version>
</dependency>
  • gradle
implementation group: 'com.slack.api', name: 'slack-api-client', version: '1.30.0'
  • slack Url
slack:
  url: https://hooks.slack.com/services/토큰/정보/들
  • 구현
  • Slack Send Utils
@Slf4j
public class SlackUtils {
    private final String SLACK_URL;
    private final Slack slackClient = Slack.getInstance();

    public SlackUtils(String slackUrl) {
        this.SLACK_URL = slackUrl;
    }

    /**
     * Slack 알림 전송
     * @param title
     * @param data
     * @param color
     */
    public void sendMessage(String title, HashMap<String, String> data, SlackColor color) {
        log.info("Slack Send Message!");
        try {
            slackClient.send(SLACK_URL, payload(p -> p
                    .text(title)
                    .attachments(List.of(
                            Attachment.builder()
                                    .color(color.getColorCode())
                                    .fields(data.keySet().stream().map(key -> generateSlackField(key, data.get(key))).collect(Collectors.toList()))
                                    .build()
                    ))
            ));
        } catch (IOException e) {
            log.error("Slack Send Message Failed", e);
        }
    }

    /**
     * Slack Field 생성
     * @param title
     * @param value
     * @return
     */
    private Field generateSlackField(String title, String value) {
        return Field.builder()
                .title(title)
                .value(value)
                .valueShortEnough(false)
                .build();
    }
}
  • Color Enum
@Getter
public enum SlackColor {
    RED("#ff0000"),
    GREEN("#008000");

    private final String colorCode;

    SlackColor(String colorCode) {
        this.colorCode = colorCode;
    }
}
  • Bean 등록 : slack hook url을 가져와서 Bean 등록
@Bean
public SlackUtils slackUtils(@Value("${slack.url}") String url) {
	return new SlackUtils(url);
}
  • 테스트 실행

@Autowired
SlackUtils slackUtils;

@Test
void slack() {
	String title = "타이틀";
    HashMap<String, String> data = new HashMap<>();
	data.put("내용1", "내용1이 들어감");
	data.put("내용2", "내용2이 들어감");
    slackUtils.sendMessage(title, data, SlackColor.RED);
}

문제발생

구현중인 프로젝트에서 Spring Boot 2.5.0 버전을 사용하고 있었는데 아래와 같은 오류 발생
일반 Java 프로젝트 / curl을 통한 테스트에서는 정상 동작!

  • okhttp3 관련 부분에서 오류가 발생!
  • okhttp3RequestBody.create() 부분에서 문제가 발생.
public Response postJsonBody(String url, Object obj) throws IOException {
	RequestBody body = RequestBody.create(toSnakeCaseJsonString(obj), MEDIA_TYPE_APPLICATION_JSON);
	Request request = new Request.Builder().url(url).post(body).build();
	return okHttpClient.newCall(request).execute();
}
  • okhttp3의 버전이 3.14.9 로 되어있으나, 해당 버전에서는 동작하지 않음.

  • Spring Boot 버전에 따라서 낮은 버전(3.x.x)의 okhttp3 라이브러리가 받아졌고, 이 라이브러리의 버전(4.x.x)을 높여주니 정상 실행되었다.

결과

  • 정상출력.

이상.

0개의 댓글