Voximplant์™€ Dialogflow๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ๋‚˜๋งŒ์˜ Google ํ†ตํ™” ์„ ๋ณ„ ๋งŒ๋“ค๊ธฐ

Voximplant์™€ Dialogflow๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ๋‚˜๋งŒ์˜ Google ํ†ตํ™” ์„ ๋ณ„ ๋งŒ๋“ค๊ธฐ
Google์ด ๋ฏธ๊ตญ์—์„œ Pixel ํœด๋Œ€ํฐ์— ์ถœ์‹œํ•œ ํ†ตํ™” ์„ ๋ณ„ ๊ธฐ๋Šฅ์— ๋Œ€ํ•ด ๋“ฃ๊ฑฐ๋‚˜ ์ฝ์–ด๋ณด์…จ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์•„์ด๋””์–ด๋Š” ํ›Œ๋ฅญํ•ฉ๋‹ˆ๋‹ค. ์ˆ˜์‹  ์ „ํ™”๋ฅผ ๋ฐ›์œผ๋ฉด ๊ฐ€์ƒ ๋น„์„œ๊ฐ€ ํ†ต์‹ ์„ ์‹œ์ž‘ํ•˜๊ณ  ์ฑ„ํŒ… ํ˜•์‹์œผ๋กœ ์ด ๋Œ€ํ™”๋ฅผ ๋ณผ ์ˆ˜ ์žˆ์œผ๋ฉฐ ์–ธ์ œ๋“ ์ง€ ๋น„์„œ ๋Œ€์‹  ๋งํ•˜๊ธฐ๋ฅผ ์‹œ์ž‘ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์š”์ฆ˜ ๊ฑฐ์˜ ์ด๋Ÿด ๋•Œ ๋งค์šฐ ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค. ์ „ํ™”์˜ ์ ˆ๋ฐ˜์€ ์ŠคํŒธ์ž…๋‹ˆ๋‹ค, ํ•˜์ง€๋งŒ ์—ฐ๋ฝ์ฒ˜ ๋ชฉ๋ก์— ์—†๋Š” ์‚ฌ๋žŒ์˜ ์ค‘์š”ํ•œ ์ „ํ™”๋ฅผ ๋†“์น˜๊ณ  ์‹ถ์ง€๋Š” ์•Š์Šต๋‹ˆ๋‹ค. ์œ ์ผํ•œ ๋ฌธ์ œ๋Š” ์ด ๊ธฐ๋Šฅ์ด Pixel ํœด๋Œ€ํฐ์—์„œ๋งŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ ๋ฏธ๊ตญ์—์„œ๋งŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ธ€์Ž„์š”, ๊ทน๋ณตํ•ด์•ผ ํ•  ์žฅ์• ๋ฌผ์ด ์žˆ์ฃ ? ๋”ฐ๋ผ์„œ ์šฐ๋ฆฌ๋Š” Voximplant์™€ Dialogflow๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์œ ์‚ฌํ•œ ์†”๋ฃจ์…˜์„ ๋งŒ๋“œ๋Š” ๋ฐฉ๋ฒ•์„ ์•Œ๋ ค๋“œ๋ฆฌ๊ธฐ๋กœ ๊ฒฐ์ •ํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ณ ์–‘์ด ๋ฐ‘์œผ๋กœ ๋ถ€ํƒ๋“œ๋ฆฝ๋‹ˆ๋‹ค.

๊ตฌ์กฐ

Voximplant์™€ Dialogflow์˜ ์ž‘๋™ ๋ฐฉ์‹์„ ์„ค๋ช…ํ•˜๋Š” ๋ฐ ์‹œ๊ฐ„์„ ๋‚ญ๋น„ํ•˜์ง€ ๋ง๊ณ  ์›ํ•  ๊ฒฝ์šฐ ์ธํ„ฐ๋„ท์—์„œ ์‰ฝ๊ฒŒ ์ •๋ณด๋ฅผ ์ฐพ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด์ œ Call Screening์˜ ๊ฐœ๋…์— ๋Œ€ํ•ด ์•Œ์•„ ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

๋งค์ผ ์‚ฌ์šฉํ•˜๊ณ  ์ค‘์š”ํ•œ ์ „ํ™”๋ฅผ ๋ฐ›๋Š” ํŠน์ • ์ „ํ™”๋ฒˆํ˜ธ๊ฐ€ ์ด๋ฏธ ์žˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ์ด ๊ฒฝ์šฐ ์šฐํŽธ, ๋ช…ํ•จ, ์˜จ๋ผ์ธ ์–‘์‹ ์ž‘์„ฑ ๋“ฑ ๋ชจ๋“  ๊ณณ์— ํ‘œ์‹œ๋˜๋Š” ๋‘ ๋ฒˆ์งธ ๋ฒˆํ˜ธ๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ์ด ๋ฒˆํ˜ธ๋Š” ์ž์—ฐ์–ด ์ฒ˜๋ฆฌ ์‹œ์Šคํ…œ(์ด ๊ฒฝ์šฐ Dialogflow)์— ์—ฐ๊ฒฐ๋˜๋ฉฐ ๊ท€ํ•˜๊ฐ€ ์›ํ•˜๋Š” ๊ฒฝ์šฐ์—๋งŒ ๊ธฐ๋ณธ ๋ฒˆํ˜ธ๋กœ ์ „ํ™”๋ฅผ ์ „๋‹ฌํ•ฉ๋‹ˆ๋‹ค. ๋‹ค์ด์–ด๊ทธ๋žจ ํ˜•์‹์—์„œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค(๊ทธ๋ฆผ์„ ํด๋ฆญํ•  ์ˆ˜ ์žˆ์Œ).
Voximplant์™€ Dialogflow๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ๋‚˜๋งŒ์˜ Google ํ†ตํ™” ์„ ๋ณ„ ๋งŒ๋“ค๊ธฐ
์•„ํ‚คํ…์ฒ˜๋ฅผ ์ดํ•ดํ•˜๋ฉด ๊ตฌํ˜„์„ ๋งก์„ ์ˆ˜ ์žˆ์ง€๋งŒ ํ•œ ๊ฐ€์ง€ ์ฃผ์˜ํ•  ์ ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์ด๋™ํ•˜๋Š” Dialogflow์™€ ์ˆ˜์‹  ํ˜ธ์ถœ์ž ๊ฐ„์˜ ๋Œ€ํ™”๋ฅผ ํ‘œ์‹œํ•˜๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๋งŒ๋“ค๋ ค๋ฉด ๊ฐ„๋‹จํ•œ ์›น-ํ†ตํ™” ์„ ๋ณ„ ์ž‘๋™ ๋ฐฉ์‹์„ ๋ช…ํ™•ํ•˜๊ฒŒ ๋ณด์—ฌ์ฃผ๋Š” ๋Œ€ํ™” ๋ Œ๋”๋Ÿฌ๊ฐ€ ํฌํ•จ๋œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ž…๋‹ˆ๋‹ค. ์ด ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—๋Š” ๊ฐœ์ž… ๋ฒ„ํŠผ์ด ์žˆ์œผ๋ฉฐ, ์ด ๋ฒ„ํŠผ์„ ๋ˆ„๋ฅด๋ฉด Voximplant๊ฐ€ ์ˆ˜์‹  ๊ฐ€์ž…์ž๋ฅผ ์ „ํ™”๋ฅผ ๊ฑด ๊ฐ€์ž…์ž์™€ ์—ฐ๊ฒฐํ•ฉ๋‹ˆ๋‹ค(ํ›„์ž๊ฐ€ ์Šค์Šค๋กœ ๋Œ€ํ™”ํ•˜๊ธฐ๋กœ ๊ฒฐ์ •ํ•œ ๊ฒฝ์šฐ).

ะ ะตะฐะปะธะทะฐั†ะธั

๋กœ๊ทธ์ธ ๊ท€ํ•˜์˜ Voximplant ๊ณ„์ • ์˜ˆ๋ฅผ ๋“ค์–ด ์‹ฌ์‚ฌ์™€ ๊ฐ™์€ ์ƒˆ ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์„ ๋งŒ๋“ญ๋‹ˆ๋‹ค.

Voximplant์™€ Dialogflow๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ๋‚˜๋งŒ์˜ Google ํ†ตํ™” ์„ ๋ณ„ ๋งŒ๋“ค๊ธฐ
์—ด์–ด ๋ผ. ์„น์…˜ "๊ฐ์‹ค" ์ค‘๊ฐœ์ž ์—ญํ• ์„ ํ•  ๋ฒˆํ˜ธ๋ฅผ ๊ตฌ๋งคํ•˜์„ธ์š”.

Voximplant์™€ Dialogflow๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ๋‚˜๋งŒ์˜ Google ํ†ตํ™” ์„ ๋ณ„ ๋งŒ๋“ค๊ธฐ
๋‹ค์Œ์œผ๋กœ ์‹ฌ์‚ฌ ์‹ ์ฒญ์„œ์˜ '๋ฒˆํ˜ธ' ์„น์…˜ '์‚ฌ์šฉ ๊ฐ€๋Šฅ' ํƒญ์œผ๋กœ ์ด๋™ํ•˜์„ธ์š”. ์—ฌ๊ธฐ์— ๋ฐฉ๊ธˆ ๊ตฌ๋งคํ•œ ๋ฒˆํ˜ธ๊ฐ€ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค. "์ฒจ๋ถ€" ๋ฒ„ํŠผ์„ ์‚ฌ์šฉํ•˜์—ฌ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์— ์—ฐ๊ฒฐํ•ฉ๋‹ˆ๋‹ค. ๋‚˜ํƒ€๋‚˜๋Š” ์ฐฝ์—์„œ ๋ชจ๋“  ๊ธฐ๋ณธ๊ฐ’์„ ๊ทธ๋Œ€๋กœ ๋‘๊ณ  "์ฒจ๋ถ€"๋ฅผ ํด๋ฆญํ•ฉ๋‹ˆ๋‹ค.

์‘์šฉ ํ”„๋กœ๊ทธ๋žจ ๋‚ด๋ถ€์—์„œ "์Šคํฌ๋ฆฝํŠธ" ํƒญ์œผ๋กœ ์ด๋™ํ•˜์—ฌ myscreening ์Šคํฌ๋ฆฝํŠธ๋ฅผ ๋งŒ๋“ญ๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์„œ๋Š” ๊ธฐ์‚ฌ์˜ ์ฝ”๋“œ๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. Dialogflow ์ปค๋„ฅํ„ฐ ์‚ฌ์šฉ ๋ฐฉ๋ฒ•. ์ด ๊ฒฝ์šฐ ํ˜ธ์ถœ์ž์™€ ๋ณด์กฐ์ž ๊ฐ„์˜ ๋Œ€ํ™”๋ฅผ "๋ณด์•„์•ผ" ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ฝ”๋“œ๊ฐ€ ์•ฝ๊ฐ„ ์ˆ˜์ •๋ฉ๋‹ˆ๋‹ค. ๋ชจ๋“  ์ฝ”๋“œ ๊ฐ€๋Šฅ ์—ฌ๊ธฐ๋กœ ๋ฐ๋ ค๊ฐ€์„ธ์š”.

์ฃผ์˜: ์„œ๋ฒ„ ๋ณ€์ˆ˜์˜ ๊ฐ’์„ ngrok ์„œ๋ฒ„์˜ ์ด๋ฆ„์œผ๋กœ ๋ณ€๊ฒฝํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค(ngrok์— ๋Œ€ํ•œ ์ž์„ธํ•œ ๋‚ด์šฉ์€ ์•„๋ž˜์— ์žˆ์Œ). ๋˜ํ•œ 31ํ–‰์˜ ๊ฐ’์„ ๋Œ€์ฒดํ•˜์‹ญ์‹œ์˜ค. ์—ฌ๊ธฐ์„œ ์ „ํ™”๋ฒˆํ˜ธ๋Š” ๊ธฐ๋ณธ ๋ฒˆํ˜ธ(์˜ˆ: ๊ฐœ์ธ ํœด๋Œ€ํฐ)์ด๊ณ , voximplant ๋ฒˆํ˜ธ๋Š” ์ตœ๊ทผ ๊ตฌ์ž…ํ•œ ๋ฒˆํ˜ธ์ž…๋‹ˆ๋‹ค.

outbound_call = VoxEngine.callPSTN(โ€œYOUR PHONE NUMBERโ€, โ€œVOXIMPLANT NUMBERโ€)

ํ†ตํ™”PSTN ํ†ตํ™”๋Š” ๋Œ€ํ™”์— ์ฐธ์—ฌํ•˜์—ฌ ๋“ค์–ด์˜ค๋Š” ๊ฐ€์ž…์ž์™€ ๊ฐœ์ธ์ ์œผ๋กœ ๋Œ€ํ™”ํ•˜๊ธฐ๋กœ ๊ฒฐ์ •ํ•œ ์ˆœ๊ฐ„์— ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

์Šคํฌ๋ฆฝํŠธ๋ฅผ ์ €์žฅํ•œ ํ›„ ๊ตฌ๋งคํ•œ ๋ฒˆํ˜ธ์— ์—ฐ๊ฒฐํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ด๋ ‡๊ฒŒ ํ•˜๋ ค๋ฉด ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋‚ด์—์„œ "๋ผ์šฐํŒ…" ํƒญ์œผ๋กœ ์ด๋™ํ•˜์—ฌ ์ƒˆ ๊ทœ์น™(์˜ค๋ฅธ์ชฝ ์ƒ๋‹จ์— ์žˆ๋Š” "์ƒˆ ๊ทœ์น™" ๋ฒ„ํŠผ)์„ ๋งŒ๋“ญ๋‹ˆ๋‹ค. ์ด๋ฆ„(์˜ˆ: allcalls)์„ ์ œ๊ณตํ•˜๊ณ  ๊ธฐ๋ณธ ๋งˆ์Šคํฌ(.* - ๋ชจ๋“  ์ˆ˜์‹  ์ „ํ™”๊ฐ€ ์ด ๊ทœ์น™์— ๋Œ€ํ•ด ์„ ํƒ๋œ ์Šคํฌ๋ฆฝํŠธ์— ์˜ํ•ด ์ฒ˜๋ฆฌ๋จ์„ ์˜๋ฏธ)๋ฅผ ๊ทธ๋Œ€๋กœ ๋‘๊ณ  myscreening ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.

Voximplant์™€ Dialogflow๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ๋‚˜๋งŒ์˜ Google ํ†ตํ™” ์„ ๋ณ„ ๋งŒ๋“ค๊ธฐ
๊ทœ์น™์„ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค.

์ด์ œ๋ถ€ํ„ฐ ์ „ํ™”๋ฒˆํ˜ธ๊ฐ€ ์Šคํฌ๋ฆฝํŠธ์— ์—ฐ๊ฒฐ๋ฉ๋‹ˆ๋‹ค. ๋งˆ์ง€๋ง‰์œผ๋กœ ํ•ด์•ผ ํ•  ์ผ์€ ๋ด‡์„ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์— ์—ฐ๊ฒฐํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด๋ ‡๊ฒŒ ํ•˜๋ ค๋ฉด 'Dialogflow ์ปค๋„ฅํ„ฐ' ํƒญ์œผ๋กœ ์ด๋™ํ•˜์—ฌ ์˜ค๋ฅธ์ชฝ ์ƒ๋‹จ์— ์žˆ๋Š” 'Dialogflow ์—์ด์ „ํŠธ ์ถ”๊ฐ€' ๋ฒ„ํŠผ์„ ํด๋ฆญํ•˜๊ณ  Dialogflow ์—์ด์ „ํŠธ์˜ JSON ํŒŒ์ผ์„ ์—…๋กœ๋“œํ•˜์„ธ์š”.

Voximplant์™€ Dialogflow๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ๋‚˜๋งŒ์˜ Google ํ†ตํ™” ์„ ๋ณ„ ๋งŒ๋“ค๊ธฐ
์˜ˆ์‹œ/ํ…Œ์ŠคํŠธ๋ฅผ ์œ„ํ•œ ์—์ด์ „ํŠธ๊ฐ€ ํ•„์š”ํ•œ ๊ฒฝ์šฐ ๋‹ค์Œ ๋งํฌ์—์„œ ์—์ด์ „ํŠธ๋ฅผ ์ด์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. github.com/aylarov/callscreening/tree/master/dialogflow. ๋งŽ์€ ๊ฒƒ์„ ์š”๊ตฌํ•˜์ง€ ๋งˆ์„ธ์š”. ์ด๋Š” ์›ํ•˜๋Š” ๋Œ€๋กœ ์ž์œ ๋กญ๊ฒŒ ๋‹ค์‹œ ์‹คํ–‰ํ•˜๊ณ  ๊ฒฐ๊ณผ๋ฅผ ์ž์œ ๋กญ๊ฒŒ ๊ณต์œ ํ•  ์ˆ˜ ์žˆ๋Š” ์˜ˆ์‹œ์ผ ๋ฟ์ž…๋‹ˆ๋‹ค. :)

NodeJS์˜ ๊ฐ„๋‹จํ•œ ๋ฐฑ์—”๋“œ

์˜ˆ๋ฅผ ๋“ค์–ด ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋…ธ๋“œ์— ๊ฐ„๋‹จํ•œ ๋ฐฑ์—”๋“œ๋ฅผ ๋ฐฐํฌํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.
github.com/aylarov/callscreening/tree/master/nodejs

์ด๋Š” ๋‘ ๊ฐœ์˜ ๋ช…๋ น๋งŒ ์‹คํ–‰ํ•˜๋ฉด ๋˜๋Š” ๊ฐ„๋‹จํ•œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ž…๋‹ˆ๋‹ค.

npm install
node index.js

์„œ๋ฒ„๋Š” ์‹œ์Šคํ…œ์˜ ํฌํŠธ 3000์—์„œ ์‹คํ–‰๋˜๋ฏ€๋กœ Voximplant ํด๋ผ์šฐ๋“œ์— ์—ฐ๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ngrok ์œ ํ‹ธ๋ฆฌํ‹ฐ๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ์„ค์น˜ํ•  ๋•Œ ๋‚จ์ž, ๋‹ค์Œ ๋ช…๋ น์„ ์‚ฌ์šฉํ•˜์—ฌ ์‹คํ–‰ํ•˜์„ธ์š”.

ngrok http 3000

ngrok์ด ๋กœ์ปฌ ์„œ๋ฒ„์— ๋Œ€ํ•ด ์ƒ์„ฑํ•œ ๋„๋ฉ”์ธ ์ด๋ฆ„์„ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋ฅผ ๋ณต์‚ฌํ•˜์—ฌ ์„œ๋ฒ„ ๋ณ€์ˆ˜์— ๋ถ™์—ฌ๋„ฃ์Šต๋‹ˆ๋‹ค.

ํด๋ผ์ด์–ธํŠธ

ํด๋ผ์ด์–ธํŠธ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์€ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ฐ„๋‹จํ•œ ์ฑ„ํŒ…์ฒ˜๋Ÿผ ๋ณด์ž…๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์—์„œ ๋ฐ›์•„.

๋ชจ๋“  ํŒŒ์ผ์„ ์›น ์„œ๋ฒ„์˜ ์ผ๋ถ€ ๋””๋ ‰ํ† ๋ฆฌ์— ๋ณต์‚ฌํ•˜๋ฉด ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. script.js ํŒŒ์ผ์—์„œ ์„œ๋ฒ„ ๋ณ€์ˆ˜๋ฅผ ngrok ๋„๋ฉ”์ธ ์ด๋ฆ„์œผ๋กœ ๋ฐ”๊พธ๊ณ , ์ˆ˜์‹ ์ž ๋ณ€์ˆ˜๋ฅผ ๊ตฌ๋งคํ•œ ๋ฒˆํ˜ธ๋กœ ๋ฐ”๊พธ์„ธ์š”. ํŒŒ์ผ์„ ์ €์žฅํ•˜๊ณ  ๋ธŒ๋ผ์šฐ์ €์—์„œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค. ๋ชจ๋“  ๊ฒƒ์ด ์ •์ƒ์ด๋ฉด ๊ฐœ๋ฐœ์ž ํŒจ๋„์— WebSocket ์—ฐ๊ฒฐ์ด ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค.

ะ”ะตะผะพ

์ด ๋น„๋””์˜ค์—์„œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ์‹ค์ œ๋กœ ์ž‘๋™ํ•˜๋Š” ๋ชจ์Šต์„ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.


PS ๊ฐœ์ž… ๋ฒ„ํŠผ์„ ํด๋ฆญํ•˜๋ฉด ๋ฐœ์‹ ์ž๋Š” ๋‚ด ์ „ํ™”๋ฒˆํ˜ธ๋กœ ์—ฐ๊ฒฐ๋˜๊ณ , ์—ฐ๊ฒฐ ๋Š๊ธฐ๋ฅผ ํด๋ฆญํ•˜๋ฉด...? ๊ทธ๋ ‡๊ตฐ์š”. ํ†ตํ™”๊ฐ€ ๋Š์–ด์ง‘๋‹ˆ๋‹ค.

์ถœ์ฒ˜ : habr.com

์ฝ”๋ฉ˜ํŠธ๋ฅผ ์ถ”๊ฐ€