TIL no.74 - Django - SMS 보내기

박준규·2019년 11월 6일
5

Django

목록 보기
28/30

Naver Cloud Platform의 SENS 서비스를 이용해서 SMS를 보내려고 합니다.

일단,
Naver Cloud Platform
회원가입, 로그인 후 콘솔에서 프로젝트를 생성하고
설명서를 참고해서 발신번호 등록과 API 인증키를 생성하는 등의 과정을 진행해야 합니다.


저의 경우, 다음과 같이 회원가입 페이지에서 인증번호를 보내주는 기능을 구현했습니다.

스크린샷, 2019-11-06 20-35-44.png

1. Model

class AuthSms(models.Model):
    phone_number = models.CharField(max_length=11, primary_key=True)
    auth_number  = models.IntegerField()
    class Meta:
        db_table = 'auth_numbers'

휴대폰 번호와 인증번호를 저장하는 일반적인 테이블입니다.

2. View

class AuthSmsSendView(View):
    #실제 문자를 보내주는 메서드
    def send_sms(self, phone_number, auth_number):
        headers = {
            'Content-Type': 'application/json; charset=utf-8',
            'x-ncp-auth-key': f'{SMS_ACCESS_KEY_ID}',
            'x-ncp-service-secret':f'{SMS_SERVICE_SECRET}',
        }

        data = {
            'type':'SMS',
            'contentType':'COMM',
            'countryCode':'82',
            'from':f'{SMS_SEND_PHONE_NUMBER}',
            'to':[
                f'{phone_number}',
            ],
            'content':f'인증번호 [{auth_number}]'
        }
        
        requests.post(SMS_URL, headers=headers, json=data)

    def post(self, request):
        try:
            input_data          = json.loads(request.body)
            input_phone_number  = input_data['phone_number']
            created_auth_number = randint(1000, 10000)
            exist_phone_number             = AuthSms.objects.get(phone_number=input_phone_number)
            exist_phone_number.auth_number = created_auth_number
            exist_phone_number.save()
            
            self.send_sms(phone_number = input_phone_number, auth_number = created_auth_number)
            return JsonResponse({'message':'SUCCESS'}, status=200)

        except AuthSms.DoesNotExist:
            AuthSms.objects.create(
                            phone_number = input_phone_number,
                            auth_number  = created_auth_number
                            ).save()
            
            self.send_sms(phone_number = input_phone_number, auth_number = created_auth_number)
            return JsonResponse({'message':'SUCCESS'}, status=200)

send_sms() 메서드는
네이버 클라우드 플랫폼의 설명서에 따라
request의 header, body 들을 위와 같이 넣어주고
API의 URL로 request를 보냅니다.

SMS_ACCESS_KEY_ID는 계정관리 > 마이페이지 > 인증키 관리에서 생성해주면 됩니다.
SMS_SERVICE_SECRET는 프로젝트의 시크릿 키입니다.
SMS_SEND_PHONE_NUMBER는 프로젝트에서 설정한 발신번호입니다.
SMS_URL은 API의 URL입니다.

그리고 post메서드를 사용해서
DB에 있는 phone_number라면(인증번호를 받은 여력이 있는 경우)
난수를 새로 생성해서 DB의 auth_number를 update해준 뒤,
update해준 난수를 sms로 보내주었습니다.

또한, DB에 없는 phone_number라면(인증번호를 처음 받은 경우)
새로운 record를 생성해서(DB에 정보를 저장)
sms를 보내주었습니다.


validation check와 DB 호출 최소화를 고려하지 않은 비효율적인 코드입니다.

profile
devzunky@gmail.com

1개의 댓글

comment-user-thumbnail
2020년 2월 6일

많은 도움 되었습니다! 감사합니다. 북마크해놓고 앞으로도 종종 들리겠습니다 ㅎㅎㅎ

답글 달기