Maxonomy 페이지로 이동 배포 반영 2026.07.06
i

해당 가이드는 솔루션 도입 과정에서 가장 많이 활용하는 기능을 기준으로 함축된 내용을 제공합니다. 가이드에서 제공되지 않은 기능은 Braze 공식 문서를 통해 확인 부탁드립니다.

데이터 전송 프로세스

Braze에서의 데이터 전송 프로세스는 Native 영역은 일반적인 태깅을 통한 SDK 전송이 진행됩니다.

Hybrid 영역은 앱/웹 분기처리 및 인터페이스를 통해 Webview 데이터를 Native 영역으로 전달하여 전송합니다.

Hybrid 영역에서 별도 분기처리가 되지 않을 경우, Braze 솔루션 활용 간 기능 제한 및 이슈가 발생될 수 있습니다.

!
중요 — 하이브리드 미처리 시 크리티컬 이슈
  1. Data Point 이슈 — Session 이벤트 중복 발생. SDK 자동 수집 Session이 분기 없이 중복 집계될 수 있습니다.
  2. APP 내 서비스 이슈 — WEB 인앱 메시지가 하이브리드 영역에 노출되거나, 인앱 메시지가 동시 노출되어 비정상 화면이 발생할 수 있습니다.
  3. PUSH 캠페인 활용 제한 — 전송이 모두 WEB 기반이면 APP 푸시 캠페인 활용이 불가합니다.

해당 사항 외에도 다양한 이슈가 발생될 수 있습니다.

Native APP 및 Hybrid Web 데이터 전송 프로세스 — 개발을 통한 태깅, 인터페이스 코드 구현
Native APP: SDK → 개발을 통한 태깅 → Braze / Hybrid Web: 인터페이스 코드 구현 → Native SDK → 개발을 통한 태깅 → Braze

SDK 설치

Android Studio 프로젝트에서 Build.gradlebraze.xml로 SDK를 연동합니다.

대시보드에서 API Key 확인

Braze 대시보드 Manage Settings+ Add App에서 Android 앱을 등록한 뒤 API KeySDK Endpoint를 확인합니다.

Braze Manage Settings — Android API Key 확인 화면
Manage Settings — Android 앱 등록 · API Key · SDK Endpoint 확인
  • Android Studio 빌드 후 build.gradle에 Braze 의존성 추가
  • Braze 설정 XML에 API_KeyEndpoint 설정 (Braze 대시보드에서 발급)
  • 대시보드: Manage Settings+ Add App에서 Android 앱 등록
  • Application 클래스 onCreate에서 Lifecycle 콜백 등록

build.gradle

dependencies {
  implementation "com.braze:android-sdk-ui:32.1.0"
}

권장 최신 SDK를 32.1.0+ 등으로 동적으로 참조하기보다, 고정 버전을 명시해 사용하세요. SDK는 6개월 주기로 버전 업데이트·호환성 검토를 권장드립니다.

braze.xml

<?xml version="1.0" encoding="utf-8"?>
<resources>
  <string name="com_braze_api_key">YOUR_APP_IDENTIFIER_API_KEY</string>
  <string translatable="false" name="com_braze_custom_endpoint">YOUR_CUSTOM_ENDPOINT_OR_CLUSTER</string>
</resources>

Application class

class MyApplication : Application() {
  override fun onCreate() {
    super.onCreate()
    registerActivityLifecycleCallbacks(
      BrazeActivityLifecycleCallbackListener(
        sessionHandlingEnabled,
        inAppMessagingRegistrationEnabled
      )
    )
  }
}

sessionHandlingEnabled: 기본 trueonActivityStarted / onActivityStopped에서 세션 처리.

inAppMessagingRegistrationEnabled: 인앱 메시지 자동 등록 시 true. 인앱 차단 Activity 목록이 있으면 오버로드 생성자를 사용하세요.

External ID

Braze에 연동하면 SDK 초기화 시 anonymous device ID가 생성됩니다. 로그인 시점에는 고객사 고유 식별자를 External ID로 설정합니다.

중요: 로그인 식별자는 고객사 보안 정책에 맞게 설정하며, 국내 보안 정책상 일방향 암호화 적재를 권장합니다.

Braze.getInstance(context).changeUser("고객사 고유 식별자")

Event

Braze SDK로 Custom Event를 전송합니다. 이벤트명만 또는 BrazeProperties와 함께 속성을 전달할 수 있습니다.

이벤트명만

Braze.getInstance(context).logCustomEvent("기획서에 정의된 이벤트명")

이벤트 + 속성 (String / Number / Boolean)

Braze.getInstance(context).logCustomEvent(
  "기획서에 정의된 이벤트명",
  BrazeProperties(JSONObject().put("이벤트 속성명", "이벤트 속성값"))
)
Braze.getInstance(context).logCustomEvent(
  "기획서에 정의된 이벤트명",
  BrazeProperties(JSONObject().put("이벤트 속성명", 42))
)

Array · Nested Object

Braze.getInstance(context).logCustomEvent(
  "기획서에 정의된 이벤트명",
  BrazeProperties(
    JSONObject().put("이벤트 속성명", JSONArray().put("값1").put("값2"))
  )
)

즉시 전송

Braze SDK는 배치성으로 전송되기 때문에 민감성 데이터는 requestImmediateDataFlush()를 호출해 실시간으로 전송되도록 구성합니다.

Braze.getInstance(context).requestImmediateDataFlush()

Standard Attribute

Braze가 정의한 사용자 속성입니다. currentUser로 이름, 성별, 전화번호, 생년월일 등을 설정합니다.

이름 설정

Braze.getInstance(context).currentUser?.setFirstName("사용자 이름")

성별 설정

Braze.getInstance(context).currentUser?.setGender(Gender.MALE)

전화번호 설정

Braze.getInstance(context).currentUser?.setPhoneNumber("+821012345678")

전화번호는 국가번호 형식(예: +821012345678)으로 업로드해야 합니다. 010 등 로컬 형식은 사용하지 마세요.

생년월일 설정

Braze.getInstance(context).currentUser?.setDateOfBirth(2010, Month.JANUARY, 1)

즉시 전송

Braze SDK는 배치성으로 전송되기 때문에 민감성 데이터는 requestImmediateDataFlush()를 호출해 실시간으로 전송되도록 구성합니다.

Braze.getInstance(context).requestImmediateDataFlush()

Custom Attribute

고객사 정의 사용자 속성입니다. String, Number, Boolean, Date(ISO-8601), Array 등 타입별 API가 다릅니다.

String

Braze.getInstance(context).currentUser?.setCustomUserAttribute("속성 키", "속성 값")

Number

Braze.getInstance(context).currentUser?.setCustomUserAttribute("속성 키", 42)
Braze.getInstance(context).currentUser?.incrementCustomUserAttribute("속성 키", 1)

Boolean

Braze.getInstance(context).currentUser?.setCustomUserAttribute("속성 키", true)

Date (ISO-8601)

Date 형태 속성에 년·월·일만 전달하면 문자열로 인식될 수 있습니다. Braze에는 ISO-8601 형식(예: 2013-07-16T19:20:30+09:00)으로 업데이트하세요.

Braze.getInstance(context).currentUser?.setCustomUserAttribute(
  "속성 키", "2013-07-16T19:20:30+09:00"
)

Array

고객 이력 정보(예: 검색·구매 이력)를 활용한 개인화 코드 목적으로 사용됩니다. 이러한 이력 정보가 DB에 없는 값이라면 Add/Remove 함수만 사용하여 이력 정보를 최신화하도록 구성합니다.

Braze.getInstance(context).currentUser?.setCustomAttributeArray(
  "속성 키", arrayOf("값1", "값2")
)
Braze.getInstance(context).currentUser?.addToCustomAttributeArray("속성 키", "추가 값")
Braze.getInstance(context).currentUser?.removeFromCustomAttributeArray("속성 키", "제거 값")

속성 삭제

Braze.getInstance(context).currentUser?.unsetCustomUserAttribute("속성 키")

즉시 전송

Braze SDK는 배치성으로 전송되기 때문에 민감성 데이터는 requestImmediateDataFlush()를 호출해 실시간으로 전송되도록 구성합니다.

Braze.getInstance(context).requestImmediateDataFlush()

Purchase

Purchase event (Legacy)

!
중요 — 신규 고객사에는 Purchase event(레거시) 사용을 안내하지 마세요.

Braze 공식 문서 기준으로 레거시 Purchase event는 maintenance mode로 전환되었고, 신규 기능은 eCommerce Recommended Event 기반으로 제공됩니다. 신규 고객사는 eCommerce Recommended Event 사용을 권장합니다.

logPurchase로 구매 이벤트를 전송합니다. 상품 ID, 통화, 가격, 수량 및 Purchase Property를 지정할 수 있습니다.

기본 구매

Braze.getInstance(context).logPurchase(
  productId = "product_id",
  currencyCode = "USD",
  price = BigDecimal("9.99"),
  quantity = 1
)

구매 속성 포함

val purchaseProperties = BrazeProperties()
purchaseProperties.addProperty("기획서 속성명", "값")
Braze.getInstance(context).logPurchase(
  productId = "product_id",
  currencyCode = "USD",
  price = BigDecimal("9.99"),
  quantity = 1,
  purchaseProperties
)

Push

Android는 FCM으로 Braze Push를 연동합니다. Firebase 프로젝트·Sender ID·Braze 대시보드 Android 푸시 설정이 필요합니다.

Build.gradle — Firebase

implementation "com.google.firebase:firebase-messaging:${FIREBASE_PUSH_MESSAGING_VERSION}"

braze.xml — FCM

<bool translatable="false" name="com_braze_firebase_cloud_messaging_registration_enabled">true</bool>
<string translatable="false" name="com_braze_firebase_cloud_messaging_sender_id">your_fcm_sender_id</string>

BrazeConfig (코드)

val brazeConfig = BrazeConfig.Builder()
  .setIsFirebaseCloudMessagingRegistrationEnabled(true)
  .setFirebaseCloudMessagingSenderIdKey("YOUR FIREBASE SENDER ID")
  .build()
Braze.configure(this, brazeConfig)

FirebaseMessagingService

class MyFirebaseMessagingService : FirebaseMessagingService() {
  override fun onMessageReceived(remoteMessage: RemoteMessage) {
    super.onMessageReceived(remoteMessage)
    if (BrazeFirebaseMessagingService.handleBrazeRemoteMessage(this, remoteMessage)) {
      // Braze 푸시 처리됨
    }
  }
}

알림 아이콘 · 딥링크 (braze.xml)

<drawable name="com_braze_push_small_notification_icon">@drawable/your_icon</drawable>
<bool name="com_braze_handle_push_deep_links_automatically">true</bool>

In-App Message

Modal, Slide, Full, Custom HTML, Simple Survey 등 유형이 있으며, Application 수준에서 Lifecycle 콜백으로 표시됩니다.

val inAppMessageBlocklist = HashSet<Class<*>>()
inAppMessageBlocklist.add(SplashActivity::class.java)
registerActivityLifecycleCallbacks(
  BrazeActivityLifecycleCallbackListener(inAppMessageBlocklist)
)

특정 화면에서 인앱을 막을 Activity를 blocklist에 추가합니다.

하이브리드

WebView에서는 WEB SDK 대신 네이티브 브릿지로 Custom Event·Custom Attribute를 전달합니다.

아래 코드는 고객사 이해를 돕기 위한 예시입니다. 자체적으로 사용 중인 인터페이스 코드를 활용해 운영하셔도 됩니다.

WebView — Custom Event (예시)

function sendEventToNative(eventName, interfaceData) {
  try {
    interfaceData["EventName"] = eventName;
    var ua = navigator.userAgent;
    if (ua.indexOf("BrazeAndroid") > -1) NativeBridge.trackingEvent(interfaceData);
    else if (ua.indexOf("BrazeiOS") > -1)
      webkit.messageHandlers.NativeCallback.postMessage(interfaceData);
  } catch (e) { console.log("Hybrid Error : " + e); }
}

Native — JavascriptInterface (예시)

class JsObject(private val mContext: Context) {
  @JavascriptInterface
  fun trackingEvent(`object`: JSONObject?) {
    if (`object` == null) return
    val ename = `object`.getString("EventName")
    `object`.remove("EventName")
    Braze.getInstance(mContext).logCustomEvent(ename, BrazeProperties(`object`))
    Braze.getInstance(mContext).requestImmediateDataFlush()
  }
}
webview.settings.javaScriptEnabled = true
webview.addJavascriptInterface(JsObject(context), "NativeBridge")

WebView — Custom Attribute (예시)

function sendAttrToNative(customObject) {
  try {
    var ua = navigator.userAgent;
    if (ua.indexOf("BrazeAndroid") > -1) NativeBridge.trackingAttr(customObject);
    else if (ua.indexOf("BrazeiOS") > -1) {
      customObject["EventName"] = "customAttribute";
      webkit.messageHandlers.NativeCallback.postMessage(customObject);
    }
  } catch (e) { console.log("Hybrid Error : " + e); }
}

Native — Attribute 수신 (예시)

@JavascriptInterface
fun trackingAttr(`object`: JSONObject?) {
  val keys = `object`?.keys() ?: return
  while (keys.hasNext()) {
    val key = keys.next()
    val value = `object`.get(key)
    Braze.getInstance(mContext).currentUser
      ?.setCustomUserAttribute(key, value)
  }
  Braze.getInstance(mContext).requestImmediateDataFlush()
}

태깅 예시

Custom Event — 로그인 완료

if (로그인) {
  Braze.getInstance(context).changeUser("고객사 고유 식별자")
}
Braze.getInstance(context).logCustomEvent(
  "로그인 완료",
  BrazeProperties(JSONObject()
    .put("event_name", "로그인 완료")
    .put("event_time", "2024-07-04T13:00:00")
    .put("loginyn", true)
    .put("platform", "Android"))
)
Braze.getInstance(context).requestImmediateDataFlush()

Custom Event & Custom Attribute — 검색

Braze.getInstance(context).currentUser?.addToCustomAttributeArray(
  "searchkeyword", "id_1710805494/biztype_REV/항공권_국제 ~"
)
Braze.getInstance(context).logCustomEvent("검색", BrazeProperties(/* 속성 */))
Braze.getInstance(context).requestImmediateDataFlush()

이벤트명·속성명·키/값은 텍소노미 기획 문서로 교체하세요.

Push 추가 설정

HTML 렌더링 푸시

<bool name="com_braze_push_notification_html_rendering_enabled">true</bool>

val brazeConfig = BrazeConfig.Builder()
  .setPushHtmlRenderingEnabled(true)
  .build()

푸시 이벤트 구독

Braze.getInstance(context).subscribeToPushNotificationEvents { event ->
  val payload = event.notificationPayload
  val isOpen = event.eventType == BrazePushEventType.NOTIFICATION_OPENED
  val deeplink = payload.deeplink
  val kvp = payload.brazeExtras.getString("my first kvp")
}

In-App 핸들러

인앱 표시 전·버튼 클릭 시 커스텀 처리가 가능합니다.

override fun beforeInAppMessageDisplayed(inAppMessage: IInAppMessage): InAppMessageOperation {
  return InAppMessageOperation.DISPLAY_NOW
}

override fun onInAppMessageButtonClicked(
  inAppMessage: IInAppMessage,
  button: MessageButton
): Boolean {
  return true
}

트리거 최소 간격

val brazeConfig = BrazeConfig.Builder()
  .setTriggerActionMinimumTimeIntervalSeconds(30)
  .build()
Braze.configure(this, brazeConfig)

SDK 로직상 피로도 방지를 위해, 기본적으로 인앱 노출 이후 30초 동안 다른 인앱 메시지 이벤트가 트리거되어도 노출되지 않습니다. 필요 시 위 설정으로 최소 간격을 조정할 수 있습니다.

SDK 세션 시간

세션 타임아웃 기본값: Android 약 10초, iOS 약 2~3초. 서비스에 맞게 조정할 수 있습니다.

val brazeConfig = BrazeConfig.Builder()
  .setSessionTimeout(60)
  .build()
Braze.configure(this, brazeConfig)

연동 체크리스트

  • 대시보드 Android 앱 · API Key · Endpoint
  • build.gradle · braze.xml · Application Lifecycle
  • 로그인 시 changeUser(External ID)
  • FCM · FirebaseMessagingService · 알림 아이콘
  • 하이브리드 WebView — WEB SDK 이중 초기화 없이 네이티브 브릿지(인터페이스 코드)
  • 대시보드 User Search · Custom Event 수신 확인