그러면서 제목처럼 웹훅기능이 필요했고 slack으로 커뮤니케이션을 했었기 때문에 적절하게 활용할 수 있을것이라고 생각하고 접근했다.
여기서 웹훅에 대한 간단한 개념부터 알자면,
웹훅(webhook)이란?
서버에서 어떠한 작업이 수행 되었을 때 해당 작업이 수행되었음을 알리는 것을 의미한다.
웹훅을 통해서 발생하는 이벤트(ex. api)를 특정 url로 알 수 있다.
나는 nestjs를 사용해서 프로젝트를 하고있었기 때문에 npm으로 slack의 웹훅을 사용할 수 있는 서드파티모듈을 사용했다.
터미널을 통해서 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
);