Skip to main content
카카오 알림톡 vs SMS

서비스를 운영하다 보면 주문 확인, 예약 안내, 인증 코드 등 다양한 알림을 보내야 하는 상황이 생깁니다. 한국 시장에서는 크게 두 가지 선택지가 있습니다. 카카오 알림톡SMS(문자 메시지)입니다. 이 글에서는 코드벤터 개발팀이 실제 프로젝트에 두 가지 방식을 모두 연동해보면서 느낀 비용, 개발 난이도, 도달률 차이를 솔직하게 정리합니다.

카카오 알림톡이란?

카카오 알림톡은 카카오톡 채널(구 플러스친구)을 통해 발송하는 비즈니스 메시지입니다. 텍스트 기반의 SMS와 달리 버튼, 이미지, 링크를 포함할 수 있고 카카오톡 앱 내에서 읽기 좋은 포맷으로 표시됩니다. 국내 카카오톡 사용률이 90% 이상인 만큼 도달률도 매우 높습니다.

알림톡을 발송하려면 카카오 비즈니스 채널 개설 → 템플릿 등록 및 심사 승인 → 카카오 공식 파트너사(발송 대행사) 계약의 3단계를 거쳐야 합니다. 직접 카카오 API를 두드리는 방식이 아니라 반드시 인증된 대행사(솔라피, NHN 클라우드, 알리고 등)를 통해서만 발송할 수 있습니다.

비용 비교 — 알림톡이 항상 저렴할까?

2024년 기준 주요 발송 단가는 다음과 같습니다. SMS 단문(90byte 이하)은 건당 약 8~10원, LMS(장문 2,000byte 이하)는 약 27~30원, MMS(이미지 포함)는 약 65~70원입니다. 카카오 알림톡은 건당 약 7~9원으로 단순 단가만 보면 SMS보다 저렴합니다. 그러나 수신자가 카카오톡을 차단했거나 미설치 상태라면 LMS로 대체 발송(fallback)이 이루어져 LMS 단가가 과금됩니다. 실제 운영에서는 알림톡 + fallback SMS를 합산한 평균 단가를 기준으로 비교해야 합니다.

SMS 발송 코드 (솔라피 기준)

솔라피 SMS API는 RESTful 방식으로 굉장히 단순합니다. FastAPI 환경에서 httpx를 활용한 비동기 발송 예제를 살펴보겠습니다.

# FastAPI + Solapi SMS
import hmac, hashlib, time, base64, httpx

SOLAPI_API_KEY = "your_api_key"
SOLAPI_API_SECRET = "your_api_secret"

def get_auth_header():
    date = str(int(time.time() * 1000))
    salt = base64.b64encode(date.encode()).decode()[:32]
    data = f"{date}{salt}"
    sig = hmac.new(SOLAPI_API_SECRET.encode(), data.encode(), hashlib.sha256).hexdigest()
    return f"HMAC-SHA256 apiKey={SOLAPI_API_KEY}, date={date}, salt={salt}, signature={sig}"

async def send_sms(to: str, text: str):
    async with httpx.AsyncClient() as client:
        resp = await client.post(
            "https://api.solapi.com/messages/v4/send",
            headers={"Authorization": get_auth_header()},
            json={"message": {"to": to, "from": "070-XXXX-XXXX", "text": text}}
        )
    return resp.json()

카카오 알림톡 발송 코드

알림톡은 동일하게 솔라피 API를 사용하지만 kakaoOptions 필드를 추가해야 합니다. 카카오 채널 ID와 심사 완료된 템플릿 코드가 반드시 필요합니다.

# Solapi Kakao AlimTalk
async def send_alimtalk(to: str, template_id: str, variables: dict):
    async with httpx.AsyncClient() as client:
        resp = await client.post(
            "https://api.solapi.com/messages/v4/send",
            headers={"Authorization": get_auth_header()},
            json={
                "message": {
                    "to": to,
                    "from": "070-XXXX-XXXX",
                    "kakaoOptions": {
                        "pfId": "YOUR_KAKAO_CHANNEL_ID",
                        "templateId": template_id,
                        "variables": variables,
                        "disableSms": False
                    }
                }
            }
        )
    return resp.json()

# Usage
await send_alimtalk(
    to="01012345678",
    template_id="KA01TP...",
    variables={"#{name}": "Hong Gildong", "#{date}": "2026-03-05"}
)

두 채널 통합 서비스 레이어 구성

실무에서는 두 채널을 추상화된 서비스 레이어로 감싸두면 코드 변경 없이 채널을 전환할 수 있습니다. 아래는 알림톡 실패 시 자동으로 SMS로 fallback 처리하는 통합 서비스 예제입니다.

# notification_service.py
from enum import Enum

class NotificationChannel(str, Enum):
    SMS = "sms"
    ALIMTALK = "alimtalk"

class NotificationService:
    async def send(self, to, channel, text=None, template_id=None, variables=None):
        if channel == NotificationChannel.ALIMTALK and template_id:
            try:
                result = await send_alimtalk(to, template_id, variables)
                if result.get("errorCode"):
                    raise ValueError(result["errorMessage"])
                return result
            except Exception as e:
                print(f"AlimTalk failed, fallback to SMS: {e}")
                return await send_sms(to, text or "Notification arrived.")
        return await send_sms(to, text)

notification_svc = NotificationService()

@router.post("/reservations/{id}/confirm")
async def confirm_reservation(id: int, db=Depends(get_db)):
    reservation = await db.get(Reservation, id)
    await notification_svc.send(
        to=reservation.phone,
        channel=NotificationChannel.ALIMTALK,
        template_id="KA01TP_CONFIRM",
        variables={
            "#{name}": reservation.user_name,
            "#{datetime}": reservation.datetime.strftime("%Y-%m-%d %H:%M")
        },
        text=f"[Confirmed] {reservation.user_name}'s reservation is confirmed."
    )
    return {"status": "confirmed"}

개발 난이도 비교 — SMS가 압도적으로 쉽다

SMS는 API 키를 발급받으면 바로 발송 테스트가 가능합니다. 반면 카카오 알림톡은 채널 개설, 템플릿 등록, 심사 대기(1~3 영업일), 파트너사 계약까지 최소 1주일 이상의 준비 기간이 필요합니다. 또한 메시지 내용을 변경할 때마다 새 템플릿을 등록하고 심사를 받아야 합니다. 서비스 초기에 메시지 형식이 자주 바뀐다면 이 심사 대기 시간이 개발 속도의 발목을 잡을 수 있습니다.

도달률과 사용자 경험

도달률 측면에서는 알림톡이 유리합니다. SMS는 스팸 필터링으로 수신이 차단되는 경우가 있지만, 알림톡은 카카오톡 앱 내에서 표시되어 상대적으로 자유롭습니다. 사용자 경험 측면에서도 버튼, 이미지, 리치 콘텐츠를 포함할 수 있는 알림톡이 우수합니다. 인증 코드(OTP)처럼 즉각적인 발송이 핵심인 경우에는 SMS가 더 안정적입니다.

결론 — 어떤 걸 선택해야 할까?

알림톡을 선택할 때: 국내 B2C 서비스로 카카오톡 사용자가 주요 고객인 경우, 예약 확인·주문 안내처럼 정형화된 알림이 많을 때, 버튼과 리치 콘텐츠로 사용자 행동 유도가 필요할 때. SMS를 선택할 때: 서비스 초기라 알림 형식이 자주 바뀌는 경우, OTP 등 즉시성이 중요한 알림, 해외 사용자도 포함된 서비스.

코드벤터는 글로벌 협력 네트워크를 통해 다양한 서비스의 알림 인프라를 설계하고 구축해왔습니다. 경험상 가장 이상적인 구성은 인증 코드는 SMS, 예약·주문 등 주요 트랜잭션 알림은 알림톡으로 이원화하는 방식입니다. 위에서 소개한 통합 서비스 레이어 패턴을 활용하면 두 채널을 유연하게 관리하면서 비용과 도달률을 모두 최적화할 수 있습니다.

댓글 남기기