글 작성자: 개발섭

Legacy Integration....

Slack 웹훅을 발송하면 구) 버젼을 이용하다보면 문제가 발생할 수 있는데, 해당하는 문제는 다음과 같다.
→ 웹훅 만든사람이 나가면 그 웹훅이 비활성화된다는 것!

그리고 Incoming webhook 들어가면 경고 문구가 계속 뜨기 때문에 개발자인 이상 눈길이 갈 수 밖에 없다.

아 ㅋㅋ 쓰지말라고 ㅋㅋ (이러면 개발자인 나는 다른걸 찾을 수 밖에 없어)

그러면 App Directory로 이전하기 위해서는 어떤 기능을 활용해야하고, 어떻게 하면 퀄 좋은 메세지 발송해야할 수 있는지 확인해봅시다.

물론 Webhook도 쓸수 있다.

웹훅도 당연히 쓸 수 있다. 문제는 Webhook은 SaaS 서비스에서 양식을 제공하면 사실 필요없지만, 양식을 만들려면, Blockit을 활용해서 해당하는 양식을 만들 수 있는데, 단점이 하나 있다.
웹훅의 메세지의 타이틀명이 App의 이름을 그대로 따라간다는 점이다.


뭐 나쁘진 않다. 문제는 이러면 좀 짜쳐지는게 뭐냐면.. 뭔가 명칭을 위해서 Webhook용 App을 한 몇개씩 만들어야한다는 점이다. 내부용 앱을 몇개씩 쓰는건 사실 좀 별로다.
그럼 이러한 문제를 해결할 방법은 뭘까?

전용 Web API를 쓰자

Slack Web Api중 메세지를 발송하는 API가 존재한다. 해당하는 API는 chat.postMessage라는 API로, 해당하는 API는 해당 App에서 메세지를 발송하는데 도움을 준다.


문제는 해당하는 기능을 활용하기 위해서는 OAuth & Permissions의 Scope 기능을 활용해야한다.


해당하는 기능에 맞는 API Scope를 등록하여, 해당 기능이 동작하는지 확인하면되는데, 해당 Scope를 등록하고 난뒤에는 사실 첫동작이 재대로 동작하지 않을수 있다. 이전 등록했던(첫 등록이면 상관 없겠지만) Scope의 상태가 그대로 유지되고 있고, 해당 앱이 설치되어 내 사용하고있는 Workspace에서 지속적으로 사용되니, ReInstall을 해줘야한다.

해당하는 API를 사용하게되면 기본 옵션으로는 이렇게 등록되어있지만 이름, 프로필 이미지를 바꿔치기 하고 싶다면?
API의 옵션 값 중 → 'username'icon_url을 변경을 통해서 해당하는 Message 수정 및 변경이 가능합니다. 참고로 Scope중 chat:write.customize를 사용해야, 메세지가 바뀝니다.

P.S 메세지를 좋은 퀄리티로 만들기 위한 전략들

일단 기본적으로 App Directory를 사용한다면, 구체적으로 메세지를 만드는 방법을 공유하고 있습니다.
https://app.slack.com/block-kit-builder
에 들어가면 해당하는 메세지를 직접 작성할 수 있으며, 해당하는 형태를 바탕으로 Java Bolt를 바탕으로 객체를 만들어 내는 방식으로 구현하게 되면 상당히 편해집니다.

import static com.slack.api.model.block.Blocks.*;
import static com.slack.api.model.block.composition.BlockCompositions.*;
import static com.slack.api.model.block.element.BlockElements.*;

Slack slack = Slack.getInstance();
String token = System.getenv("SLACK_TOKEN");

ChatPostMessageResponse response = slack.methods(token).chatPostMessage(req -> req
  .channel("C1234567")
  .blocks(asBlocks(
    section(section -> section.text(markdownText("*Please select a restaurant:*"))),
    divider(),
    actions(actions -> actions
      .elements(asElements(
        button(b -> b.text(plainText(pt -> pt.emoji(true).text("Farmhouse"))).value("v1")),
        button(b -> b.text(plainText(pt -> pt.emoji(true).text("Kin Khao"))).value("v2"))
      ))
    )
  ))
);

Section에서 해당하는 메세지 형태를 계속 바꿔가는 방식으로 구현하면 해당하는 메세지를 구축하는데 큰 도움이 됩니다.