문자 메세지를 보내는 다양한 플랫폼이 있다. 나는 그 중 twilio로 sms보내기를 구현했다.
참고로 나는 구글 로그인으로 했을 때 잘 안되서 일반 계정으로 생성했다. 아래에 겪은 버그들을 적어두겠다.
sign up을 누른 후 로그인 방법을 선택하면 된다.
일반 계정 생성은 아래 폼을 작성하면 된다.

나는 구글로 계정 생성과 일반 계정 생성을 둘 다 해봤다. 왜 그런진 모르겠지만 구글 로그인에서 버그가 있었다. 나의 경우에 다음과 같은 에러가 있었다.
첫 화면에서 get phone number(?)을 눌렀던가 하면 번호를 준다. 그럼 아래에 다음과 같은 정보들이 나타난다.

일반 로그인이 구글 로그인보다 탭에 더 많은게 있다. Verify나 Flex같은 것들은 구글 로그인에 없었다.
옆에 탭에서 #Develop -> Phone Numbers -> Manage -> Verfied Caller Ids에서 번호가 잘 등록되어 있는지 확인한다. 여기서 번호가 없다면 등록해준다. 무료버전에서는 여기에 등록된 사람들에게만 보내지는 것으로 알고있다.
메세지 보내는 테스트는 #Develop -> Messaging -> Send an SMS 에서 테스트할 수 있다.

옆에 request정보와 응답 정보를 볼 수 있다. 이것을 보고 직접 코드를 작성해도 되고 twilio 패키지를 사용해도 된다.
nest g mo twilio # 모듈 생성
nest g s twilio # 서비스 생성
nest g co twilio # 컨트롤러 생성 / 테스트 용도
각자 자신이 발급받은 accountsid, authtoken, phonenumber넣어주기.
TWILIO_ACCOUNT_SID=""
TWILIO_AUTH_TOKEN=""
TWILIO_PHONE_NUMBER=""
import { Module } from '@nestjs/common';
import { TwilioService } from './twilio.service';
import { ConfigService } from '@nestjs/config';
import * as Twilio from 'twilio';
import { TwilioController } from './twilio.controller';
@Module({
controllers: [TwilioController],
providers: [
TwilioService,
{
provide: 'TWILIO_CLIENT',
useFactory: (configService: ConfigService) => {
const accountSid = configService.get<string>('TWILIO_ACCOUNT_SID');
const authToken = configService.get<string>('TWILIO_AUTH_TOKEN');
return Twilio(accountSid, authToken);
},
inject: [ConfigService],
},
{
provide: 'TWILIO_PHONE_NUMBER',
useFactory: (configService: ConfigService) => {
return configService.get<string>('TWILIO_PHONE_NUMBER');
},
inject: [ConfigService],
},
],
exports: [TwilioService],
})
export class TwilioModule {}
import {
Inject,
Injectable,
InternalServerErrorException,
} from '@nestjs/common';
@Injectable()
export class TwilioService {
constructor(
@Inject('TWILIO_PHONE_NUMBER') private readonly twilioPhoneNumber: string,
@Inject('TWILIO_CLIENT') private readonly twilio,
@Inject('TWILIO_SERVICE_ID') private readonly twilioServiceId: string,
) {}
async sendMessage({ to, body }: { to: string; body: string }) {
try {
return this.twilio.messages.create({
to: to,
from: this.twilioPhoneNumber,
body,
});
} catch (e) {
throw new InternalServerErrorException('메세지 보내는데 실패했습니다.');
}
}
}
import { Body, Controller, Get } from '@nestjs/common';
import { TwilioService } from './twilio.service';
@Controller('twilio')
export class TwilioController {
constructor(private readonly twilioService: TwilioService) {}
@Get('test')
async sendMessage(@Body('to') to: string, @Body('body') body: string) {
const data = await this.twilioService.sendMessage({
to,
body,
});
return data;
}
}
이렇게 작성하고 테스트를 하면 문자가 잘 오는 것을 확인할 수 있다.
처음에 구글 로그인으로 시작했다. 다른 블로그 글과 내 UI가 살짝 달랐다. 다른 사람들은 5단계로 되어 있었고, 나는 4단계로 되어 있었다. 나는 당연히 업데이트 했나보다라고 생각했다. (나중에 보니까 구글 로그인이랑 일반 로그인이랑 조금 다르더라.)
에러 1 (제 정보는 가렸습니다.)
The number +8210????XXXX is unverified. Trial accounts cannot send messages to unverified numbers; verify +8210????XXXX at twilio.com/user/account/phone-numbers/verified, or purchase a Twilio number to send messages to unverified numbers
분명 내 번호는 등록되어 있었다. 해결하기 위해 내 번호 삭제 후 다시 등록하려 했다. verified Caller IDs -> Add a new Caller ID를 통해서 번호를 등록하려고 했지만 문자가 안왔다.
Service를 등록하래서 등록도 해봤지만 여전히 에러났다.
그래서 계정을 업그레이드하면 된다길래 시도했다. 결제가 실패하더니 메일이 한통 왔다.
대충 내용은
1. 이 서비스를 사용하려는 구체적인 사례 설명
2. 비지니스 목적으로 twilio를 사용하려는 이유
3. twilio에서 생성한 기타 계정이나 프로젝트
단지 공부 목적이라라고 답장하니 또 무슨 별 이상한걸 물어본다 귀찮게;;
물어보는거 계속 답장해주니까 결국 계정을 풀어줄 수 없다고 해서 새롭게 계정을 만들었다.
일반 계정으로 생성하니 모든게 너무 잘 되어서 열받았다.
구글 로그인으로 잘 사용하시는 분들이 계시다면 댓글로 사용법 알려주세요
안녕하세요! 저도 같은 문제를 겪고 있는데 일반 계정으로 다시 하셨다함은 free trial이 아닌 upgrade를 하셨다는 말씀이실까요?ㅠ