들어가며..
특정 토큰을 받아 메세지 보내기 기능을 구현할 수도 있지만 나는 특별히 토큰을 이용하여 구현할 필요가 없었기 때문에 채널의 url을 발급받아 진행하는 방법을 사용했다.
준비사항
Slack에 자동으로 메세지를 보내기 위해서는 다음의 두 가지 준비물이 필요하다.
1. webhook을 이용하기 위해 url 발급받기
2. npm install nestjs-slack
1번 준비물은 아래 블로그의 3)번 글을 참고하면 쉽게 발급받을 수 있다.
https://labs.brandi.co.kr/2019/01/30/kwakjs.html
이 블로그를 참고하다 webhook을 어디서 찾는지 모르겠다면 아래의 사진을 참고하자.
어플리케이션, 앱 과 같은 목록을 찾지 못한다면 위와 같이 찾으면 된다.
코드
위와 같이 준비했다면 아래의 코드와 같이 설정하자.
import { Module } from '@nestjs/common';
import { TypeOrmModule } from '@nestjs/typeorm';
import { CardsController } from './cards.controller';
import { CardsService } from './cards.service';
import { Cards } from './entities/cards.entity';
import { User } from '../user/entities/user.entity';
import { Comments } from '../comments/entities/comments.entity';
import { UserModule } from '../user/user.module';
import { Columns } from '../columns/entities/columns.entity';
import { SlackModule } from 'nestjs-slack';
import { ConfigService } from '@nestjs/config';
@Module({
imports: [
TypeOrmModule.forFeature([Cards, Comments, User, Columns]),
SlackModule.forRootAsync({
useFactory: (configService: ConfigService) => {
return {
type: 'webhook',
url: configService.get<string>('WEB_HOOK_URL'),
};
},
inject: [ConfigService],
}),
UserModule,
],
controllers: [CardsController],
providers: [CardsService],
})
export class CardsModule {}
나의 경우에는 CardModule에 SlackModule을 임포트해줬다. 카드가 변경될 때마다 변경한 사람과 변경한 카드 이름을 슬랙 메세지로 보내고 싶었기 때문이다. 추가적으로 참고한 블로그와는 다르게 inject 옵션을 넣어 ConfigService를 inject해줬다. 물론 SlackModule을 가져오면서 ConfigService를 사용하기 때문에 ConfigService도 import해줬다.
이 때 주의할 점은 url: configService.get<string>('WEB_HOOK_URL') 이 부분인데 타입이 맞지 않는다고 엄청 에러가 떴었다. 이건 그대로 넣되 WEB_HOOK_URL을 env 파일에 넣고 준비물 1번을 WEB_HOOK_URL에 할당해주어야 한다.
이제, SlackService를 만들어서 사용하면 된다. 나는 함수로 만들어서 함수를 불러와서 사용하기만 하면 되게 만들었다.
async sendMessageToSlack(user_id, cardId) {
try {
const user = await this.userRepository.findOne({
where: { id: user_id },
});
const userName = user.name;
const card = await this.cardsRepository.findOne({
where: { id: cardId },
});
const cardName = card.name;
this.slackService.sendText(
`${userName}님이 "${cardName}"카드를 변경했습니다.`,
);
} catch (error) {
console.error(error);
}
}
이 코드를 이용해서 카드의 변경이 있을 때마다 변경한 사람과, 변경한 카드가 슬랙 메세지로 보내지도록 만들었다.