🎯 3줄 요약
<aside> 🌐 English version → One Click Spawns a Phone Number, and That Call Rings in Discord
</aside>
- 국가가 쥐고 있던 전화번호가 개발형 CPaaS(Vonage) 위에서 API 한 줄로 만들어지는 소프트웨어 자산으로 바뀌는 순간, 보이스콜은 통신사 계약이 아니라 코드가 된다.
- 전화가 걸려오면
NCCO(JSON)로 통화를 제어하고, 통화 오디오를 WebSocket으로 포크해 게임 음성채팅 1위 Discord 채널로 끌어와 상담사가 "통화받기" 버튼 한 번으로 응대한다 — 실제 .NET 코드로 전 구간을 따라간다.
- 그리고 정직하게: 왜 이 보이스 경로는 아직 액터가 아니고, 같은 코드베이스의 채팅 팬아웃은 왜 Akka.NET 액터인가. 전화 한 통을 액터 한 개로 보는 설계가 어디로 향하는지 — Luware 사례로 그 목적지를 확인한다.
🎨 그림 1 — 히어로: 딸깍 전화번호 생성에서 디스코드 통화까지의 여정

이 글은 보이스콜(전화 상담)을 다루는 개발자, 그리고 "우리도 전화 상담을 붙이고 싶은데 어디서부터 손대야 하지?" 고민하는 비즈니스 담당자를 위한 것이다. 우리가 파는 상품 이야기는 잠시 접어두고, .NET 진영에서 **Akka.NET 액터 모델**과 Vonage Voice API로 전화번호 생성 → 통화 수신 → 상담사 연결 → 게임 음성채팅 1위 Discord까지 이어지는 여정의 기술적 이슈를 코드 레벨로 파고든다.
핵심 주장은 하나다. 전화(telephony)와 액터 모델은 남남이 아니라, 원래 한 몸에서 태어났다. 그 뿌리를 먼저 짚고, 실제 구현 코드로 내려간다.
액터 모델은 유행어가 아니다. 1973년 Carl Hewitt·Peter Bishop·Richard Steiger가 IJCAI에서 발표한 「A Universal Modular Actor Formalism for Artificial Intelligence」에서 시작됐다. 규칙은 세 줄로 끝난다.
이 모델이 실제로 세상을 바꾼 무대가 바로 전화였다. Erlang은 1986년 에릭슨(Ericsson)에서 전화 교환기를 위해 태어났다. Joe Armstrong이 이끈 이 언어의 프로세스 모델은 액터 패러다임 그 자체였고, 여기서 그 유명한 "Let it crash" 철학이 나온다.
모든 실패를 방어 코드로 막으려 하지 마라. 고장 난 프로세스는 그냥 죽게 두고, 수퍼바이저(supervisor)가 알아서 깨끗한 상태로 재시작하게 하라. 그러면 실패의 폭발 반경(blast radius)이 통화 한 건 안에 갇힌다.
에릭슨의 Erlang 기반 교환기 AXD301은 극단적으로 높은 가용성을 기록한 사례로 널리 인용된다(흔히 회자되는 "나인 나인(99.9999999%)" 수치는 Joe Armstrong의 박사 논문에서 비롯된 것으로, 측정 조건에 따라 해석 차이가 있어 여기선 하나의 상징으로만 든다). 요점은 수치가 아니라 설계다 — 전화 한 통 = 격리된 프로세스(액터) 한 개라는 발상은 비유가 아니라, 실제 교환기가 돌아간 방식이었다.