Twilio에서 옮기기
Twilio 채팅에서 나오기, 개념별로 짚어 봅니다
Twilio는 Programmable Chat을 Conversations로 대체했습니다. 어차피 다시 만들어야 하거나 앱 안 채팅으로만 썼다면 GravEx Chat이 무료로 옮겨 갈 자리입니다. SMS나 WhatsApp에 의존한다면 Conversations에 남으세요.
Twilio 내용은 2021-01-25·2025-05-19자 changelog, 이전 가이드, Conversations API 요금 페이지 기준이고 2026-11-03에 확인했습니다. 내 계정에 무엇이 적용되는지는 Twilio에 확인해 주세요.
// 01
Programmable Chat은 어떻게 됐나
- 2021-01-25에 Twilio는 Programmable Chat API를 2022-07-25에 종료하겠다고 알리고 고객을 Conversations API로 안내했습니다.
- Flex 안의 Programmable Chat은 따로 종료일이 있습니다. 2025-05-19자 changelog에 2026-06-01로 적혀 있습니다. Twilio는 그 뒤에는 기대대로 동작하지 않을 수 있고 기능 개선·버그 수정·보안 업데이트도 없다고 합니다. Flex 고객은 Flex Conversations로 옮기게 안내됩니다.
- 이전 가이드에서는 Chat Service·Channel·Member가 Conversation Service·Conversation·Participant가 되고, 기존 데이터는 별도 이전 없이 Conversations에서 보입니다.
그래서 공식 경로는 Conversations입니다. 한 대화에 채팅과 SMS·WhatsApp 같은 채널이 섞인다면 이쪽이 정답입니다. 앱 안 채팅뿐이라면 Twilio를 떠나는 길도 있습니다.
// 02
Conversations에 남을까, 옮길까
| 상황 | 선택 |
|---|---|
| 한 대화에 채팅과 SMS·WhatsApp이 섞임 | Twilio Conversations. GravEx Chat에는 전화 채널이 없습니다. |
| Twilio 네이티브 iOS·Android SDK를 쓰고 클라이언트를 다시 쓸 수 없음 | Twilio Conversations. GravEx Chat에는 공식 네이티브 SDK가 없습니다. |
| 웹 서비스의 앱 안 채팅이고 청구서가 신경 쓰임 | GravEx Chat. |
| 계약상 SLA나 보안·컴플라이언스 인증이 필요함 | Twilio나 다른 대형 업체. GravEx Chat에는 둘 다 없습니다. |
규모 감각을 위해 적으면, Conversations는 월간 활성 사용자 첫 200명이 무료이고 201~5,000명은 활성 사용자당 월 $0.05, 5,001~10,000명은 $0.0475, 10,001~20,000명은 $0.045이며 여기에 채널 요금과 월 GB당 $0.25부터인 미디어 저장 요금이 붙습니다. 구간별로 나눠 매기는 것으로 읽으면 활성 사용자 5,000명은 그 추가 요금을 빼고 월 $240쯤입니다(4,800명 × $0.05). GravEx Chat에는 유료 요금제가 없습니다.
// 03
개념 대응표
| Twilio | GravEx Chat |
|---|---|
| Chat Service, Conversation Service | 앱. 앱 하나가 테넌트 하나이고 키를 따로 갖습니다: 브라우저용 pk_, 서버용 sk_. |
| Channel, Conversation | 방. 종류는 public, private, channel(누구나 읽고 소유자·관리자만 씀), dm. 방은 백엔드가 rooms.ensure로 만듭니다. |
| Member, Participant | 방 멤버. members.add로 넣고 admin 역할을 줄 수 있습니다. |
| Identity와 액세스 토큰 | 사용자 id와, 백엔드가 chat.token({ userId, name })으로 서명하는 JWT. HS256이고 유효 기간은 최대 24시간입니다. |
| 메시지와 미디어 | 텍스트, URL로 된 첨부(파일은 직접 저장), 인용은 replyTo, 스레드는 threadId. |
| 웹훅 | 서명된 웹훅(message.created, message.deleted, 리액션 이벤트 등, 최소 한 번 전달), 그리고 메시지를 거부하거나 고쳐 통과시킬 수 있는 동기 before_publish 훅. |
| 입력 중 표시와 읽음 | room.typing(), room.markRead(seq), chat.unread(). |
| 푸시 알림 | 내장돼 있지 않습니다. message.created를 받아 직접 서버에서 FCM·웹 푸시·이메일로 보냅니다. |
| 클라이언트 SDK | 브라우저·Node는 @kispi/chat. 다른 언어는 REST·WebSocket 프로토콜을 구현합니다. |
// 04
옮기는 순서
- 콘솔에서 앱을 만들고 pk_와 sk_를 환경변수에 넣습니다. 「AI로 시작하기」 가이드처럼 계정 키로 AI 도구에 시켜도 됩니다.
- Twilio 토큰 발급 엔드포인트를 chat.token()을 부르는 것으로 바꿉니다. 서명은 로컬에서 하고 네트워크 호출이 없습니다.
- Twilio에서 채널이나 대화를 만들던 자리에서 백엔드가 방을 만듭니다. order-1234처럼 바뀌지 않는 ASCII key를 써야 roomByKey로 다시 찾을 수 있습니다.
- 클라이언트를 바꿉니다. Twilio 클라이언트 자리에 createChatClient를 쓰고, room.subscribe()가 최근 메시지 100개를 불러오며, room.on('messages', ...)가 바뀔 때마다 전체 목록을 줍니다.
- 웹훅을 옮깁니다. chat.webhooks.verify로 서명을 확인하고 핸들러를 message.created 등의 이벤트에 맞춥니다.
- 한동안 둘을 같이 돌립니다. 새 채팅을 플래그 뒤에 두고 일부 사용자에게 먼저 열어 본 다음 전체를 바꿉니다.
// 05
대화 기록은 어떻게 되나
- 가져오기 도구는 없습니다. Twilio API에서 대화와 메시지를 읽어 GravEx REST API로 다시 넣습니다: 방은 PUT /v1/rooms, 메시지는 POST /v1/rooms/{roomId}/messages. Twilio 메시지 SID를 clientMessageId로 쓰면 실패한 작업을 다시 돌려도 중복되지 않습니다.
- 메시지 보내기에 시각을 넣는 항목이 없어서 옮겨 넣은 메시지는 넣은 시각으로 찍힙니다. 원래 시각은 appMeta에 담거나, Twilio 기록은 보관용으로 두고 새 방은 비운 채 시작하세요.
- 한꺼번에 옮기기 전에 앱의 한도 탭을 확인하세요. 기본 발행 속도는 유저당 초당 5건이고, 한도는 요청하면 올릴 수 있습니다.
// FAQ
자주 묻는 질문
- Twilio Programmable Chat은 아직 쓸 수 있나요?
- Twilio는 2021년 1월에 이 API를 2022-07-25에 종료하고 Conversations로 대체한다고 알렸고, Flex 안의 Programmable Chat은 종료일을 2026-06-01로 정했습니다. 내 계정에 어떻게 적용되는지는 Twilio의 최신 공지를 확인하세요. 새로 만드는 일에는 Twilio가 Conversations를 안내합니다.
- Twilio 데이터를 가져오는 도구가 있나요?
- 없습니다. 위에 적은 대로 REST API로 옮겨 넣습니다.
- SMS나 WhatsApp은 계속 쓸 수 있나요?
- GravEx Chat에는 전화 채널이 없어서 안 됩니다. 그 채널은 Twilio에 남겨 두세요.
- iOS·Android 앱은 어떻게 하나요?
- 공식 네이티브 SDK는 없습니다. REST API와 WebSocket 프로토콜이 공개돼 있고, 실시간 프로토콜 문서에 SDK 없이 클라이언트를 만드는 점검표가 있습니다. 백엔드의 토큰 발급은 그대로입니다.
함께 보기
출처