사이드프로젝트 slecs

알림 파이프라인에서 발신자 표시명 분리 정규화로 채널별 오발송 해결

목차

v3.1 릴리스 — senderDisplay 필드 추가하다 만난 알림 파이프라인 이슈

API 스펙 작은 변경 하나가 알림 파이프라인 전체를 흔드는 경험을 또 함. 파트너 쪽에서 "발신자 표시명을 별도로 받고 싶다"는 요청이 왔고, 기존 sender 외에 senderDisplay 를 추가했음.

처음엔 단순 nullable 문자열 추가라 30분이면 끝날 줄 알았는데, 외부 메시징 채널 템플릿 변수랑 묶이니까 얘기가 달라짐.

무엇이 꼬였나

  • 기존 sender = 내부 식별자 (영문, 길이 제약 없음)
  • 신규 senderDisplay = 사용자 노출용 (한글, 이모지 허용)
  • 알림 수집 레이어가 둘을 헷갈려서 채널마다 다른 값이 나감
  • 메시징 채널 템플릿은 변수 글자수 제한이 빡세고 이모지를 못 받음
채널 기존 동작 신규 동작
이메일 sender senderDisplay 우선, fallback sender
SMS sender senderDisplay (20자 절단)
메시징 알림 sender senderDisplay (이모지 strip + 14자)

결정한 원칙

1. API는  필드 모두 받되 senderDisplay  optional
2. 채널별 정규화는 알림 수집 레이어에서만 수행
3. 발송 모듈은 정규화된 값만 신뢰 (재가공 금지)

이렇게 정리하니 채널이 추가돼도 정규화 규칙을 한 곳에서만 관리하면 됨. 처음엔 "API 게이트웨이에서 잘라서 내려주자"는 의견도 있었는데 채널마다 제약(이메일 60자, 메시징 14자, SMS 20자)이 달라 단일 기준을 못 잡음. 호출처가 길이를 알 필요 없게 하는 게 핵심이었음.

fallback 처리

senderDisplay 가 비면 sender 로 떨어뜨리는데, 이때 sender 가 영문 식별자라 사용자한테 그대로 노출되면 곤란함. 그래서 fallback 시점에 한 번 더 "노출 가능한 형태인지" 검사하는 가드를 넣음. 결과적으로 분기는 늘었지만 운영 들어간 뒤 "왜 abc_corp_03 이 카톡으로 오냐" 같은 문의가 안 옴.

남은 교훈

  • nullable 필드 추가는 결코 단순 추가가 아님 — 의미가 분기되면 호출처가 다 영향받음
  • 표시용/식별용 분리는 처음 설계할 때부터 했어야 했음. v3 까지 끌고 온 게 미안함
  • 채널별 정규화 규칙은 코드보다 표로 먼저 합의해야 의견 충돌이 줄어듦
  • v3.1 마이너 버전인데 fallback 로직 때문에 PR 라인이 +320 됨. 마이너가 아닌 듯 마이너인 듯

다음

댓글 0

첫 댓글 달아줘.