이 페이지에서: Handlebars 반복 구문을 사용하여 이벤트, 사용자 지정 작업 응답 및 데이터 집합 조회 같은 컨텍스트 데이터 원본에서 배열을 반복하여 메시지에 동적 목록을 표시하는 방법에 대해 알아봅니다.
Handlebars 반복 구문을 사용하여 이벤트, 사용자 지정 작업 응답 및 기타 상황별 데이터를 포함하여 메시지에 있는 다양한 소스의 동적 데이터 목록을 표시하는 방법에 대해 알아봅니다.
개요 overview
Journey Optimizer에서는 메시지 개인화 동안 여러 소스의 컨텍스트 데이터에 액세스할 수 있습니다. 기본 채널(email, push, SMS)의 Handlebars 구문을 사용하여 이러한 원본에서 배열을 반복하여 제품 목록, 권장 사항 또는 기타 반복 요소와 같은 동적 콘텐츠를 표시할 수 있습니다.
사용 가능한 컨텍스트 원본:
- 이벤트: 여정 이벤트(비즈니스 이벤트, 단일 이벤트)의 데이터
- 사용자 지정 작업 응답: 사용자 지정 작업을 통해 외부 API 호출에서 반환된 데이터입니다
- 데이터 세트 조회: Adobe Experience Platform 데이터 세트에서 검색된 보강된 데이터
- 기술 속성: 여정 ID 및 보조 식별자와 같은 여정 메타데이터
- 여정 컨텍스트: 실행 중에 액세스할 수 있는 기타 여정 관련 데이터
- 오케스트레이션된 캠페인 데이터 보강 컬렉션(오케스트레이션된 캠페인만 해당): 오케스트레이션된 캠페인에 개인화 추가를 참조하십시오.
이 안내서에서는 메시지의 각 소스에서 배열을 반복하는 방법과 여정 활동을 구성할 때 배열을 사용하는 방법을 보여 줍니다. 메시지 개인화 기본 사항을 이해하려면 Handlebars 반복 구문으로 시작하거나, 사용자 지정 작업 및 데이터 세트 조회에 배열 데이터를 전달하는 방법을 알아보려면 여정 식에서 배열 작업으로 이동하십시오.
Handlebars 반복 구문 syntax
Handlebars는 배열을 반복하도록 {{#each}} helper을(를) 제공합니다. 기본 구문은 입니다.
주요 사항:
arrayPath을(를) 배열 데이터의 경로로 바꿉니다.item을(를) 원하는 변수 이름으로 바꾸십시오(예:product,response,element).{{item.propertyName}}을(를) 사용하여 각 항목의 속성에 액세스- 다중 수준 배열에 대해 여러
{{#each}}블록을 중첩할 수 있습니다.
이벤트 데이터 반복 event-data
이벤트 데이터는 여정이 event에 의해 트리거될 때 사용할 수 있습니다. 장바구니 콘텐츠, 주문 항목 또는 양식 제출과 같이, 여정이 시작된 시점에 캡처된 데이터를 표시하는 데 유용합니다.
이벤트에 대한 컨텍스트 경로
<event_ID>: 여정에 구성된 이벤트의 고유 ID<fieldPath>: 이벤트 스키마 내의 필드 또는 배열에 대한 경로
1697323153) 식 경로에서 백틱(`)으로 래핑합니다. 백틱이 없으면 PQL 파서에서 구문 오류가 발생합니다.| code language-handlebars |
|---|
|
예: 이벤트의 장바구니 항목
이벤트 스키마에 productListItems 배열(표준 XDM 형식)이 포함된 경우 아래 샘플에 자세히 설명된 대로 장바구니 콘텐츠를 표시할 수 있습니다.
| code language-handlebars |
|---|
|
예: 이벤트의 중첩된 배열
중첩된 구조의 경우 중첩된 {{#each}} 블록을 사용합니다.
| code language-handlebars |
|---|
|
모범 사례의 중첩에 대해 자세히 알아보세요.
사용자 지정 작업 응답 반복 custom-action-responses
사용자 지정 작업 응답에는 외부 API 호출에서 반환된 데이터가 포함되어 있습니다. 충성도 포인트, 제품 권장 사항, 재고 상태 또는 개인화된 오퍼와 같은 시스템의 실시간 정보를 표시하는 데 유용합니다.
사용자 지정 작업에 대한 컨텍스트 경로
<actionName>: 여정에 구성된 사용자 지정 작업의 이름<fieldPath>: 응답 페이로드 내의 필드 또는 배열에 대한 경로
예: API의 제품 권장 사항
사용자 지정 작업에서 반환된 제품 권장 사항을 반복하여 메시지에 개별 카드로 표시하려면 아래 예를 참조하십시오.
API 응답:
| code language-json |
|---|
|
메시지 개인화:
| code language-handlebars |
|---|
|
예: 사용자 지정 작업의 중첩된 배열
중첩된 배열(각 오브젝트에 다른 배열이 포함된 오브젝트 배열)이 포함된 사용자 지정 작업 응답을 반복하려면 아래 예를 참조하십시오. 중첩 {{#each}} 루프를 사용하여 여러 수준의 데이터에 액세스하는 방법을 보여 줍니다.
API 응답:
| code language-json |
|---|
|
메시지 개인화:
| code language-handlebars |
|---|
|
더 복잡한 중첩 패턴은 모범 사례를 참조하세요.
예: 충성도 계층의 이점
충성도 상태에 따라 동적 이점을 표시하려면 아래 예를 참조하십시오.
API 응답:
| code language-json |
|---|
|
메시지 개인화:
| code language-handlebars |
|---|
|
데이터 세트 조회 결과 반복 dataset-lookup
데이터 세트 조회 활동을 사용하면 여정 런타임 동안 Adobe Experience Platform 데이터 세트에서 데이터를 검색할 수 있습니다. 보강된 데이터는 배열로 저장되며 메시지에서 반복될 수 있습니다.
이 섹션에서 데이터 집합 조회 활동을 구성하는 방법에 대해 자세히 알아보세요. 데이터 집합 조회는 이벤트 데이터와 결합할 때 특히 유용합니다. 실제 사용 사례는 예: 데이터 집합 조회로 보강된 이벤트 데이터를 참조하십시오.
데이터 세트 조회를 위한 컨텍스트 경로
<activityID>: 데이터 세트 조회 활동의 고유 IDentities: 데이터 집합에서 검색된 보강된 데이터의 배열
예: 데이터 세트의 제품 세부 정보
데이터 세트 조회 활동을 사용하여 SKU를 기반으로 제품 정보를 검색하는 경우 아래 샘플을 참조하십시오.
데이터 집합 조회 구성:
- 조회 키:
list(@event{purchase_event.products.sku}) - 반환할 필드:
["SKU", "category", "price", "name"]
메시지 개인화:
| code language-handlebars |
|---|
|
예: 데이터 세트 데이터를 사용하여 필터링된 반복
반복 중 데이터 집합 조회 결과를 필터링하고 특정 기준과 일치하는 항목(예: 특정 범주의 제품)만 표시하려면 {{#each}} 루프 내에서 조건부 {{#if}} 문을 사용하십시오. 아래 예를 참조하십시오.
| code language-handlebars |
|---|
|
모범 사례에서 조건부 필터링에 대해 자세히 알아보세요.
예: 데이터 세트 조회에서 합계 계산
데이터 세트 조회 결과를 반복하면서 합계를 계산하고 표시하려면 아래 예를 참조하십시오.
| code language-handlebars |
|---|
|
여정 기술 속성 사용 technical-properties
여정 기술 속성은 여정 ID 및 보조 식별자와 같은 여정 실행에 대한 메타데이터에 대한 액세스를 제공합니다. 이러한 기능은 특히 특정 여정 인스턴스를 기반으로 하는 배열 필터링에 대해 반복 패턴과 결합할 때 유용할 수 있습니다.
사용 가능한 기술 속성
예: 보조 식별자를 사용하여 배열 항목 필터링
배열이 있는 이벤트 트리거 여정에서 보조 식별자를 사용할 때 현재 여정 인스턴스에 대한 관련 항목만 표시하도록 필터링할 수 있습니다. 이 안내서에서 보조 식별자에 대해 자세히 알아보세요.
시나리오: 여정이 여러 예약으로 트리거되었지만 이 여정 인스턴스를 트리거한 특정 예약(보조 ID로 식별됨)에 대한 정보만 표시하려고 합니다.
| code language-handlebars |
|---|
|
예: 추적할 여정 ID 포함
추적을 위해 메시지에 여정 ID를 포함하려면 아래 예를 참조하십시오.
| code language-handlebars |
|---|
|
여러 컨텍스트 소스 결합 combine-sources
동일한 메시지에 다른 소스의 데이터를 결합하여 풍부하고 개인화된 경험을 만들 수 있습니다. 이 섹션에서는 여러 컨텍스트 소스를 함께 사용하는 실제 예를 보여줍니다.
결합할 수 있는 컨텍스트 원본:
예: 실시간 재고가 있는 장바구니 항목
이벤트 데이터(장바구니 컨텐츠)를 사용자 지정 작업 데이터(인벤토리 상태)와 결합하려면 아래 샘플을 보십시오.
| code language-handlebars |
|---|
|
예: 데이터 세트 조회로 보강된 이벤트 데이터
이벤트 SKU를 데이터 집합 조회의 자세한 제품 정보와 결합하려면 아래 샘플을 참조하세요.
| code language-handlebars |
|---|
|
예: 여러 소스를 기술 속성과 결합
여러 컨텍스트 소스(프로필 데이터, 이벤트 데이터, 사용자 지정 작업 및 기술 속성)를 단일 메시지로 결합하려면 아래 샘플을 참조하십시오.
| code language-handlebars |
|---|
|
기타 컨텍스트 유형 other-contexts
이 안내서는 배열 상에서의 반복에 중점을 두고 있지만, 일반적으로 반복이 필요하지 않은 개인화에는 다른 컨텍스트 유형을 사용할 수 있습니다. 루프가 아닌 직접 액세스합니다.
완벽한 개인화 구문 및 이러한 소스를 사용한 예는 다음을 참조하십시오.
여정 표현식에서 배열 작업 arrays-in-journeys
이전 섹션은 Handlebars를 사용한 메시지 개인화에서 배열을 반복하는 데 중점을 두고 있지만 여정 활동을 구성할 때도 배열에서 작업합니다. 이 섹션에서는 특히 사용자 지정 작업에 데이터를 전달하거나 데이터 세트 조회가 있는 배열을 사용할 때 여정 표현식의 이벤트에서 배열 데이터를 사용하는 방법을 설명합니다.
first, all, serializeList 등의 함수와 함께 여정 표현식 편집기를 사용합니다. 메시지 콘텐츠에서 {{#each}} 루프가 있는 Handlebars 구문을 사용합니다.사용자 지정 작업 매개 변수에 배열 값 전달 arrays-to-custom-actions
사용자 지정 작업을 구성할 때 종종 이벤트 배열에서 값을 추출하여 매개 변수로 전달해야 합니다. 이 섹션에서는 일반적인 패턴을 다룹니다.
사용자 지정 작업 매개 변수에 컬렉션 전달에 대해 자세히 알아보세요.
배열에서 단일 값 추출
사용 사례: GET 요청에서 쿼리 매개 변수로 전달할 이벤트 배열에서 특정 필드를 가져옵니다.
예제 시나리오: 제품 목록에서 가격이 0보다 큰 첫 번째 SKU를 추출합니다.
이벤트 스키마 예:
| code language-json |
|---|
|
사용자 지정 작업 구성:
- 사용자 지정 작업에서
string형식의 쿼리 매개 변수(예:sku)를 구성합니다. - 동적 값을 허용하도록
Variable(으)로 표시
작업 매개 변수의 여정 식:
| code language-javascript |
|---|
|
설명:
@event{YourEventName}: 여정 이벤트를 참조합니다..first(currentEventField.condition): 조건과 일치하는 첫 번째 배열 항목을 반환합니다.currentEventField: 반복하는 이벤트 배열의 각 항목을 나타냅니다..SKU: 일치하는 항목에서 SKU 필드 추출- 결과:
"SKU-1"(작업 매개 변수에 적합한 문자열)
컬렉션 관리 함수에서 first 함수에 대해 자세히 알아보세요.
배열에서 값 목록 작성
사용 사례: 쿼리 매개 변수로 전달할 쉼표로 구분된 ID 목록을 만듭니다(예: /products?ids=sku1,sku2,sku3).
사용자 지정 작업 구성:
- 형식이
string인 쿼리 매개 변수(예:ids) 구성 Variable(으)로 표시
여정 식:
| code language-javascript |
|---|
|
설명:
-
.all(currentEventField.condition): 조건과 일치하는 모든 배열 항목을 반환합니다(목록 반환). -
currentEventField: 반복하는 이벤트 배열의 각 항목을 나타냅니다. -
.SKU: SKU 값만 포함하도록 목록을 빌드합니다. -
serializeList(list, delimiter, addQuotes): 목록을 문자열에 조인",": 구분 기호로 쉼표 사용true: 각 문자열 요소 주위에 따옴표 추가
-
결과:
"SKU-1,SKU-3"(쿼리 매개 변수에 적합)
자세히 알아보기:
사용자 지정 작업에 대한 컬렉션 처리는 사용자 지정 작업 매개 변수에 컬렉션 전달에서 다룹니다.
사용자 지정 작업에 오브젝트 배열 전달
사용 사례: 요청 본문에 전체 개체 배열을 보냅니다(본문이 있는 POST 또는 GET용).
요청 본문 예:
| code language-json |
|---|
|
사용자 지정 작업 구성:
- 요청 본문에서
products을(를)listObject유형으로 정의합니다. Variable(으)로 표시- 개체 필드
id,name,price,color을(를) 정의합니다(각각 매핑 가능함).
여정 캔버스 구성:
-
고급 모드에서 컬렉션 표현식을 설정합니다.
code language-javascript @event{YourEventName.commerce.productListItems.all(currentEventField.priceTotal > 0)} -
컬렉션 매핑 UI에서:
id→productListItems.SKU매핑name→productListItems.name매핑price→productListItems.priceTotal매핑color→productListItems.color매핑
Journey Optimizer은 작업 페이로드 구조와 일치하는 오브젝트의 배열을 구성합니다.
| note |
|---|
| NOTE |
이벤트 배열을 사용하여 작업할 때 currentEventField을(를) 사용하여 각 항목을 참조합니다. 데이터 원본 컬렉션(Adobe Experience Platform)의 경우 currentDataPackField을(를) 사용합니다. 사용자 지정 작업 응답 컬렉션의 경우 currentActionField을(를) 사용하십시오. |
사용자 지정 작업 매개 변수에 컬렉션 전달에서 자세히 알아보세요.
데이터 세트 조회를 사용하여 배열 사용 arrays-with-dataset-lookup
데이터 집합 조회 활동을 사용할 때 값 배열을 조회 키로 전달하여 보강된 데이터를 검색할 수 있습니다.
예: 이벤트 배열의 모든 SKU에 대한 제품 세부 정보를 조회합니다.
데이터 집합 조회 구성:
조회 키 필드에서 list()을(를) 사용하여 배열 경로를 목록으로 변환합니다.
| code language-javascript |
|---|
|
이렇게 하면 데이터 세트에서 조회할 모든 SKU 값 목록이 만들어집니다. 결과는 메시지에서 반복할 수 있는 배열로 context.journey.datasetLookup.<activityID>.entities에 사용할 수 있습니다(데이터 집합 조회 결과 반복 참조).
제한 사항 및 패턴 array-limitations
여정에서 배열을 사용하여 작업할 때 다음 제한 사항에 유의하십시오.
여정 플로우에서 스토리지에 대한 동적 루핑 없음
여정은 배열의 각 항목에 대해 하나의 작업 노드가 여러 번 실행되는 동적 루프를 만들 수 없습니다. 이는 폭주하는 성능 문제를 방지하기 위한 의도입니다.
수행할 수 없는 작업:
- 배열 항목당 사용자 지정 작업을 동적으로 한 번 실행
- 배열 길이에 따라 여러 여정 분기 만들기
대신 권장 패턴:
-
한 번에 모든 항목 보내기: 전체 배열 또는 serialize된 목록을 모든 항목을 처리하는 단일 사용자 지정 작업에 전달합니다. 배열에서 값 목록 만들기를 참조하십시오.
-
외부 집계 사용: 외부 API에서 여러 ID를 수락하고 결합된 결과를 한 번의 호출로 반환하도록 합니다.
-
AEP에서 미리 계산: 계산된 특성을 사용하여 프로필 수준에서 배열의 값을 미리 계산합니다.
-
단일 값 추출: 하나의 값만 필요한 경우
first또는head을(를) 사용하여 추출하십시오. 배열에서 단일 값 추출을 참조하십시오.
자세한 내용은 보호 기능 및 제한 사항을 참조하세요.
어레이 크기 고려 사항
대용량 스토리지는 여정 성능에 영향을 미칠 수 있습니다.
- 이벤트 배열: 총 50KB 미만의 이벤트 페이로드를 유지합니다.
- 사용자 지정 작업 응답: 응답 페이로드는 100KB 미만이어야 합니다.
- 데이터 집합 조회 결과: 조회 키 및 반환된 엔터티의 수를 제한합니다.
전체 예: 사용자 지정 작업에 대한 이벤트 배열 complete-example
다음은 사용자 지정 작업으로 이벤트 배열을 사용하는 방법을 보여 주는 전체 워크플로우입니다.
시나리오: 사용자가 장바구니를 중단하면 장바구니 데이터를 외부 추천 API로 전송하여 개인화된 제안을 받은 다음 전자 메일에 표시하십시오.
1단계: 사용자 지정 작업 구성
사용자 지정 작업 "GetCartRecommendations"를 만듭니다.
- 메서드: POST
- URL:
https://api.example.com/recommendations - 요청 본문:
| code language-json |
|---|
|
cartItems을(를)listObject및Variable유형으로 표시- 필드 정의:
sku(문자열),price(숫자),quantity(정수)
사용자 지정 작업 구성에서 자세히 알아보세요.
2단계: 응답 페이로드 구성
사용자 지정 작업에서 응답을 구성합니다.
| code language-json |
|---|
|
API 호출 응답 사용에서 자세히 알아보세요.
3단계: 여정에서 작업을 전송함
-
장바구니 포기 이벤트 후에 사용자 지정 작업을 추가합니다.
-
cartItems컬렉션의 고급 모드에서 다음을 수행합니다.code language-javascript @event{cartAbandonment.commerce.productListItems.all(currentEventField.quantity > 0)} -
컬렉션 필드를 매핑합니다.
sku→productListItems.SKUprice→productListItems.priceTotalquantity→productListItems.quantity
4단계: 전자 메일에 있는 응답 사용
이메일 콘텐츠에서 권장 사항을 반복합니다.
| code language-handlebars |
|---|
|
5단계: 구성을 테스트합니다
라이브 여정을 실행하기 전에 작업 구성에서 “테스트 요청 보내기” 기능을 사용하여 사용자 지정 작업을 테스트하여 빌드된 요청 및 값을 확인합니다.
- 여정 테스트 모드 사용
productListItems배열을 포함하는 샘플 이벤트 데이터로 트리거- 사용자 지정 작업에서 올바른 배열 구조를 수신하는지 확인합니다.
- 작업 테스트 로그 확인
- 이메일을 미리 확인하여 두 스토리지가 올바르게 표시되는지 확인
사용자 지정 작업 문제 해결에서 자세히 알아보세요.
모범 사례 best-practices
컨텍스트 기반 데이터를 반복하여 유지 관리가 가능하고 성능이 좋은 개인화를 만들 때 다음 모범 사례를 따르십시오.
설명 변수 이름 사용
반복하고 있는 내용을 명확하게 나타내는 변수 이름을 선택하십시오. 이렇게 하면 코드를 보다 읽기 쉽고 유지 관리하기 쉽습니다. 개인화 구문에 대해 자세히 알아보기:
| code language-handlebars |
|---|
|
루프의 표현식 조각
{{#each}} 루프 내에서 표현식 조각을(를) 사용하는 경우 루프 범위 변수를 조각 매개 변수로 전달할 수 없습니다. 하지만 조각은 조각 외부의 메시지 콘텐츠에 정의된 전역 변수에 액세스할 수 있습니다.
지원되는 패턴 - 전역 변수 사용:
| code language-handlebars |
|---|
|
조각은 메시지에 전역적으로 정의되어 있으므로 globalDiscount을(를) 참조할 수 있습니다.
지원되지 않음 - 루프 변수 전달:
| code language-handlebars |
|---|
|
해결 방법: 조각을 사용하지 않고 루프에 직접 개인화 논리를 포함하거나 루프 외부에서 조각을 호출합니다.
자세한 예제와 추가 해결 방법을 포함하여 루프 내에서 식 조각 사용에 대해 자세히 알아보세요.
빈 배열 처리
배열이 비어 있을 때 대체 콘텐츠를 제공하려면 {{else}} 절을 사용하십시오. 도우미 함수에 대해 자세히 알아보세요.
| code language-handlebars |
|---|
|
조건부 도우미와 결합
조건부 콘텐츠에 대해 루프 내에서 {{#if}}을(를) 사용합니다. 조건부 규칙에 대해 자세히 알아보고 사용자 지정 작업 응답 및 데이터 집합 조회 섹션에서 예제를 참조하십시오.
| code language-handlebars |
|---|
|
성능에 대한 반복 제한
대용량 배열의 경우 반복 횟수를 제한하는 것이 좋습니다.
| code language-handlebars |
|---|
|
배열 메타데이터 액세스
Handlebars는 고급 반복 패턴에 도움이 되는 루프 내의 특수 변수를 제공합니다.
@index: 현재 반복 인덱스(0 기반)@first: 첫 번째 반복에 대해 True@last: 마지막 반복에 대해 True
| code language-handlebars |
|---|
|
@index, @first, @last)는 메시지 개인화의 {{#each}} 루프 내에서만 사용할 수 있습니다. 여정 식에서 배열을 사용하여 작업하려면(예: 사용자 지정 작업으로 전달하기 전에 배열에서 첫 번째 항목을 가져오는 경우) head, first 또는 all과(와) 같은 배열 함수를 사용합니다. 자세한 내용은 여정 식에서 배열 작업을 참조하십시오.문제 해결 troubleshooting
반복에 문제가 있습니까? 이 섹션에서는 일반적인 문제와 해결 방법을 다룹니다.
배열이 표시되지 않음
문제: 배열 반복에 콘텐츠가 표시되지 않습니다.
가능한 원인 및 해결 방법:
-
잘못된 경로: 컨텍스트 원본을 기준으로 배열에 대한 정확한 경로를 확인하십시오.
-
배열이 비어 있음: 배열에 데이터가 없는지 확인하려면
{{else}}절을 추가하십시오. 예제는 모범 사례를 참조하세요. -
아직 데이터를 사용할 수 없음: 여정 흐름에서 메시지 활동 전에 사용자 지정 작업, 이벤트 또는 데이터 집합 조회 활동이 실행되었는지 확인하십시오.
구문 오류
문제: 식 유효성 검사가 실패하거나 메시지가 렌더링되지 않습니다.
일반적인 실수:
- 닫는 태그가 없습니다.
{{#each}}마다{{/each}}이(가) 있어야 합니다. 올바른 구조를 보려면 Handlebars 반복 구문을 검토하십시오. - 잘못된 변수 이름: 블록 전체에서 변수 이름이 일관되게 사용되도록 합니다. 명명 규칙에 대해서는 모범 사례를 참조하십시오.
- 잘못된 경로 구분 기호: 슬래시나 다른 문자를 사용하지 않는 점(
.)을 사용합니다.
루프에서 표현식 조각이 작동하지 않음
문제: 식 조각이 {{#each}} 루프 내에서 사용될 때 필요한 콘텐츠를 표시하지 않거나 비어 있거나 예기치 않은 출력을 표시합니다.
가능한 원인 및 해결 방법:
-
루프 변수를 매개 변수로 전달하려고 합니다: 식 조각은 루프 범위 변수(현재 반복 항목 등)를 매개 변수로 받을 수 없습니다. 이는 알려진 제한 사항입니다.
솔루션: 다음 해결 방법 중 하나를 사용하십시오.
- 조각이 액세스할 수 있는 메시지에 전역 변수 정의
- 조각을 사용하는 대신 루프에 직접 개인화 논리 포함
- 루프별 데이터가 필요하지 않은 경우 루프 외부의 조각을 호출합니다.
-
조각에 사용할 수 없는 매개 변수가 필요합니다: 조각이 특정 입력 매개 변수를 받도록 디자인된 경우 해당 매개 변수를 루프 내에서 전달할 수 없으면 올바르게 작동하지 않습니다.
솔루션: 조각이 액세스할 수 있는 전역 변수를 사용하도록 접근 방식을 재구성하십시오. 예제는 모범 사례 - 루프의 식 조각을 참조하십시오.
-
잘못된 변수 범위: 단편에서 루프 범위 내에만 있는 변수를 참조하려고 할 수 있습니다.
솔루션: 메시지 수준(루프 외부)에서 조각에 필요한 변수를 정의하여 전체적으로 액세스할 수 있도록 합니다.
자세한 설명, 예제 및 권장 패턴을 포함하여 루프 내에서 식 조각을 사용하는 방법에 대해 자세히 알아보세요.
반복 테스트
여정 테스트 모드를 사용하여 반복을 확인하세요. 이는 사용자 지정 작업 또는 데이터 집합 조회를 사용할 때 특히 중요합니다.
- 테스트 모드에서 여정 시작
- 샘플 데이터로 이벤트 또는 사용자 지정 작업 트리거
- 메시지 미리 보기를 확인하여 반복이 올바르게 표시되는지 확인하십시오.
- 테스트 모드 로그에서 오류를 검토합니다(사용자 지정 작업 테스트 모드 로그 참조).
관련 항목 related-topics
Personalization 기본 사항: 개인화 시작 | 개인화 추가 | Personalization 구문 | 도우미 함수 | 조건부 규칙 만들기
여정 구성: 이벤트 정보 | 사용자 지정 작업 구성 | 사용자 지정 작업 매개 변수에 컬렉션 전달 | 사용자 지정 작업에서 API 호출 응답 사용 | 사용자 지정 작업 문제 해결 | 여정에서 Adobe Experience Platform 데이터 사용 | 여정에서 보조 식별자 사용 | 보호 및 제한 사항 | 여정 테스트
여정 식 함수: 고급 식 편집기 | 컬렉션 관리 기능(처음, 모두, 마지막) | 목록 함수(serializeList, filter, sort) | 배열 함수(head, tail)
Personalization 사용 사례: 장바구니 포기 전자 메일 | 주문 상태 알림
메시지 디자인: 이메일 디자인 시작 | 푸시 알림 만들기 | SMS 메시지 만들기 | 콘텐츠 미리 보기 및 테스트
This section contains structured knowledge intended to support interpretation, retrieval, and question answering related to this topic.
For complete understanding, this information should be combined with the documentation on this page. Neither source is intended to stand alone; the page describes the feature, while this section provides additional context that helps disambiguate terminology, intent, applicability, and constraints.
- TL;DR: This page explains how to use Handlebars
{{#each}}syntax to loop over arrays from contextual sources — events, custom action responses, dataset lookups, and technical properties — in message personalization, and how to work with arrays in journey expression syntax when configuring journey activities.
Intents:
- Iterate over event array data (e.g., cart items, order items) in message personalization using
{{#each}} - Iterate over custom action response arrays (e.g., product recommendations) in messages
- Iterate over dataset lookup result arrays in messages
- Combine data from multiple contextual sources in a single personalized message
- Pass array values to custom action parameters using journey expression syntax
- Use arrays as lookup keys in Dataset Lookup activities
- Apply best practices for empty array fallbacks, variable naming, performance, and expression fragment scoping
Glossary:
- Handlebars: A templating language used in Journey Optimizer message personalization for iteration (
{{#each}}) and conditional rendering ({{#if}}). (product-specific) {{#each}}helper: Handlebars syntax for iterating over an array; each iteration exposes the current item via a named variable (e.g.,|product|). (product-specific)- Contextual data: Data available at message send time from journey sources — events, custom action responses, dataset lookups, and journey technical properties — as opposed to static profile attributes. (product-specific)
currentEventField: A reference used in journey expressions (not Handlebars) to refer to each item in an event array during filtering or mapping operations.currentActionField: Used in journey expressions to refer to each item in a custom action response collection.currentDataPackField: Used in journey expressions to refer to each item in a data source collection.serializeList: A journey expression function that converts a list of values into a delimited string (e.g., comma-separated), suitable for use as a query parameter.- Supplemental identifier: A journey-level identifier that distinguishes concurrent journey instances triggered by the same profile; used to filter an array to the item relevant to the current instance.
Guardrails:
- Journeys cannot create dynamic loops where one action node executes multiple times per array item — this is by design to prevent performance issues. Pass the entire array or a serialized list to a single custom action instead.
- Keep event payloads under 50KB total.
- Custom action response payloads should be under 100KB.
- Limit the number of dataset lookup keys and returned entities for performance.
- Expression fragments cannot receive loop-scoped variables (e.g., the current
{{#each}}iteration item) as parameters — this is a known limitation. Use global variables or inline logic instead. - Numeric event IDs must be wrapped in backticks in expression paths (e.g.,
context.journey.events.`1697323153`.fieldName); without backticks, the PQL parser raises a syntax error.
Terminology:
- Canonical name: Handlebars iteration — variants:
{{#each}}loop, each loop, array iteration - Do not confuse: Handlebars
{{#each}}syntax (used in message content for iteration and display) ≠ journey expression syntax (used in journey activity configuration — uses functions likefirst,all,serializeList) - Do not confuse:
currentEventField(journey expressions over event arrays) ≠currentActionField(custom action response collections) ≠currentDataPackField(data source collections) - Do not confuse:
@index/@first/@last(Handlebars special variables, only available within{{#each}}loops in message content) ≠first/headfunctions (journey expression functions for extracting single items, used in journey activity configuration)
FAQ:
- Q: What is the difference between Handlebars syntax and journey expression syntax when working with arrays? — Handlebars
{{#each}}is used in message content for iteration and display. Journey expression syntax — using functions likefirst,all, andserializeList— is used in journey activity configuration (e.g., custom action parameters, conditions). They are distinct syntaxes used in different contexts. - Q: Can I loop a journey action node so it executes once per array item? — No. Journeys cannot create dynamic loops that execute an action node multiple times per item. Instead, pass the entire array or a serialized list to a single custom action that processes all items, or use external aggregation.
- Q: Can I pass the current loop item to an expression fragment inside a
{{#each}}loop? — No. Expression fragments cannot receive loop-scoped variables as parameters. Use global variables defined outside the loop, or include the personalization logic directly within the loop instead of using a fragment. - Q: How do I display fallback content when an array is empty? — Use the
{{else}}clause within the{{#each}}block. Content inside{{else}}is rendered when the array has no items. - Q: What do
@index,@first, and@lastmean inside a{{#each}}loop? — These are special Handlebars variables available only within{{#each}}loops in message content:@indexis the 0-based current iteration index,@firstis true for the first iteration, and@lastis true for the last iteration.