[nestjs] slack 알림 웹훅 사용하기(slack에 자동 메시지를 보내자)

여리·2024년 10월 22일
0

- 계기: 사이드 프로젝트에서 새로운 api기능을 만들었는데 해당 api가 작동됨에 따라서 트래킹하기 위함에 따라 알리는 기능을 활용하고 싶었다.

그러면서 제목처럼 웹훅기능이 필요했고 slack으로 커뮤니케이션을 했었기 때문에 적절하게 활용할 수 있을것이라고 생각하고 접근했다.

여기서 웹훅에 대한 간단한 개념부터 알자면,

웹훅(webhook)이란?
서버에서 어떠한 작업이 수행 되었을 때 해당 작업이 수행되었음을 알리는 것을 의미한다.
웹훅을 통해서 발생하는 이벤트(ex. api)를 특정 url로 알 수 있다.

나는 nestjs를 사용해서 프로젝트를 하고있었기 때문에 npm으로 slack의 웹훅을 사용할 수 있는 서드파티모듈을 사용했다.

nestjs-slack npm링크

터미널을 통해서 npm install nestjs-slack 명령어를 입력하면 package.json에 설치가 된것을 확인할 수 있다.

npmjs 페이지에서 nestjs-slack 사용법에 대해서 간략하게 나와있는데 예시로

import { Module } from '@nestjs/common';
import { SlackModule } from 'nestjs-slack';

@Module({
  imports: [
    // slack의 api 기능 활용법
    SlackModule.forRoot({
      type: 'api',
      token: '<insert-token-here>',
    }),
    // slack의 webhook 기능 활용법
    SlackModule.forRoot({
      type: 'webhook',
      url: '<the webhook url>',
	}),
  ],
})
export class AppModule {}

하나의 모듈에 두개의 방법을 나열해 보았다. 해당 npmjs의 정보를 보면 동시다발적으로 웹훅을 설정할 수 있는 방법 등 설명이 잘 되어졌다.

나는 특정 api에서 해당 웹훅을 활용하게 하기 위해서 웹훅의 기능을 api로 만들지 않고 하나의 메소드로 만들어 해당 정보들을 파라미터로 받아서 메시지에 반영할 수 있도록 했다.

//app.module.ts
    SlackModule.forRoot({
      type: 'webhook',
      url: 'https://hooks.slack.com/services/T0...9XMK/B07S.....',
      isGlobal:true,
      defaultChannel: '#signupcheck'
    }),

slack 모듈에서 옵션 설정에 isGlobal 옵션은 모듈에 대한 전역적 활용에 대한 옵션인데 다른곳에서 의존성을 받아 해당 모듈을 활용할 것이기 때문에 true로 설정하여 사용했다.
나는 이 내용을 모르고 계속 node application을 시작할때 자꾸 module의존성에 대한 에러가 발생해서 쓸데 없는 시간을 낭비했다. 다른사람들은 이 내용을 보면 시간낭비를 하는 일이 없길...

그리고 사용하고자 하는 웹훅의 기능을 메소드화 시켰다

  /* 회원가입 트래킹 슬랙 웹훅 메소드 */
  async signupSlackWebHook(id: number, email: string, phone_number: string) {
    const progressEmail = email?.split("@")[0] || '이메일 정보 없음'; // 예시: super-power@naver.com인 경우 super-power만 추출
    const progressPhoneNumber = phone_number?.slice(-4) || '핸드폰번호 정보 없음'; // 예시: 010-1234-5678인 경우 5678만 추출
    try {
      await this.slackService.sendText(
        `📣가입자 생성알림.
          - id: ${id},
          - email: ${progressEmail}@...,
          - cell: 010-****-${progressPhoneNumber}
        `
      );
    } catch(err) {
      console.error('슬랙 웹훅 에러 메시지 정보: ',err.message)
    }
  }
}

위와같은 코드블럭으로 개인정보 이슈에 대한 영역은 최대한 줄일 수 있도록 노력했고 해당 메소드를 회원가입 로직에서 성공했을때 await signupSlackWebhook(param.id, param.email, param.phone_number)를 호출하여 해당 정보를 슬랙의 웹훅 메시지로 활용할 수 있게 됐다.

이렇게 슬랙 웹훅 메시지를 받을 수 있게 됐다.
외부 서드파티모듈(npm 패키지)을 통해서 굳이 먼저 확인하려고하지 않아도 자동으로 알 수 있게 하는 기능은 참 좋다.


추가내용 -> 이유 웹훅을 멀티로 사용해야 하는 경우가 발생해서 추가적으로 메모

추가적으로 두개의 슬랙 채널에 웹훅을 추가하려고 했다.
이때는 Module이나 service부분의 코드를 아래와 같이 사용하면 된다.

//module
SlackModule.forRoot({
      isGlobal: true,
      type: "webhook",
      channels: [
        {
          name: "사용하려는 채널 이름 정의",
          url: "url주소1",
        },
        {
          //부산면세점 연동 구매 알림
          name: "사용하려는 다른 채널 이름 정의",
          url: "url주소2",
        },
      ],
    }),
//service
      await this.slackService.sendText(
        `
			보내고자하는 메시지
        `,
        { channel: "사용하려는 다른 채널 이름 정의" } // -> module에서 설정한 채널 name
      );
profile
beckend developer

0개의 댓글