Laravel notification channel for Aligo
์ด ํจํค์ง๋ Aligo ๋ฌธ์๋ฐ์ก API ๋ฅผ ์ด์ฉํ์ฌ SMS/LMS
๋ฐ ์นด์นด์ค์๋ฆผํก
๋ฌธ์ ๋ฉ์์ง๋ฅผ ๋ฐ์กํ๊ธฐ ์ํ PHP Laravel ํจํค์ง์ด๋ค. v2 ์์๋ Laravel ์ปค์คํ
Notification ๋๋ฆฌ๋ฒ๋ฆฌ ์ฑ๋๋ก ๋ณ๊ฒฝํ๊ธฐ ๋๋ฌธ์, Notification ํด๋์ค์ via ๋ฉ์๋๋ฅผ ์ด์ฉํด ๋ฌธ์๋ฐ์ก์ด ๊ฐ๋ฅํด์ก๋ค.
Among a handful of Text messaging API providers in Korea as of April, 2020 Aligo is the hands down winner in terms of price. (KRW 8.4 / message) Since the price was the only factor that matters when I choose the company it's subject to change anytime. (meaning that I have no business relationship with it whatsoever.)
๋ฌธ์๋ฅผ ๋ฐ์กํ๊ฑฐ๋ ์นด์นด์ค์๋ฆผํก์ ๋ฐ์กํ๋ API ์ ๊ณต ์ ์ฒด๋ 2020๋ ๊ธฐ์ค ์ด๋ฆผ์ก์ 10์ฌ๊ตฐ๋ฐ๊ฐ ๋๋ ๊ฒ ๊ฐ์ง๋ง, ๊ฐ๊ฒฉ์ ๋น๊ตํด๋ณธ ๊ฒฐ๊ณผ ์๋ฆฌ๊ณ (Aligo) ๋ผ๋ ์ ์ฒด์ ๋น์ฉ์ด ๊ฐ์ฅ ๋ฎ์ ๊ฒ์ผ๋ก ํ์ ๋์ด, ์ด ์ ์ฒด์ ๋ฌธ์๋ฐ์ก ์๋น์ค๋ฅผ ์ด์ฉํ๊ธฐ ์ํ ํจํค์ง๋ฅผ ๋ง๋ค์๋ค. ์ข ๋ ์ ๋ ดํ ์๋น์ค ์ ์ฒด๊ฐ ์๊ฑฐ๋ ์ด ํจํค์ง ์ฌ์ฉ์ ๋ฌธ์ ๊ฐ ๋ฐ๊ฒฌ๋๋ค๋ฉด, ์ด์ ํธ๋์ปค๋ฅผ ์ด์ฉํด ๊ธ์ ๋จ๊ฒจ์ฃผ๋ฉด ๊ฐ์ฌํ๊ฒ ๋ค.
Warning
์๋ฆฌ๊ณ ์๋น์ค๋ ๊ณ ์ IPv4 ์ฃผ์๋ฅผ ๋ฏธ๋ฆฌ ๋ฑ๋กํ ๋ค ํด๋น ์๋ฒ ์ธ์คํด์ค์์๋ง ๋ฌธ์๋ฐ์ก์ด ๊ฐ๋ฅํ ์ ์ฝ์ฌํญ์ด ์๋ค. IP ์ฃผ์๊ฐ ๋์ ์ผ๋ก ๋ณ๊ฒฝ๋๊ฑฐ๋ Horizontal Scaling ์ด ๋๋ ํด๋ผ์ฐ๋ ์๋ฒํ๊ฒฝ์์๋ ์์ฒ์ ์ผ๋ก ์ฌ์ฉ์ด ๋ถ๊ฐํ๋ค. ๋์์ผ๋ก
NCloud ๋ AWS SNS ๋ฑ์ ์๋น์ค๋ฅผ ๊ณ ๋ คํ๊ธฐ ๋ฐ๋๋ค.
Contents
- Laravel notification channel for Aligo
Use-case
์ด ํจํค์ง๋ 1๋ช
์ ์์ ์์๊ฒ SMS/LMS
๋ฐ ์นด์นด์ค์๋ฆผํก
๋ฌธ์๋ฅผ ๋ฐ์กํ๊ธฐ ์ํ use-case ์์ ์ฌ์ฉํ๊ธฐ ์ํด ๋ง๋ค์๊ธฐ ๋๋ฌธ์, MMS
๋ฐ์ก๊ธฐ๋ฅ, ์์ฝ๋ฐ์ก, ๋ค์์ ์์ ์์๊ฒ ๋ฌธ์๋ฐ์ก ๋ฑ์ ๊ธฐ๋ฅ๋ค์ ํ์ฌ ๊ตฌํ๋์ด ์์ง ์๋ค.
Install
composer require jinseokoh/aligo
Setting Up
config/services.php
์ ์๋ ์ฝ๋๋ฅผ ์ถ๊ฐํ ๋ค์
'aligo' => [
'app_id' => env('ALIGO_APP_ID'),
'app_key' => env('ALIGO_APP_KEY'),
'sms_from' => env('ALIGO_REGISTERED_PHONE'),
'kakao_key' => env('ALIGO_KAKAO_CHANNEL_KEY'),
],
.env
์ ์์ ์ ๊ณ์ ์ ๋ณด๋ฅผ ์ถ๊ฐํ๋ค.
ALIGO_APP_ID=socrates
ALIGO_APP_KEY=00000000000000000000000000000000
ALIGO_REGISTERED_PHONE=02-123-0000
ALIGO_KAKAO_CHANNEL_KEY=0000000000000000000000000000000000000000
๋ณด๋ค ์์ธํ ์ ๋ณด๋ https://smartsms.aligo.in/admin/api/info.html ์์ ์ฐพ์ ๋ณผ ์ ์๋ค.
SMS/LMS ๋ฌธ์ ๋ณด๋ด๊ธฐ ์ฌ์ฉ๋ฒ
AligoTextChannel
์ ์ฌ์ฉํ๋ ค๋ฉด, Notification ํด๋์ค์ ์๋์ ์ฝ๋๋ฅผ ์ถ๊ฐํ๋ค. AligoTextMessage
๋ฅผ ๋ง๋ค๋ content() ์ ์ง์ ํ ๋ฌธ์์ด ๊ธธ์ด์ ๋ฐ๋ผ SMS ์ค์ ๋๋ LMS ์ค์ ์ด ์๋์ผ๋ก ๋๋ค. ๋ง์ผ ์ง์ ํ ๋ฌธ์์ด์ ์ ํํ ๊ธธ์ด์ ์๊ด์์ด 90 ๋ฐ์ดํธ ์ด์๋๋ ๋ถ๋ถ์ด ์งค๋ ค๋๊ฐ๋๋ผ๋ ์ ๋ ดํ ๋น์ฉ์ SMS ๋ฌธ์๋ก ๋ณด๋ด๊ฒ ๋ค๋ฉด, short() ๋ฉ์๋๋ฅผ ์๋์ ์์์ฒ๋ผ chaining ํ๋ค:
public function via($notifiable)
{
return [AligoTextChannel::class];
}
public function toAligoText($notifiable)
{
return (new AligoTextMessage())
->content('์ด ํจ๊ฐ ๋จํ์ด ์๋๋ผ๋ ๊ฑฐ์ ๋ด ๋ ๋ชจ๋ํ๊ณ ๋ด ์๋ชจ๊ฐ์ง ๊ฑด๋ค. ์ซ๋ฆฌ๋ฉด ๋์ง์๋์ง.')
->short()
->debug();
}
AligoTextMessage
๋ chaining ์ด ๊ฐ๋ฅํ ์๋์ ๋ฉ์๋๋ค์ ๊ฐ๋๋ค.
SMS/LMS ๋ฌธ์ ์ค์ ์ ์ฌ์ฉ๊ฐ๋ฅํ ๋ฉ์๋๋ค (๋ชจ๋ fluent call chain ์ด ๊ฐ๋ฅ)
content($string)
. ๋ณด๋ผ ๋ฉ์์ง๋ฅผ ์ง์ ํ๋ค.
short()
. ๋ฉ์์ง ๊ธธ์ด๊ฐ 90 ๋ฐ์ดํธ ์ด์๋๋ ๊ฒฝ์ฐ, SMS ์ผ๋ก ๋ณด๋ด๊ธฐ ์ํด์ 90 ๋ฐ์ดํธ ์ด์๋๋ ๋ถ๋ถ์ ์งค๋ผ๋ฒ๋ฆฐ๋ค.
debug()
. ํ
์คํธ ๋ชจ๋๋ก ์ค์ ํ๋ค.
์นด์นด์ค์๋ฆผํก ๋ณด๋ด๊ธฐ ์ฌ์ฉ๋ฒ
์นด์นด์ค์๋ฆผํก์ SMS/LMS ๋ณด๋ค ์ ๋ ดํ๊ฒ ์นด์นด์คํก์ผ๋ก ๋ฌธ์๋ฅผ ๋ณด๋ด๋ ์๋น์ค์ด๋ฉฐ, ๋ณด๋ค ์์ธํ ์ ๋ณด๋ https://smartsms.aligo.in/admin/api/info.html ์์ ์ฐพ์๋ณผ ์ ์๋ค.
AligoKakaoChannel
์ ์ฌ์ฉํ๋ ค๋ฉด, Notification ํด๋์ค์ ์๋์ ์ฝ๋๋ฅผ ์ถ๊ฐํ๋ค:
public function via($notifiable)
{
return [AligoKakaoChannel::class];
}
public function toAligoKakao($notifiable)
{
return (new AligoKakaoMessage())
->code('TB_0824')
->replacements(['์ค์ง์', '๋ํํต์ด', '์ค์ 11์', '123-456-7890'])
->debug();
}
AligoKakaoMessage
๋ chaining ์ด ๊ฐ๋ฅํ ์๋์ ๋ฉ์๋๋ค์ ๊ฐ๋๋ค.
์นด์นด์ค์๋ฆผํก ๋ฌธ์ ์ค์ ์ ์ฌ์ฉ๊ฐ๋ฅํ ๋ฉ์๋๋ค (๋ชจ๋ fluent call chain ์ด ๊ฐ๋ฅ)
code($string)
. ์๋ฆฌ๊ณ ์ ๋ฑ๋ก๋์ด ์๋ ์นด์นด์ค์๋ฆผํก ํ
ํ๋ฆฟ ์ฝ๋๋ฅผ ์ง์ ํ๋ค.
replacements()
. ์นด์นด์ค์๋ฆผํก ๋ฉ์์ง์ #{์ด๋ฆ}
๋ถ๋ถ๊ณผ ๋์ฒด์ํฌ ๊ฐ์ผ๋ก ๊ตฌ์ฑ๋ ๋ฐฐ์ด์ ์ง์ ํ๋ค.
fallback()
. ์นด์นด์ค์๋ฆผํก ๋ฐ์ก์ด ์คํจํ ๊ฒฝ์ฐ, ๋ฌธ์๋ก ์ ํํ์ฌ ์ ์กํ๋ค.
debug()
. ํ
์คํธ ๋ชจ๋๋ก ์ค์ ํ๋ค.
์นด์นด์ค์๋ฆผํก ํ ํ๋ฆฟ
์นด์นด์ค์๋ฆผํก ๋ฌธ์๋ฉ์์ง๋ ํ ํ๋ฆฟ ํํ๋ก ๋ฏธ๋ฆฌ ๋ฑ๋กํ๋ ๊ณผ์ ์ด ํ์ํ๋ฉฐ ์คํธ๋ฐฉ์ง๋ฅผ ์ํ ์ฌ์ ์น์ธ๋ ํ์ํ๋ค. ํ ํ๋ฆฟ์ ๋ฑ๋กํ ์นด์นด์ค์๋ฆผํก ๋ฉ์์ง๊ฐ ์๋์ ๊ฐ๋ค๋ฉด,
#{๊ณ ๊ฐ๋ช
} ๊ณ ๊ฐ๋! #{ํ๋ฐฐํ์ฌ๋ช
}์
๋๋ค. #{ํ๋ฐฐ๋ฐฐ์ก์๊ฐ} ํ๋ฐฐ๋ฅผ ๋ฐฐ๋ฌํ ์์ ์
๋๋ค. ์ด์ก์ฅ๋ฒํธ : #{์ก์ฅ๋ฒํธ}
์ด ์์ ๋ฉ์์ง์ ๊ฒฝ์ฐ, #{์ด๋ฆ}
ํํ์ ์ฌ๋กฏ์ด ๋ชจ๋ 4๊ฐ๊ฐ ์๊ธฐ ๋๋ฌธ์, ์ฒด์ด๋ ๋ฉ์๋ replacements()
์ ์ธ์๊ฐ์ผ๋ก
['์ค์ง์', '๋ํํต์ด', '์ค์ 11์', '123-456-7890']
์ ๊ฐ์ด 4๊ฐ์ String ์ผ๋ก ์ด๋ค์ง ๋ฐฐ์ด์ด ํ์ํ๋ค. ๋ชจ๋ ์ฌ๋กฏ์ ์์ฐจ์ ์ผ๋ก ๋์ฒด๊ฐ ์ด๋ค์ง๋ฉฐ,
์ต์ข
์ ์ผ๋ก๋ ์๋์ ๊ฐ์ ์นด์นด์ค์๋ฆผํก ๋ฌธ์๊ฐ ๋ฐ์ก๋๋ค.
์ค์ง์ ๊ณ ๊ฐ๋! ๋ํํต์ด์
๋๋ค. ์ค์ 11์ ํ๋ฐฐ๋ฅผ ๋ฐฐ๋ฌํ ์์ ์
๋๋ค. ์ด์ก์ฅ๋ฒํธ : 123-456-7890
๋ง์ผ, ์ฌ๋กฏ์ ๊ฐฏ์์ replacements()
์ธ์๋ก ์ ๋ฌ๋ ๋ฐฐ์ด์ ๊ฐฏ์๊ฐ ๋ค๋ฅธ ๊ฒฝ์ฐ, Exception ์ด ๋ฐ์ํ๋ฉฐ, ๋ฌธ์๊ฐ ๋ฐ์ก๋์ง ์๋๋ค.
Contributing
Please see CONTRIBUTING for details.
Credits
License
The MIT License (MIT). Please see License File for more information.