Message Hub를 활용한 메시지 발신
개요
Message Hub는 다양한 시스템과 사용자에게 메시지 및 알림을 안정적으로 전달하는 통합 메시징 서비스입니다. 애플리케이션에서 발생한 이벤트와 알림 메시지를 SMS, Email, Mobile Application Push Notification 등 다양한 채널을 통해 최종 사용자에게 실시간으로 전달합니다.
애플리케이션이 채널별 사업자와 직접 연동하는 경우, 채널마다 서로 다른 연동 규격과 발신자 인증 절차를 개별적으로 구현하고 운영해야 합니다. Message Hub는 발신 채널을 하나의 플랫폼에서 통합 관리하고 발신자 정보 관리와 발신 업무를 대행하므로, 애플리케이션은 채널별 구현 부담 없이 단일 API 호출만으로 알림을 발송할 수 있습니다. 또한 안정적인 메시지 전달과 확장 가능한 아키텍처를 통해 대규모 서비스 환경에서도 일관된 메시징 서비스를 제공합니다.
메시지 전송은 Publisher(발신자)가 Message Hub의 채널별 전송 API를 호출하는 방식으로 이루어지며, Message Hub가 Subscriber(수신자)에게 해당 채널 형태로 메시지를 전달합니다. API는 인터넷 구간에서 호출하는 Public URL과 VPC 내부 자원에서 Private Endpoint를 통해 호출하는 Private URL로 구분되어 제공됩니다.
아키텍처 다이어그램
사용사례
Message Hub를 활용한 개발은 애플리케이션 로직과 알림 전달 채널을 분리하는 데 초점을 맞춥니다. 애플리케이션은 “무엇을 알릴 것인가"에만 집중하고, “어떤 채널로 어떻게 전달할 것인가"는 Message Hub에 위임합니다.
각 사례는 Message Hub의 핵심 강점인 채널 통합, 발신자 인증 대행, 확장 가능한 전달 구조를 기반으로 한 사용 사례입니다.
이벤트 기반 사용자 알림
애플리케이션에서 발생한 이벤트를 최종 사용자에게 실시간으로 전달합니다.
트랜잭션 알림
주문 완료, 결제 승인, 배송 상태 변경과 같이 사용자의 행위에 대한 결과를 즉시 통지합니다. 애플리케이션은 이벤트 발생 시점에 Message Hub의 채널별 전송 API를 호출하기만 하면 됩니다.
인증 및 보안 알림
본인 확인 번호, 신규 기기 로그인 감지, 비밀번호 변경과 같이 즉시성이 중요한 메시지를 SMS나 Email로 전달합니다.
운영 및 모니터링 알림
시스템 운영 과정에서 발생하는 상태 변화를 담당자에게 전달합니다.
배치 작업 실패, 자원 임계치 초과, 장애 감지와 같은 이벤트를 운영 담당자의 전화번호나 Email로 발송하여 대응 시점을 앞당깁니다.
선결 사항
메시지 전송 API를 호출하기 전에, 발송에 사용할 리소스(Email, 전화번호, Push Application)를 Console에서 먼저 추가하고 인증을 완료해야 합니다. 인증이 완료되지 않은 발신 리소스로 전송을 시도하면 400 AccessDeniedException 오류가 발생합니다.
채널별 발신 리소스 준비
전화번호 (SMS)
Phone Book에 발신에 사용할 전화번호를 추가한 후, 발신 번호 인증을 완료해야 합니다.
인증 서류는 Support Center > 서비스 요청을 통해 등록하며, 명의자에 따라 사업자등록증, 통신서비스 이용증명원, 재직증명서, 이용승낙서가 필요합니다. 통신서비스 이용증명원은 마스킹 처리가 없어야 하고 최근 3개월 이내 발급된 서류만 등록할 수 있으므로, 서류 준비 기간을 일정에 반영하세요.
서류 확인과 인증이 완료되면 발신 번호 인증 상태가 확인 완료로 표시되며, 해당 번호를 발신 번호로 지정하여 SMS를 전송할 수 있습니다.
Email 관리 > Domain에서 발신용 Email 도메인을 추가하고, Support Center > 서비스 요청을 통해 도메인 인증을 진행해야 합니다. 도메인 인증 과정에서 SPF, DKIM, DMARC 등의 DNS 레코드 등록이 필요하므로 DNS 관리자와의 사전 협의가 필요합니다.
이후 Email 관리 > Email에서 발신 Email 주소를 추가하고, 소유자 Email로 전송된 인증 번호를 입력하여 Email 인증을 완료합니다.
호출 구간 결정
API URL은 운영 환경과 Region에 따라 달라지며, 호출 구간에 따라 Public URL과 Private URL로 구분됩니다.
- Public URL: 인터넷 구간에서 Message Hub를 호출할 때 사용합니다.
- Private URL: VPC 내부 자원에서 Private Endpoint를 통해 호출할 때 사용합니다.
Private 구간 호출을 사용하려면 {채널} 상세 > 접근 제어 탭에서 프라이빗 엔드포인트를 활성화하고 프라이빗 접근 허용 자원을 설정해야 합니다. 허용되지 않은 상태에서 호출하면 400 AccessDeniedException 오류가 발생합니다. 요청 헤더와 본문은 Public 호출과 동일하며 URL만 변경됩니다.
제약 사항
Quota 서비스를 참조하여 주십시오.
월별 발신 개수
채널의 월별 발신 개수는 다음과 같이 제한됩니다. 발신 제한 개수를 증설하려면 Support Center > 서비스 요청을 통하여 진행해 주세요.
| 채널 | 월별 발신 제한 |
|---|---|
| SMS | 10,000 건 |
| 100,000 건 | |
| Push | 1,000,000 건 |
월 발송 quota를 초과하면 429 LimitExceededException 오류가 Retry-After 헤더와 함께 반환됩니다.
요청 크기 및 수신자 수
모든 메시지 전송 API의 요청 본문 전체 크기는 294,912 bytes를 초과할 수 없으며, 채널별 제약은 다음과 같습니다.
| 채널 | 수신자 수 | 본문 크기 |
|---|---|---|
| 최소 1개, 최대 100개 | 본문(body) 최대 262,144 bytes | |
| SMS | 최소 1개, 최대 100개 | 본문(text) 최대 90 bytes |
| Push | 디바이스 토큰 최대 100개 | data 페이로드 최대 1,024 bytes |
제한을 초과하면 413 RequestEntityTooLarge 오류가 발생하며, 수신자 수 초과는 400 InvalidParameterValue로 반환됩니다.
채널별 기능 제약
- Push: data-only 페이로드로만 발송됩니다.
data객체에title,body필드를 제공할 수 없으므로, 알림 제목과 본문은data페이로드에 담아 전달하고 디바이스 애플리케이션에서 직접 화면에 표시해야 합니다. - SMS: 수신자 번호는 ITU-T E.164 형식을 따릅니다.
+접두사가 없으면 국내(대한민국, 국가번호 82) 번호로 해석되며,-와 공백은 제거됩니다. - Email: 도메인 보호 기능이 활성화된 도메인은 다른 Account에서 사용할 수 없습니다. 도메인이 인증되면 보호 기능이 자동으로 활성화됩니다.
제공 시점
Topic과 Subscription을 이용한 대량 메시지 발송 기능은 26년 11월 제공 예정입니다. 그 전까지는 채널별 전송 API에 수신자 목록을 직접 전달하는 방식으로 발송해야 합니다.
고려 사항
발신 리소스 인증 리드 타임 확보
SMS 발신 번호 인증과 Email 도메인 인증은 Support Center > 서비스 요청을 통한 서류 검토 절차를 거칩니다. 애플리케이션 개발과 병행하여 인증 절차를 조기에 착수하고, 인증 완료 전에는 개발 환경에서 Push 채널 등 인증 리드 타임이 짧은 채널로 검증하는 방식을 고려하세요.
수신자 수 제한을 고려한 발송 설계
한 번의 API 호출로 전달할 수 있는 수신자는 채널별로 최대 100개입니다. 대량 발송이 필요한 경우 수신자 목록을 100개 단위로 분할하여 호출하는 로직이 필요하며, 이때 월별 발신 quota 소진 속도와 429 응답에 대한 재시도 처리를 함께 설계해야 합니다. Retry-After 헤더 값을 준수하여 백오프하는 것을 권장합니다.
Private Endpoint를 통한 호출
VPC 내부 워크로드에서 인터넷 노출 없이 Message Hub를 호출하려면 Private URL과 프라이빗 엔드포인트를 사용하세요. 프라이빗 엔드포인트를 비활성화하면 설정된 엔드포인트 접근 제어 리스트가 삭제되므로, 운영 중 설정 변경 시 주의가 필요합니다.
퍼블릭 엔드포인트를 사용하는 경우에는 접근 제어 탭에서 퍼블릭 접근 허용 IP를 CIDR 형식으로 최대 100개까지 등록하여 호출 주체를 제한하세요. 0.0.0.0/0과 127.0.0.1/32는 추가할 수 없습니다.
