<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>Luka's Salesforce Notes</title>
    <link>https://jt98.tistory.com/</link>
    <description>Salesforce 개발&amp;middot;운영 실무 기록</description>
    <language>ko</language>
    <pubDate>Wed, 21 Oct 2026 01:06:20 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>Luka.dev</managingEditor>
    <image>
      <title>Luka's Salesforce Notes</title>
      <url>https://tistory1.daumcdn.net/tistory/2734557/attach/011707c5b5944820be8e29f7ef3cb45e</url>
      <link>https://jt98.tistory.com</link>
    </image>
    <item>
      <title>Luka MCA Lab 구축기 | 수신 구분 설계와 국내 광고 규정 반영</title>
      <link>https://jt98.tistory.com/45</link>
      <description>&lt;div class=&quot;greeting&quot;&gt;
&lt;p style=&quot;line-height: 1.8 !important; margin: 0 0 0px !important;&quot; data-ke-size=&quot;size16&quot;&gt;안녕하세요, 루카입니다. 오늘은 Luka MCA Lab의 메일을 수신 구분 두 개로 나누고, 이미 받은 동의를 구분마다 가져와 보겠습니다.&lt;/p&gt;
&lt;/div&gt;
&lt;hr data-ke-style=&quot;style5&quot; /&gt;
&lt;div class=&quot;lead-box&quot; style=&quot;background: color-mix(in srgb, var(--brand) 7%, transparent); border-top: 4px solid var(--brand); border-radius: 10px; padding: 18px 24px 16px; margin: 8px 0 28px;&quot;&gt;
&lt;p style=&quot;font-size: 20px !important; font-weight: bold; line-height: 1.55 !important; color: var(--ink); margin: 0 0 8px !important;&quot; data-ke-size=&quot;size16&quot;&gt;수신 구분(Communication Subscription)은 메일을 '과정 안내', '프로모션'처럼 종류로 나눠, 종류마다 수신 동의를 따로 받는 단위입니다.&lt;/p&gt;
&lt;p style=&quot;font-size: 16px !important; line-height: 1.7 !important; margin: 0 0 4px !important;&quot; data-ke-size=&quot;size16&quot;&gt;홍보 메일은 기본 설정에서 고른 수신 구분에 동의한 사람에게만 나가므로, 메일마다 어느 구분으로 보낼지를 첫 발송 전에 정해 둡니다.&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;fig-00.png&quot; data-origin-width=&quot;960&quot; data-origin-height=&quot;342&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bodkNH/dJMcaiyAfnq/hw4DH1HiykKIkXmf4jzMyK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bodkNH/dJMcaiyAfnq/hw4DH1HiykKIkXmf4jzMyK/img.png&quot; data-alt=&quot;프로젝트 진행 지도&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bodkNH/dJMcaiyAfnq/hw4DH1HiykKIkXmf4jzMyK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbodkNH%2FdJMcaiyAfnq%2Fhw4DH1HiykKIkXmf4jzMyK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; alt=&quot;착수, 데이터, 마케팅, 운영, 제품 다섯 단계가 이어진 진행 지도에서 데이터 단계를 강조하고 이번 편을 수신 동의로 표시한 그림&quot; loading=&quot;lazy&quot; width=&quot;480&quot; height=&quot;171&quot; data-filename=&quot;fig-00.png&quot; data-origin-width=&quot;960&quot; data-origin-height=&quot;342&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;프로젝트 진행 지도&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;margin-bottom: 16px !important;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;이런 독자에게:&lt;/b&gt; 국내 고객의 Marketing Cloud Next(MCN)를 구축하면서 첫 발송 전에 수신 구분과 광고 메일 규정을 정리하려는 Salesforce 관리자와 구축 컨설턴트에게 맞습니다.&lt;/p&gt;
&lt;p style=&quot;margin-bottom: 16px !important;&quot; data-ke-size=&quot;size16&quot;&gt;Luka MCA Lab은 여러 지점이 있는 학원의 온라인 클래스를 가정한 가상 고객사이고, 신규 문의 환영, 개강 안내, 이탈 수강생 재참여, 기업 위탁교육 리드 육성의 메일 네 개를 보냅니다(&lt;a href=&quot;https://jt98.tistory.com/25&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;PRJ-01&lt;/a&gt;).&lt;/p&gt;
&lt;p style=&quot;margin-bottom: 16px !important;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;준비할 것&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;권한:&lt;/b&gt; Consent 탭에서 구분을 만들고 동의를 가져오려면 Marketing Cloud Admin 또는 Marketing Cloud Manager 권한 집합이 필요합니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;사람 데이터:&lt;/b&gt; 이메일이 든 가상 연락처는 &lt;a href=&quot;https://jt98.tistory.com/34&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;PRJ-04&lt;/a&gt;에서 넣었고, Data Cloud로는 &lt;a href=&quot;https://jt98.tistory.com/43&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;PRJ-05&lt;/a&gt;에서 가져왔습니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;가져오기 절차:&lt;/b&gt; Consent Imports의 단계별 화면과 반영 시간은 &lt;a href=&quot;https://jt98.tistory.com/16&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;007&lt;/a&gt;에서 다뤘습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p style=&quot;margin-bottom: 16px !important;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;완료 확인:&lt;/b&gt; Subscriptions 목록에 새 구분 두 개가 있고, Data Cloud 조회에서 구분별 OPT_IN 건수가 가져온 행 수와 같으면 끝입니다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;규정 대응&lt;/h2&gt;
&lt;p style=&quot;font-size: 20px !important; font-weight: bold; line-height: 1.6 !important; color: var(--ink); margin-bottom: 16px !important;&quot; data-ke-size=&quot;size20&quot;&gt;광고 메일 규정 가운데 수신 구분이 맡는 것은 사전 동의와 수신 거부이고, 밤 시간 별도 동의는 시행령이 이메일을 예외로 두므로 따로 받지 않습니다.&lt;/p&gt;
&lt;p style=&quot;margin-bottom: 16px !important;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;목적:&lt;/b&gt; 영리 목적의 광고를 담은 메일(광고성 정보)은 정보통신망법 제50조를 따라야 합니다. 이 조문의 의무를 MCN의 어느 기능에서 지킬지 먼저 정합니다.&lt;/p&gt;
&lt;p style=&quot;margin-bottom: 16px !important;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;확인한 사실:&lt;/b&gt; 제50조와 시행령이 이메일 광고에 요구하는 주요 의무는 다섯 가지입니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;사전 동의:&lt;/b&gt; 받는 사람의 명시적인 사전 동의를 받아야 보낼 수 있습니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;수신 거부:&lt;/b&gt; 수신을 거부하거나 동의를 철회한 사람에게는 보내지 않습니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;야간 별도 동의:&lt;/b&gt; 오후 9시부터 다음 날 오전 8시까지 보내려면 별도의 동의가 필요합니다. 다만 시행령이 이메일(전자우편)을 이 의무에서 뺍니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;표시 의무:&lt;/b&gt; 제목 앞의 &quot;(광고)&quot;, 전송자 정보, 수신 거부 방법을 메일에 적습니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;통지와 2년 확인:&lt;/b&gt; 동의&amp;middot;수신 거부&amp;middot;철회를 처리한 결과를 14일 안에 알리고, 동의한 날부터 2년마다 동의 여부를 확인합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p style=&quot;margin-bottom: 16px !important;&quot; data-ke-size=&quot;size16&quot;&gt;MCN은 기본 설정에서 홍보(Promotional) 메일을 고른 수신 구분에 동의한 사람에게만 보내고, Unsubscribe 링크로 해지한 사람은 그 구분의 메일에서 뺍니다.&lt;/p&gt;
&lt;p style=&quot;margin-bottom: 16px !important;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;막힌 것:&lt;/b&gt; 법에는 거래관계 예외도 있어, 거래가 끝난 뒤 6개월 안에 같은 종류의 상품을 알리는 메일은 동의 없이 보낼 수 있습니다. 최근 수강생에게 해당할 수 있지만, MCN은 홍보 메일에 동의 기록을 요구합니다. 동의하지 않은 사람을 Opt In으로 넣을 수는 없으므로 이 예외는 기능으로 쓸 수 없습니다.&lt;/p&gt;
&lt;p style=&quot;margin-bottom: 16px !important;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;고른 것:&lt;/b&gt; 모두에게 동의를 받고, 수신 구분은 사전 동의와 수신 거부를 맡습니다. 표시 의무는 메일 콘텐츠에서, 통지와 2년 확인은 운영 단계에서 처리합니다. 야간 동의를 받는 구분이나 양식 칸은 만들지 않습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;fig-01.png&quot; data-origin-width=&quot;960&quot; data-origin-height=&quot;1614&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/wCGBy/dJMcaiyAfns/Wd7z1Ve1jIKruWdSXBKve1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/wCGBy/dJMcaiyAfns/Wd7z1Ve1jIKruWdSXBKve1/img.png&quot; data-alt=&quot;판단 카드: 규정 대응&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/wCGBy/dJMcaiyAfns/Wd7z1Ve1jIKruWdSXBKve1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FwCGBy%2FdJMcaiyAfns%2FWd7z1Ve1jIKruWdSXBKve1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; alt=&quot;광고 메일 규정 다섯 가지마다 근거 조문과 처리하는 곳을 적은 판단 카드: 사전 동의와 수신 거부는 수신 구분, 야간 별도 동의는 이메일 예외, 표시 의무는 콘텐츠, 통지와 2년 확인은 운영&quot; loading=&quot;lazy&quot; width=&quot;480&quot; height=&quot;807&quot; data-filename=&quot;fig-01.png&quot; data-origin-width=&quot;960&quot; data-origin-height=&quot;1614&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;판단 카드: 규정 대응&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;font-size: 14px !important; line-height: 1.7 !important; color: var(--muted); margin-bottom: 16px !important;&quot; data-ke-size=&quot;size14&quot;&gt;만 14세 미만 아동의 개인정보에 법정대리인 동의를 받는 일은 수강 등록 업무이고 광고 규정이 아닙니다. 이 프로젝트는 14세 미만 수강생에게 메일을 보내지 않으므로(&lt;a href=&quot;https://jt98.tistory.com/28&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;PRJ-03&lt;/a&gt;) 수신 구분에서 다루지 않습니다.&lt;/p&gt;
&lt;div data-ke-type=&quot;moreLess&quot; data-text-more=&quot;조문 원문 위치 보기&quot; data-text-less=&quot;닫기&quot;&gt;&lt;a class=&quot;btn-toggle-moreless&quot;&gt;더보기&lt;/a&gt;
&lt;div class=&quot;moreless-content&quot;&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;사전 동의: 정보통신망법 제50조 제1항 &amp;middot; 수신 거부: 제2항&lt;/li&gt;
&lt;li&gt;야간 별도 동의: 제3항, 시행령 제61조 제2항(전자우편 예외)&lt;/li&gt;
&lt;li&gt;표시 의무: 제4항, 시행령 제61조 제3항과 별표 6&lt;/li&gt;
&lt;li&gt;통지와 2년 확인: 제7항&amp;middot;제8항, 시행령 제62조의2&amp;middot;제62조의3&lt;/li&gt;
&lt;li&gt;거래관계 예외: 제50조 제1항 단서, 시행령 제61조 제1항(거래 종료 뒤 6개월)&lt;/li&gt;
&lt;li&gt;아동 개인정보: 개인정보 보호법 제22조의2 제1항&lt;/li&gt;
&lt;/ul&gt;
&lt;p style=&quot;margin-bottom: 16px !important;&quot; data-ke-size=&quot;size16&quot;&gt;정보통신망법과 시행령은 2026년 10월 2일, 개인정보 보호법은 2026년 9월 11일부터 시행된 조문을 기준으로 했습니다. 어떤 메일이 광고성 정보인지는 메일 내용으로 판단하므로, 실제 구축에서는 고객사의 법무 검토를 함께 받습니다.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;hr data-ke-style=&quot;style5&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;수신 구분&lt;/h2&gt;
&lt;p style=&quot;font-size: 20px !important; font-weight: bold; line-height: 1.6 !important; color: var(--ink); margin-bottom: 16px !important;&quot; data-ke-size=&quot;size20&quot;&gt;Unsubscribe 링크는 그 메일의 수신 구분 하나만 해지하므로, 개강 소식과 재참여 메일을 '과정 안내'와 '프로모션' 두 구분으로 나눕니다.&lt;/p&gt;
&lt;p style=&quot;margin-bottom: 16px !important;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;목적:&lt;/b&gt; 고객사는 &quot;개강 소식은 계속 받고, 재참여 권유는 끊을 수 있게&quot; 해 달라고 했습니다. 수신자가 메일 종류마다 받을지를 고를 수 있어야 합니다.&lt;/p&gt;
&lt;p style=&quot;margin-bottom: 16px !important;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;확인한 사실:&lt;/b&gt; 도움말에 따르면 메일 꼬리말의 &lt;b&gt;Unsubscribe&lt;/b&gt; 링크를 누르면, 그 메일을 보낸 수신 구분 하나에서만 바로 해지됩니다. 지금 org에는 기본으로 만들어진 Marketing 구분 하나뿐입니다.&lt;/p&gt;
&lt;p style=&quot;margin-bottom: 16px !important;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;막힌 것:&lt;/b&gt; 구분이 하나면 재참여 메일에서 해지한 사람에게 개강 소식도 가지 않습니다. 메일마다 구분을 만들면 수신자가 선호 페이지(Preference Page)에서 고를 항목이 넷이 되고, 문의 양식에서 받을 동의 칸도 넷으로 늘어납니다.&lt;/p&gt;
&lt;p style=&quot;margin-bottom: 16px !important;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;고른 것:&lt;/b&gt; 구분을 두 개로 나눴습니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;과정 안내:&lt;/b&gt; 신규 문의 환영, 개강 안내, 기업 위탁교육 자료&lt;/li&gt;
&lt;li&gt;&lt;b&gt;프로모션:&lt;/b&gt; 이탈 수강생 재참여&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;fig-02.png&quot; data-origin-width=&quot;960&quot; data-origin-height=&quot;2020&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/YY1qb/dJMcaaUHqZw/lGL1i2BA6kKWCZwYZr57G1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/YY1qb/dJMcaaUHqZw/lGL1i2BA6kKWCZwYZr57G1/img.png&quot; data-alt=&quot;판단 카드: 수신 구분 개수&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/YY1qb/dJMcaaUHqZw/lGL1i2BA6kKWCZwYZr57G1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FYY1qb%2FdJMcaaUHqZw%2FlGL1i2BA6kKWCZwYZr57G1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; alt=&quot;수신 구분을 몇 개로 나눌지 묻고, 기본 Marketing 하나, 과정 안내와 프로모션 둘, 메일마다 하나인 넷을 견준 뒤 둘을 고른 판단 카드와 메일 배정&quot; loading=&quot;lazy&quot; width=&quot;480&quot; height=&quot;1010&quot; data-filename=&quot;fig-02.png&quot; data-origin-width=&quot;960&quot; data-origin-height=&quot;2020&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;판단 카드: 수신 구분 개수&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;margin-bottom: 16px !important;&quot; data-ke-size=&quot;size16&quot;&gt;이 프로젝트는 네 메일을 모두 광고성 정보로 보고, 이메일을 만들 때 &lt;b&gt;Message Purpose&lt;/b&gt;를 Promotional로 둡니다. 수강 신청 확인처럼 거래에 따른 메일은 이번 범위에 없습니다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style5&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;구분 만들기&lt;/h2&gt;
&lt;p style=&quot;font-size: 20px !important; font-weight: bold; line-height: 1.6 !important; color: var(--ink); margin-bottom: 16px !important;&quot; data-ke-size=&quot;size20&quot;&gt;수신 구분은 Consent 탭의 Subscriptions에서 이름과 채널만 넣어 만들고, 이름은 나중에 고칠 수 있지만 지우면 그 구분의 동의도 함께 지워집니다.&lt;/p&gt;
&lt;p style=&quot;font-size: 18px !important; font-weight: bold; line-height: 1.5 !important; color: var(--ink); margin-bottom: 10px !important;&quot; data-ke-size=&quot;size18&quot;&gt;1. Subscriptions에서 New Subscription을 누릅니다&lt;/p&gt;
&lt;p style=&quot;margin-bottom: 16px !important;&quot; data-ke-size=&quot;size16&quot;&gt;Marketing 앱의 탭 막대에서 &lt;b&gt;Consent&lt;/b&gt;를 열고(탭 막대에 없으면 &lt;b&gt;More&lt;/b&gt; 메뉴 안에 있습니다), 왼쪽 메뉴의 &lt;b&gt;Subscriptions&lt;/b&gt;를 고릅니다. 목록에는 기본 Marketing 구분 한 줄이 있습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;01-구분-목록-시작.png&quot; data-origin-width=&quot;2104&quot; data-origin-height=&quot;1856&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bjFqGu/dJMcabeSCwc/xOEEmoYiofvzJVVvRtfx6K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bjFqGu/dJMcabeSCwc/xOEEmoYiofvzJVVvRtfx6K/img.png&quot; data-alt=&quot;기본 Marketing 하나인 Subscriptions 목록&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bjFqGu/dJMcabeSCwc/xOEEmoYiofvzJVVvRtfx6K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbjFqGu%2FdJMcabeSCwc%2FxOEEmoYiofvzJVVvRtfx6K%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; alt=&quot;Consent 탭의 Subscriptions 목록에 Marketing 한 행이 있고 오른쪽 위 New Subscription 단추가 강조되어 있다&quot; loading=&quot;lazy&quot; width=&quot;720&quot; height=&quot;635&quot; data-filename=&quot;01-구분-목록-시작.png&quot; data-origin-width=&quot;2104&quot; data-origin-height=&quot;1856&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;기본 Marketing 하나인 Subscriptions 목록&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;font-size: 14px !important; line-height: 1.7 !important; color: var(--muted); margin-bottom: 16px !important;&quot; data-ke-size=&quot;size14&quot;&gt;화면 위의 노란 안내 띠는 SMS 동의를 가져올 때 필요한 Sender Code 안내이며, 이메일 구분과는 상관없습니다.&lt;/p&gt;
&lt;p style=&quot;font-size: 18px !important; font-weight: bold; line-height: 1.5 !important; color: var(--ink); margin-bottom: 10px !important;&quot; data-ke-size=&quot;size18&quot;&gt;2. 이름과 채널을 넣고 저장합니다&lt;/p&gt;
&lt;p style=&quot;margin-bottom: 16px !important;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Subscription Name&lt;/b&gt;에 이름을 넣고 &lt;b&gt;Channels&lt;/b&gt;에서 Email을 고른 뒤 &lt;b&gt;Save&lt;/b&gt;를 누릅니다. 같은 방법으로 프로모션 구분도 만듭니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;02-새-구분-창.png&quot; data-origin-width=&quot;1356&quot; data-origin-height=&quot;1096&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dKKCXj/dJMcabeSCwg/yHv4MrCErbUjDfiIw1CUH0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dKKCXj/dJMcabeSCwg/yHv4MrCErbUjDfiIw1CUH0/img.png&quot; data-alt=&quot;이름과 채널&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dKKCXj/dJMcabeSCwg/yHv4MrCErbUjDfiIw1CUH0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdKKCXj%2FdJMcabeSCwg%2FyHv4MrCErbUjDfiIw1CUH0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; alt=&quot;New communication subscription 창에서 Subscription Name에 LUKA_과정안내, Channels에 Email이 선택되어 번호로 강조되어 있다&quot; loading=&quot;lazy&quot; width=&quot;540&quot; height=&quot;436&quot; data-filename=&quot;02-새-구분-창.png&quot; data-origin-width=&quot;1356&quot; data-origin-height=&quot;1096&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;이름과 채널&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;margin-bottom: 16px !important;&quot; data-ke-size=&quot;size16&quot;&gt;구분 이름은 수신자가 보는 선호 페이지에 그대로 나오므로, 실제 구축에서는 수신자가 알아볼 이름으로 짓습니다. 이 실습에서는 시험으로 만든 구분을 구별하려고 이름 앞에 LUKA_를 붙였습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;03-구분-목록-세-행.png&quot; data-origin-width=&quot;2104&quot; data-origin-height=&quot;1856&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b5pHzh/dJMcaaUHqZF/NQdeCdygqlFzUkMQHkusBk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b5pHzh/dJMcaaUHqZF/NQdeCdygqlFzUkMQHkusBk/img.png&quot; data-alt=&quot;구분 세 개가 된 목록&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b5pHzh/dJMcaaUHqZF/NQdeCdygqlFzUkMQHkusBk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb5pHzh%2FdJMcaaUHqZF%2FNQdeCdygqlFzUkMQHkusBk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; alt=&quot;Subscriptions 목록에 LUKA_과정안내, LUKA_프로모션, Marketing 세 행이 있고 새 두 행이 강조되어 있다&quot; loading=&quot;lazy&quot; width=&quot;720&quot; height=&quot;635&quot; data-filename=&quot;03-구분-목록-세-행.png&quot; data-origin-width=&quot;2104&quot; data-origin-height=&quot;1856&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;구분 세 개가 된 목록&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;margin-bottom: 16px !important;&quot; data-ke-size=&quot;size16&quot;&gt;행 끝 메뉴의 &lt;b&gt;Edit&lt;/b&gt; 창에서는 이름 칸을 고칠 수 있고, 칸의 도움말은 이름을 바꾸면 선호 페이지의 이름도 함께 바뀐다고 안내합니다. 기본 Marketing 구분은 이 프로젝트의 메일에서 고르지 않고 그대로 둡니다.&lt;/p&gt;
&lt;div class=&quot;say warn&quot;&gt;&lt;span class=&quot;badge i-alert&quot; aria-hidden=&quot;true&quot;&gt;&lt;/span&gt;
&lt;div&gt;&lt;b&gt;주의&lt;/b&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Delete&lt;/b&gt;로 구분을 지우면 그 구분에 모인 동의 데이터도 함께 지워집니다. 쓰지 않게 된 구분도 지우지 않고 남겨 둡니다.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p style=&quot;margin-bottom: 16px !important;&quot; data-ke-size=&quot;size16&quot;&gt;새 구분은 선호 페이지에 저절로 들어가지 않습니다. 왼쪽 메뉴 &lt;b&gt;Preference Pages&lt;/b&gt;에서 Email Preference Page의 편집 화면을 열면 Marketing 하나만 있습니다. 확인만 하고 저장하지 않은 채 &lt;b&gt;Back&lt;/b&gt;으로 나옵니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;04-선호-페이지-편집-화면.png&quot; data-origin-width=&quot;2104&quot; data-origin-height=&quot;1856&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ZsV91/dJMcaaUHqZJ/kYmrYggg27jhijaKw8lNX1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ZsV91/dJMcaaUHqZJ/kYmrYggg27jhijaKw8lNX1/img.png&quot; data-alt=&quot;기본 이메일 선호 페이지의 편집 화면&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ZsV91/dJMcaaUHqZJ/kYmrYggg27jhijaKw8lNX1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FZsV91%2FdJMcaaUHqZJ%2FkYmrYggg27jhijaKw8lNX1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; alt=&quot;Email Preference Page 편집 화면의 미리보기에 Marketing 한 줄과 Opt In 스위치, Unsubscribe from All 링크, Save 단추가 있는 영역이 강조되어 있다&quot; loading=&quot;lazy&quot; width=&quot;720&quot; height=&quot;635&quot; data-filename=&quot;04-선호-페이지-편집-화면.png&quot; data-origin-width=&quot;2104&quot; data-origin-height=&quot;1856&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;기본 이메일 선호 페이지의 편집 화면&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr data-ke-style=&quot;style5&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;동의 가져오기&lt;/h2&gt;
&lt;p style=&quot;font-size: 20px !important; font-weight: bold; line-height: 1.6 !important; color: var(--ink); margin-bottom: 16px !important;&quot; data-ke-size=&quot;size20&quot;&gt;구분마다 동의한 사람이 다르므로 Consent Imports로 구분마다 한 번씩 가져오고, 동의 날짜에는 실제로 동의를 받은 날을 넣습니다.&lt;/p&gt;
&lt;p style=&quot;margin-bottom: 16px !important;&quot; data-ke-size=&quot;size16&quot;&gt;이번에 가져오는 사람은 이미 등록한 학부모 8명과 14세 이상 수강생 4명입니다. 막 문의한 사람의 동의는 문의 양식에서 받으므로 여기서 가져오지 않습니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;과정 안내:&lt;/b&gt; 12명 모두 동의했습니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;프로모션:&lt;/b&gt; 학부모 4명과 수강생 4명, 모두 8명이 동의했습니다(가상 데이터의 가정입니다).&lt;/li&gt;
&lt;/ul&gt;
&lt;p style=&quot;margin-bottom: 16px !important;&quot; data-ke-size=&quot;size16&quot;&gt;CSV는 구분마다 하나씩 만듭니다. 머리글과 날짜 형식은 007과 같고, 두 파일은 행 수만 다릅니다.&lt;/p&gt;
&lt;pre id=&quot;code_1&quot; class=&quot;plaintext&quot; data-ke-language=&quot;plaintext&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;EmailAddress,ConsentDate
luka.parent01@example.com,2026-09-01
luka.parent02@example.com,2026-09-01&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;margin-bottom: 16px !important;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;ConsentDate&lt;/b&gt;에는 가져온 날이 아니라 동의를 받은 날을 넣습니다. 2년마다 동의를 확인할 때 이 날짜를 기준으로 삼기 때문입니다. 도움말에 따르면 이미 있는 동의 날짜보다 이전 날짜는 무시되므로, 나중에 더 이른 날짜로 고칠 수 없습니다.&lt;/p&gt;
&lt;p style=&quot;margin-bottom: 16px !important;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Consent Imports&lt;/b&gt;에서 &lt;b&gt;Import&lt;/b&gt;를 누릅니다. &lt;b&gt;Channel&lt;/b&gt;은 Email, &lt;b&gt;Communication Subscription&lt;/b&gt;은 과정 안내 구분을 고르고 &lt;b&gt;Opt In&lt;/b&gt; 카드를 누릅니다. 이후 파일을 올리고 가져오는 순서는 &lt;a href=&quot;https://jt98.tistory.com/16&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;007&lt;/a&gt;과 같습니다. 프로모션 구분도 같은 방법으로 8행 파일을 가져옵니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;05-가져오기-1단계.png&quot; data-origin-width=&quot;1356&quot; data-origin-height=&quot;1696&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bhAbTC/dJMcabeSCwp/qlVn8ECoveT4hzFqKSecxk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bhAbTC/dJMcabeSCwp/qlVn8ECoveT4hzFqKSecxk/img.png&quot; data-alt=&quot;과정 안내 구분을 고른 첫 단계&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bhAbTC/dJMcabeSCwp/qlVn8ECoveT4hzFqKSecxk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbhAbTC%2FdJMcabeSCwp%2FqlVn8ECoveT4hzFqKSecxk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; alt=&quot;Import Consent Data 창에서 Channel Email, Communication Subscription LUKA_과정안내, Opt In 카드가 번호로 강조되어 있다&quot; loading=&quot;lazy&quot; width=&quot;540&quot; height=&quot;675&quot; data-filename=&quot;05-가져오기-1단계.png&quot; data-origin-width=&quot;1356&quot; data-origin-height=&quot;1696&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;과정 안내 구분을 고른 첫 단계&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;06-가져오기-목록.png&quot; data-origin-width=&quot;2104&quot; data-origin-height=&quot;1856&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/w8Hbr/dJMcaiyAfoC/rnYoR61FvvZxu67ABgAbiK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/w8Hbr/dJMcaiyAfoC/rnYoR61FvvZxu67ABgAbiK/img.png&quot; data-alt=&quot;두 번 가져온 결과&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/w8Hbr/dJMcaiyAfoC/rnYoR61FvvZxu67ABgAbiK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fw8Hbr%2FdJMcaiyAfoC%2FrnYoR61FvvZxu67ABgAbiK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; alt=&quot;Consent Imports 목록에 LUKA_과정안내와 LUKA_프로모션 두 가져오기 행이 모두 Completed로 강조되어 있다&quot; loading=&quot;lazy&quot; width=&quot;720&quot; height=&quot;635&quot; data-filename=&quot;06-가져오기-목록.png&quot; data-origin-width=&quot;2104&quot; data-origin-height=&quot;1856&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;두 번 가져온 결과&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr data-ke-style=&quot;style5&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;결과 확인&lt;/h2&gt;
&lt;p style=&quot;font-size: 20px !important; font-weight: bold; line-height: 1.6 !important; color: var(--ink); margin-bottom: 16px !important;&quot; data-ke-size=&quot;size20&quot;&gt;Query Editor에서 구분별 OPT_IN 건수가 가져온 행 수와 같으면, 동의가 구분마다 들어간 것입니다.&lt;/p&gt;
&lt;p style=&quot;margin-bottom: 16px !important;&quot; data-ke-size=&quot;size16&quot;&gt;Data Cloud의 Query Editor에서 동의 데이터를 구분 이름별로 셉니다. 이번 시험에서는 두 번 모두 가져온 뒤 2~4분 사이에 조회에 보였습니다.&lt;/p&gt;
&lt;div data-ke-type=&quot;moreLess&quot; data-text-more=&quot;구분별 동의 건수를 세는 SQL 보기&quot; data-text-less=&quot;닫기&quot;&gt;&lt;a class=&quot;btn-toggle-moreless&quot;&gt;더보기&lt;/a&gt;
&lt;div class=&quot;moreless-content&quot;&gt;
&lt;p style=&quot;margin-bottom: 16px !important;&quot; data-ke-size=&quot;size16&quot;&gt;동의 레코드에는 구분 이름이 없으므로, 구분 채널 DMO를 거쳐 구분 DMO에서 이름을 가져옵니다. &lt;code&gt;consents&lt;/code&gt;는 구분과 동의 상태별 동의 레코드 수이고, WHERE 줄의 이름 조건은 자기 구분 이름으로 바꿉니다.&lt;/p&gt;
&lt;pre id=&quot;code_2&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;SELECT s.ssot__Name__c,
  c.ssot__ConsentStatus__c,
  COUNT(*) AS consents
FROM
  ssot__CommunicationSubscriptionConsent__dlm c
JOIN
  ssot__CommunicationSubscriptionChannelType__dlm t
  ON c.ssot__CommunicationSubscriptionChannelTypeId__c
   = t.ssot__Id__c
JOIN ssot__CommunicationSubscription__dlm s
  ON t.ssot__CommunicationSubscriptionId__c
   = s.ssot__Id__c
WHERE s.ssot__Name__c LIKE 'LUKA\_%'
GROUP BY s.ssot__Name__c,
  c.ssot__ConsentStatus__c&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;07-동의-건수-조회.png&quot; data-origin-width=&quot;2104&quot; data-origin-height=&quot;1856&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cxmwnJ/dJMcabeSCws/1KhhTDHTbP288xBC5XrL20/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cxmwnJ/dJMcabeSCws/1KhhTDHTbP288xBC5XrL20/img.png&quot; data-alt=&quot;구분별 동의 건수&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cxmwnJ/dJMcabeSCws/1KhhTDHTbP288xBC5XrL20/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcxmwnJ%2FdJMcabeSCws%2F1KhhTDHTbP288xBC5XrL20%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; alt=&quot;Query Editor의 Query Result에서 LUKA_프로모션 OPT_IN 8, LUKA_과정안내 OPT_IN 12인 두 행이 주황 상자로 강조되어 있다&quot; loading=&quot;lazy&quot; width=&quot;720&quot; height=&quot;635&quot; data-filename=&quot;07-동의-건수-조회.png&quot; data-origin-width=&quot;2104&quot; data-origin-height=&quot;1856&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;구분별 동의 건수&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;margin-bottom: 16px !important;&quot; data-ke-size=&quot;size16&quot;&gt;과정 안내는 12건, 프로모션은 8건으로 가져온 행 수와 같았습니다. 같은 조회에 동의 날짜 열을 더해 보면 CSV에 넣은 2026-09-01이 그대로 남아 있습니다.&lt;/p&gt;
&lt;p style=&quot;margin-bottom: 16px !important;&quot; data-ke-size=&quot;size16&quot;&gt;이후 여정에서는 메일을 보낼 때 이 두 구분 가운데 하나를 고릅니다. 선호 페이지와 &quot;(광고)&quot; 표시는 별도 글에서 다룰 예정입니다.&lt;/p&gt;
&lt;div data-ke-type=&quot;moreLess&quot; data-text-more=&quot;그림으로 쉽게 보는 요약 보기&quot; data-text-less=&quot;닫기&quot;&gt;&lt;a class=&quot;btn-toggle-moreless&quot;&gt;더보기&lt;/a&gt;
&lt;div class=&quot;moreless-content&quot;&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;eli5-01.png&quot; data-origin-width=&quot;1440&quot; data-origin-height=&quot;3428&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/pERj8/dJMcaaUHqZS/3slEMOUhAX6wHnlcGGykv1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/pERj8/dJMcaaUHqZS/3slEMOUhAX6wHnlcGGykv1/img.png&quot; data-alt=&quot;그림으로 쉽게 보는 요약&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/pERj8/dJMcaaUHqZS/3slEMOUhAX6wHnlcGGykv1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FpERj8%2FdJMcaaUHqZS%2F3slEMOUhAX6wHnlcGGykv1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; alt=&quot;광고 메일 규칙 다섯 가지와 맡을 곳, 밤 시간 별도 동의는 이메일 예외, Unsubscribe는 그 메일의 구분 하나만 끔, 구분을 과정 안내와 프로모션 둘로 나눔, 구분마다 동의를 따로 가져오고 동의 날짜는 동의를 받은 날, 가져온 행 수와 같은 건수 12와 8로 확인하는 여섯 장면의 요약 그림&quot; loading=&quot;lazy&quot; width=&quot;720&quot; height=&quot;1714&quot; data-filename=&quot;eli5-01.png&quot; data-origin-width=&quot;1440&quot; data-origin-height=&quot;3428&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;그림으로 쉽게 보는 요약&lt;/figcaption&gt;
&lt;/figure&gt;

&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p style=&quot;margin-bottom: 16px !important;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;참고 문서&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;a href=&quot;https://help.salesforce.com/s/articleView?id=mktg.mktg_consent_comm_sub_create.htm&amp;amp;type=5&amp;amp;language=en_US&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Create a Communication Subscription&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://help.salesforce.com/s/articleView?id=mktg.mktg_consent_tools_ref.htm&amp;amp;type=5&amp;amp;language=en_US&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Understanding Consent Concepts in Marketing Cloud Next&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://help.salesforce.com/s/articleView?id=mktg.mktg_consent_considerations.htm&amp;amp;type=5&amp;amp;language=en_US&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Considerations for Managing Marketing Consent Data&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://help.salesforce.com/s/articleView?id=mktg.mktg_content_email_canspam.htm&amp;amp;type=5&amp;amp;language=en_US&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Add Required Consent Details to Promotional Emails&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://help.salesforce.com/s/articleView?id=mktg.mktg_consent_import_format.htm&amp;amp;type=5&amp;amp;language=en_US&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Formatting Marketing Consent Import Files&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.law.go.kr/법령/정보통신망이용촉진및정보보호등에관한법률/제50조&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;정보통신망 이용촉진 및 정보보호 등에 관한 법률 제50조&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.law.go.kr/법령/정보통신망이용촉진및정보보호등에관한법률시행령/제61조&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;같은 법 시행령 제61조&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.law.go.kr/법령/개인정보보호법/제22조의2&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;개인정보 보호법 제22조의2&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>프로젝트</category>
      <category>consent</category>
      <category>MCN</category>
      <category>portfolio</category>
      <author>Luka.dev</author>
      <guid isPermaLink="true">https://jt98.tistory.com/45</guid>
      <comments>https://jt98.tistory.com/45#entry45comment</comments>
      <pubDate>Tue, 20 Oct 2026 17:47:43 +0900</pubDate>
    </item>
    <item>
      <title>Luka MCA Lab 구축기 | 동일인 판정 매치 규칙 고르기와 실행</title>
      <link>https://jt98.tistory.com/44</link>
      <description>&lt;div class=&quot;greeting&quot;&gt;
&lt;p style=&quot;line-height: 1.8 !important; margin: 0 0 0px !important;&quot; data-ke-size=&quot;size16&quot;&gt;안녕하세요, 루카입니다. 오늘은 Luka MCA Lab 데이터에 맞는 동일인 판정 매치 규칙을 고르고 실행해 보겠습니다.&lt;/p&gt;
&lt;/div&gt;
&lt;hr data-ke-style=&quot;style5&quot; /&gt;
&lt;div class=&quot;lead-box&quot; style=&quot;background: color-mix(in srgb, var(--brand) 7%, transparent); border-top: 4px solid var(--brand); border-radius: 10px; padding: 18px 24px 16px; margin: 8px 0 28px;&quot;&gt;
&lt;p style=&quot;font-size: 20px !important; font-weight: bold; line-height: 1.55 !important; color: var(--ink); margin: 0 0 8px !important;&quot; data-ke-size=&quot;size16&quot;&gt;동일인 판정(Identity Resolution)은 여러 원천에서 들어온 같은 사람의 레코드를 매치 규칙에 따라 통합 개인(Unified Individual) 하나로 묶는 기능입니다.&lt;/p&gt;
&lt;p style=&quot;font-size: 16px !important; line-height: 1.7 !important; margin: 0 0 4px !important;&quot; data-ke-size=&quot;size16&quot;&gt;규칙이 느슨하면 다른 사람이 한 사람으로 묶이고, 엄격하면 같은 사람이 둘로 남으므로 같은 이메일을 누가 함께 쓰는지 먼저 보고 규칙을 정합니다.&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;fig-00.png&quot; data-origin-width=&quot;960&quot; data-origin-height=&quot;342&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/1MK9Y/dJMcaagdLvI/4Txkn0KKkKHdkrr5qgyAx0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/1MK9Y/dJMcaagdLvI/4Txkn0KKkKHdkrr5qgyAx0/img.png&quot; data-alt=&quot;프로젝트 진행 지도&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/1MK9Y/dJMcaagdLvI/4Txkn0KKkKHdkrr5qgyAx0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F1MK9Y%2FdJMcaagdLvI%2F4Txkn0KKkKHdkrr5qgyAx0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; alt=&quot;착수, 데이터, 마케팅, 운영, 제품 다섯 단계가 이어진 진행 지도에서 데이터 단계를 강조하고 이번 편을 동일인 판정으로 표시한 그림&quot; loading=&quot;lazy&quot; width=&quot;480&quot; height=&quot;171&quot; data-filename=&quot;fig-00.png&quot; data-origin-width=&quot;960&quot; data-origin-height=&quot;342&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;프로젝트 진행 지도&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;margin-bottom: 16px !important;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;이런 독자에게:&lt;/b&gt; 세그먼트를 만들기 전에 동일인 판정을 처음 실행하려는 Salesforce 관리자와 구축 컨설턴트에게 맞습니다.&lt;/p&gt;
&lt;p style=&quot;margin-bottom: 16px !important;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;준비할 것&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;규칙 집합:&lt;/b&gt; Data Cloud가 켜진 Marketing Cloud Next org에 Individual용 규칙 집합(Ruleset)이 하나 있어야 합니다. 이 org에는 이미 만들어진 규칙 집합이 있고, 만드는 법은 &lt;a href=&quot;https://jt98.tistory.com/12&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;003&lt;/a&gt;에 있습니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;구조:&lt;/b&gt; 규칙 집합, Individual, 통합 개인의 관계는 &lt;a href=&quot;https://jt98.tistory.com/13&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;004&lt;/a&gt;에서 다뤘습니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;사람 데이터:&lt;/b&gt; 가상 데이터는 &lt;a href=&quot;https://jt98.tistory.com/34&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;PRJ-04&lt;/a&gt;에서 넣었고, 14세 미만 수강생에게 이메일을 넣지 않는 원칙은 &lt;a href=&quot;https://jt98.tistory.com/28&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;PRJ-03&lt;/a&gt;에서 정했습니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;크레딧:&lt;/b&gt; 규칙 집합을 실행할 때마다 Data Cloud 크레딧을 씁니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p style=&quot;margin-bottom: 16px !important;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;완료 확인:&lt;/b&gt; 아래 두 가지가 보이면 끝입니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;규칙 집합의 Last Job Status가 Succeeded입니다.&lt;/li&gt;
&lt;li&gt;Query Editor에서 LUKA Individual 35건이 통합 개인 35명으로 나옵니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;판정 대상&lt;/h2&gt;
&lt;p style=&quot;font-size: 20px !important; font-weight: bold; line-height: 1.6 !important; color: var(--ink); margin-bottom: 16px !important;&quot; data-ke-size=&quot;size20&quot;&gt;같은 이메일을 쓰는 Individual에는 학부모 이메일로 들어온 문의 4건뿐 아니라, 시연 데이터에서 공용 메일 주소 하나를 함께 쓰는 11건도 있었습니다.&lt;/p&gt;
&lt;p style=&quot;margin-bottom: 16px !important;&quot; data-ke-size=&quot;size16&quot;&gt;규칙을 고르기 전에, 같은 이메일을 쓰는 Individual을 SQL로 찾습니다. Individual에는 이메일 필드가 없으므로, 이메일을 담은 Contact Point Email과 조인해 이메일별로 셉니다.&lt;/p&gt;
&lt;div data-ke-type=&quot;moreLess&quot; data-text-more=&quot;같은 이메일을 쓰는 Individual을 찾는 SQL 보기&quot; data-text-less=&quot;닫기&quot;&gt;&lt;a class=&quot;btn-toggle-moreless&quot;&gt;더보기&lt;/a&gt;
&lt;div class=&quot;moreless-content&quot;&gt;
&lt;p style=&quot;margin-bottom: 16px !important;&quot; data-ke-size=&quot;size16&quot;&gt;이메일은 소문자로 바꾸고 앞뒤 공백을 없앤 값으로 묶고, 빈 값은 뺍니다. &lt;code&gt;individual_records&lt;/code&gt;는 그 이메일을 쓰는 Individual 레코드 수, &lt;code&gt;names&lt;/code&gt;는 그중 서로 다른 이름의 수입니다. 두 값이 같으면 그 이메일을 쓰는 레코드의 이름이 모두 다릅니다.&lt;/p&gt;
&lt;pre id=&quot;code_1&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;SELECT
  LOWER(TRIM(e.ssot__EmailAddress__c))
    AS email,
  COUNT(DISTINCT i.ssot__Id__c)
    AS individual_records,
  COUNT(DISTINCT CONCAT(
    i.ssot__FirstName__c, ' ',
    i.ssot__LastName__c)) AS names
FROM ssot__Individual__dlm i
JOIN ssot__ContactPointEmail__dlm e
  ON e.ssot__PartyId__c = i.ssot__Id__c
WHERE LENGTH(e.ssot__EmailAddress__c) &amp;gt; 0
GROUP BY LOWER(TRIM(e.ssot__EmailAddress__c))
HAVING COUNT(DISTINCT i.ssot__Id__c) &amp;gt; 1&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p style=&quot;margin-bottom: 16px !important;&quot; data-ke-size=&quot;size16&quot;&gt;이 org의 Individual 541건 가운데 35건은 이 프로젝트의 가상 데이터이고, 506건은 SDO(시연용 체험 org)에 처음부터 있던 시연 데이터입니다. 같은 이메일을 쓰는 묶음은 아래와 같고, 묶음마다 이름이 모두 달랐습니다.&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;묶음&lt;/th&gt;
&lt;th&gt;이메일 수&lt;/th&gt;
&lt;th&gt;이메일마다 Individual&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;가상 데이터의 학부모 이메일&lt;/td&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;2건&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;시연 데이터의 공용 메일 주소&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;11건&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;시연 데이터의 다른 이메일&lt;/td&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;2건&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p style=&quot;margin-bottom: 16px !important;&quot; data-ke-size=&quot;size16&quot;&gt;가상 데이터의 4개는 학부모 Contact와 같은 이메일로 들어온 문의 Prospect입니다. 이미 등록한 학부모가 형제의 다른 과정을 문의하면서 이름 칸에 다른 이름을 적은 경우로 가정했습니다.&lt;/p&gt;
&lt;p style=&quot;margin-bottom: 16px !important;&quot; data-ke-size=&quot;size16&quot;&gt;수강생 중 14세 이상 4명은 자기 이메일을 쓰고 14세 미만 8명은 이메일이 비어 있어, 같은 이메일을 쓰는 묶음에 들지 않습니다.&lt;/p&gt;
&lt;div data-ke-type=&quot;moreLess&quot; data-text-more=&quot;가상 데이터의 이메일 묶음 4개 보기&quot; data-text-less=&quot;닫기&quot;&gt;&lt;a class=&quot;btn-toggle-moreless&quot;&gt;더보기&lt;/a&gt;
&lt;div class=&quot;moreless-content&quot;&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;이메일&lt;/th&gt;
&lt;th&gt;학부모(Contact)&lt;/th&gt;
&lt;th&gt;문의(Prospect)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href=&quot;mailto:luka.parent01@example.com&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;luka.parent01@example.com&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;민준&lt;/td&gt;
&lt;td&gt;서윤&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href=&quot;mailto:luka.parent02@example.com&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;luka.parent02@example.com&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;서연&lt;/td&gt;
&lt;td&gt;도윤&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href=&quot;mailto:luka.parent03@example.com&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;luka.parent03@example.com&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;지우&lt;/td&gt;
&lt;td&gt;지민&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href=&quot;mailto:luka.parent04@example.com&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;luka.parent04@example.com&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;하준&lt;/td&gt;
&lt;td&gt;예준&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p style=&quot;margin-bottom: 16px !important;&quot; data-ke-size=&quot;size16&quot;&gt;이 규칙 집합에는 매치 규칙이 네 개 있습니다. 가상 데이터에는 전화, 주소, MC Subscriber Key 값이 없으므로, 가상 데이터를 묶을 수 있는 규칙은 이메일을 보는 &lt;b&gt;Fuzzy Name and Normalized Email&lt;/b&gt; 하나뿐입니다. 이 규칙은 이름, 성, 이메일 세 조건이 모두 맞아야 같은 사람으로 봅니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;01-기본-규칙-조건.png&quot; data-origin-width=&quot;1546&quot; data-origin-height=&quot;1606&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/SFiPR/dJMcaf2JyuX/3DA8NGLACmXJUWh9DZSqKk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/SFiPR/dJMcaf2JyuX/3DA8NGLACmXJUWh9DZSqKk/img.png&quot; data-alt=&quot;Fuzzy Name and Normalized Email의 조건 세 개&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/SFiPR/dJMcaf2JyuX/3DA8NGLACmXJUWh9DZSqKk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FSFiPR%2FdJMcaf2JyuX%2F3DA8NGLACmXJUWh9DZSqKk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; alt=&quot;Configure Match Criteria 창에서 Fuzzy Name and Normalized Email 규칙의 조건 세 줄, Individual의 First Name(Fuzzy), Last Name(Exact), Contact Point Email의 Email Address(Exact Normalized)가 주황 상자로 강조되어 있다&quot; loading=&quot;lazy&quot; width=&quot;720&quot; height=&quot;748&quot; data-filename=&quot;01-기본-규칙-조건.png&quot; data-origin-width=&quot;1546&quot; data-origin-height=&quot;1606&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Fuzzy Name and Normalized Email의 조건 세 개&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;margin-bottom: 16px !important;&quot; data-ke-size=&quot;size16&quot;&gt;그래서 이름이 다른 문의 4건은 이 규칙으로 학부모와 묶이지 않습니다. 가상 데이터는 성에도 레코드 표지(LUKA_학부모01, LUKA_문의01)를 넣었으므로, 성 조건도 맞지 않습니다. 실제 데이터에서는 학부모가 같은 이름과 성으로 다시 문의하면 이 규칙으로 묶일 수 있습니다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style5&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;규칙 고르기&lt;/h2&gt;
&lt;p style=&quot;font-size: 20px !important; font-weight: bold; line-height: 1.6 !important; color: var(--ink); margin-bottom: 16px !important;&quot; data-ke-size=&quot;size20&quot;&gt;이메일만 보는 규칙은 문의 4건을 학부모와 묶지만 공용 메일 주소를 쓰는 11건도 한 사람으로 만들므로, 이 org에서는 기본 매치 규칙을 그대로 둡니다.&lt;/p&gt;
&lt;p style=&quot;margin-bottom: 16px !important;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;목적:&lt;/b&gt; 같은 학부모의 문의 레코드와 등록 레코드를 한 사람으로 세고 싶습니다. 그러려면 이메일만 같아도 같은 사람으로 보는 규칙이 필요합니다.&lt;/p&gt;
&lt;p style=&quot;margin-bottom: 16px !important;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;확인한 사실:&lt;/b&gt; 이메일만 보는 시험 규칙을 더해 한 번 실행하고, 실제로 무엇이 묶이는지 확인했습니다. 따라 할 단계는 다음 절의 실행입니다.&lt;/p&gt;
&lt;div class=&quot;say warn&quot;&gt;&lt;span class=&quot;badge i-alert&quot; aria-hidden=&quot;true&quot;&gt;&lt;/span&gt;
&lt;div&gt;&lt;b&gt;주의&lt;/b&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;시험 규칙으로 실행해도 데이터 공간 전체의 통합 개인이 바뀌고 크레딧을 씁니다. 운영 중인 org에서는 게시된 세그먼트가 없을 때 시험하고, 끝나면 규칙을 지운 뒤 다시 실행합니다.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p style=&quot;margin-bottom: 16px !important;&quot; data-ke-size=&quot;size16&quot;&gt;기본 규칙 목록에는 이메일 하나만 보는 규칙이 없어서, Match Rules 카드의 &lt;b&gt;Edit&lt;/b&gt;에서 &lt;b&gt;Custom Rule&lt;/b&gt;을 골라 이메일 조건 하나만 둔 규칙을 만들었습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;02-시험-규칙-설정.png&quot; data-origin-width=&quot;1546&quot; data-origin-height=&quot;1606&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/E80N5/dJMcaagdLvO/QvHvFDMCcZYKuY24huAIK0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/E80N5/dJMcaagdLvO/QvHvFDMCcZYKuY24huAIK0/img.png&quot; data-alt=&quot;이메일 조건 하나만 둔 시험 규칙&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/E80N5/dJMcaagdLvO/QvHvFDMCcZYKuY24huAIK0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FE80N5%2FdJMcaagdLvO%2FQvHvFDMCcZYKuY24huAIK0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; alt=&quot;Configure Match Criteria 창에서 Match Rule Name에 LUKA_036_실험_이메일을 넣고, 조건으로 Contact Point Email의 Email Address를 Exact Normalized로 고른 한 줄이 강조되어 있다&quot; loading=&quot;lazy&quot; width=&quot;720&quot; height=&quot;748&quot; data-filename=&quot;02-시험-규칙-설정.png&quot; data-origin-width=&quot;1546&quot; data-origin-height=&quot;1606&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;이메일 조건 하나만 둔 시험 규칙&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;div data-ke-type=&quot;moreLess&quot; data-text-more=&quot;시험 규칙을 만들고 지우는 경로 보기&quot; data-text-less=&quot;닫기&quot;&gt;&lt;a class=&quot;btn-toggle-moreless&quot;&gt;더보기&lt;/a&gt;
&lt;div class=&quot;moreless-content&quot;&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;규칙 집합 상세에서 Match Rules 카드의 &lt;b&gt;Edit&lt;/b&gt;를 누르고, 안내 창 &lt;b&gt;Match Rule Instructions&lt;/b&gt;에서 &lt;b&gt;Next&lt;/b&gt;를 누릅니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Add Match Rules&lt;/b&gt; 창에서 &lt;b&gt;Add Match Rule&lt;/b&gt;을 누르고, 목록에서 &lt;b&gt;Custom Rule&lt;/b&gt;을 골라 &lt;b&gt;Next&lt;/b&gt;를 누릅니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Configure Match Criteria&lt;/b&gt; 창에서 Data Model Object는 Contact Point Email, Field는 Email Address, Match Method는 Exact Normalized를 고릅니다. 조건을 고르면 이름 칸이 Custom Rule로 돌아가므로, 이름은 조건을 다 고른 뒤 넣습니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Next&lt;/b&gt;를 누르고 &lt;b&gt;Add Match Rules&lt;/b&gt; 창에서 &lt;b&gt;Save&lt;/b&gt;를 누릅니다. 저장해도 실행은 시작되지 않습니다.&lt;/li&gt;
&lt;li&gt;지울 때는 같은 &lt;b&gt;Add Match Rules&lt;/b&gt; 창에서 그 규칙 줄의 휴지통 단추를 누르고 &lt;b&gt;Save&lt;/b&gt;를 누릅니다.&lt;/li&gt;
&lt;/ol&gt;
&lt;p style=&quot;margin-bottom: 16px !important;&quot; data-ke-size=&quot;size16&quot;&gt;조건이 하나뿐인 규칙에는 삼각형 경고가 붙고, 마우스를 올리면 &quot;To improve unified profiles, add more match rule criteria.&quot;가 보입니다. 저장을 막는 경고는 아닙니다.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p style=&quot;margin-bottom: 16px !important;&quot; data-ke-size=&quot;size16&quot;&gt;시험 규칙을 더해 실행한 결과는 아래와 같습니다. 화면의 Total Unified Profiles는 org 전체 Individual 541건에서 나온 통합 개인 수입니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;03-시험-실행-결과.png&quot; data-origin-width=&quot;2104&quot; data-origin-height=&quot;1856&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/be7CMd/dJMcaf2Jyu3/rMx1aOG1dSiFmiKGC4Ukm1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/be7CMd/dJMcaf2Jyu3/rMx1aOG1dSiFmiKGC4Ukm1/img.png&quot; data-alt=&quot;시험 규칙으로 실행한 결과&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/be7CMd/dJMcaf2Jyu3/rMx1aOG1dSiFmiKGC4Ukm1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbe7CMd%2FdJMcaf2Jyu3%2FrMx1aOG1dSiFmiKGC4Ukm1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; alt=&quot;시험 규칙이 더해진 Match Rules 카드 옆에서 Last Job Status Succeeded와 Resolution Summary의 Total Unified Profiles 525 / 541 Source Profiles, Consolidation Rate 3%가 강조된 규칙 집합 상세&quot; loading=&quot;lazy&quot; width=&quot;720&quot; height=&quot;635&quot; data-filename=&quot;03-시험-실행-결과.png&quot; data-origin-width=&quot;2104&quot; data-origin-height=&quot;1856&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;시험 규칙으로 실행한 결과&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;margin-bottom: 16px !important;&quot; data-ke-size=&quot;size16&quot;&gt;Individual 541건이 통합 개인 525명이 되었습니다. 통합 개인이 Individual 건수보다 16명 적은 이유는 아래와 같습니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;문의 4건:&lt;/b&gt; 각각 학부모와 묶여 4명이 줄었습니다. LUKA Individual 35건은 통합 개인 31명이 되었습니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;공용 메일 주소 11건:&lt;/b&gt; 이름이 서로 다른 11건이 통합 개인 1명이 되어 10명이 줄었습니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;시연 데이터의 다른 이메일 2개:&lt;/b&gt; 이메일마다 2건이 1명이 되어 2명이 줄었습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p style=&quot;margin-bottom: 16px !important;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;막힌 것:&lt;/b&gt; 필터가 없는 이 규칙 집합에서는 매치 규칙이 데이터 공간의 모든 Individual에 적용되므로, 시험 실행에서도 시연 데이터가 함께 묶였습니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;이메일만 보는 규칙:&lt;/b&gt; 공용 메일 주소를 함께 쓰는 서로 다른 사람도 묶습니다. Luka MCA Lab도 기업 위탁교육 담당자를 리드로 받으므로, 회사 공용 메일 주소로 들어오는 담당자가 생길 수 있습니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;성과 이메일을 보는 규칙:&lt;/b&gt; 실제 가족은 성과 이메일이 같을 수 있어, 학부모 이메일로 들어온 가족이 함께 묶일 수 있습니다. 이 규칙은 시험하지 않았습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p style=&quot;margin-bottom: 16px !important;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;고른 것:&lt;/b&gt; 기본 매치 규칙을 그대로 두었습니다. 문의 4건은 학부모와 다른 통합 개인으로 남으므로, 이 중복은 CRM에서 문의를 받을 때 기존 학부모와 잇는 방법으로 막기로 했습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;fig-01.png&quot; data-origin-width=&quot;960&quot; data-origin-height=&quot;1660&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/nCIVc/dJMcah0xHSu/mXMoPNsBfUryftZUqKrFWK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/nCIVc/dJMcah0xHSu/mXMoPNsBfUryftZUqKrFWK/img.png&quot; data-alt=&quot;판단 카드: 매치 규칙&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/nCIVc/dJMcah0xHSu/mXMoPNsBfUryftZUqKrFWK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FnCIVc%2FdJMcah0xHSu%2FmXMoPNsBfUryftZUqKrFWK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; alt=&quot;매치 규칙을 어떻게 정할지 묻고, 기본 규칙 그대로, 이메일 단독 규칙 더하기, 성과 이메일로 묶는 규칙 더하기 세 선택지를 비교한 뒤, 기본 규칙을 고른 이유와 대가를 정리한 판단 카드&quot; loading=&quot;lazy&quot; width=&quot;480&quot; height=&quot;830&quot; data-filename=&quot;fig-01.png&quot; data-origin-width=&quot;960&quot; data-origin-height=&quot;1660&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;판단 카드: 매치 규칙&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr data-ke-style=&quot;style5&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;실행&lt;/h2&gt;
&lt;p style=&quot;font-size: 20px !important; font-weight: bold; line-height: 1.6 !important; color: var(--ink); margin-bottom: 16px !important;&quot; data-ke-size=&quot;size20&quot;&gt;기본 규칙으로 실행하면 묶이는 레코드가 없어, 이 org의 Individual 541건이 그대로 통합 개인 541명이 됩니다.&lt;/p&gt;
&lt;p style=&quot;font-size: 18px !important; font-weight: bold; line-height: 1.5 !important; color: var(--ink); margin-bottom: 10px !important;&quot; data-ke-size=&quot;size18&quot;&gt;1. Match Rules 카드를 확인합니다&lt;/p&gt;
&lt;p style=&quot;margin-bottom: 16px !important;&quot; data-ke-size=&quot;size16&quot;&gt;Marketing 앱의 &lt;b&gt;Identity Resolution&lt;/b&gt; 탭에서 규칙 집합(Individual Identity Resolution)을 엽니다. Match Rules 카드에 처음부터 있던 매치 규칙 네 개만 있는지 봅니다.&lt;/p&gt;
&lt;p style=&quot;font-size: 18px !important; font-weight: bold; line-height: 1.5 !important; color: var(--ink); margin-bottom: 10px !important;&quot; data-ke-size=&quot;size18&quot;&gt;2. Run Ruleset을 누릅니다&lt;/p&gt;
&lt;p style=&quot;margin-bottom: 16px !important;&quot; data-ke-size=&quot;size16&quot;&gt;머리 줄의 &lt;b&gt;Run Ruleset&lt;/b&gt;을 누릅니다. 확인 창 없이 실행이 시작되고, 화면을 새로 고치면 Last Job Status가 In Progress로 보입니다.&lt;/p&gt;
&lt;p style=&quot;margin-bottom: 16px !important;&quot; data-ke-size=&quot;size16&quot;&gt;실행이 끝난 뒤 화면을 새로 고치면 Last Job Status가 Succeeded가 됩니다. 이번 실행은 약 6분 걸렸습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;04-기본-규칙-실행-결과.png&quot; data-origin-width=&quot;2104&quot; data-origin-height=&quot;1856&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bwTQEy/dJMcah0xHSA/oVZjKeHk2k3iWAkO3aoofk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bwTQEy/dJMcah0xHSA/oVZjKeHk2k3iWAkO3aoofk/img.png&quot; data-alt=&quot;기본 규칙으로 실행한 결과&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bwTQEy/dJMcah0xHSA/oVZjKeHk2k3iWAkO3aoofk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbwTQEy%2FdJMcah0xHSA%2FoVZjKeHk2k3iWAkO3aoofk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; alt=&quot;매치 규칙 네 개가 있는 Match Rules 카드 옆에서 Last Job Status Succeeded와 Resolution Summary의 Total Unified Profiles 541 / 541 Source Profiles, Consolidation Rate 0%가 강조된 규칙 집합 상세&quot; loading=&quot;lazy&quot; width=&quot;720&quot; height=&quot;635&quot; data-filename=&quot;04-기본-규칙-실행-결과.png&quot; data-origin-width=&quot;2104&quot; data-origin-height=&quot;1856&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;기본 규칙으로 실행한 결과&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;font-size: 14px !important; line-height: 1.7 !important; color: var(--muted); margin-bottom: 16px !important;&quot; data-ke-size=&quot;size14&quot;&gt;실행 중에는 Resolution Summary가 앞선 실행의 수치를 보이므로, Succeeded가 된 뒤에 수치를 읽습니다.&lt;/p&gt;
&lt;p style=&quot;margin-bottom: 16px !important;&quot; data-ke-size=&quot;size16&quot;&gt;시험 실행에서 묶였던 레코드는 이 실행에서 모두 다시 나뉘었습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;fig-02.png&quot; data-origin-width=&quot;960&quot; data-origin-height=&quot;774&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/TDmYz/dJMcaagdLvT/H7XdSxOMwwQCfMa37JtiyK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/TDmYz/dJMcaagdLvT/H7XdSxOMwwQCfMa37JtiyK/img.png&quot; data-alt=&quot;두 실행의 통합 개인 수&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/TDmYz/dJMcaagdLvT/H7XdSxOMwwQCfMa37JtiyK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FTDmYz%2FdJMcaagdLvT%2FH7XdSxOMwwQCfMa37JtiyK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; alt=&quot;시험 규칙 실행과 기본 규칙 실행에서 LUKA Individual 35건과 공용 메일 주소의 Individual 11건이 각각 통합 개인 몇 명이 되었는지 비교한 그림&quot; loading=&quot;lazy&quot; width=&quot;480&quot; height=&quot;387&quot; data-filename=&quot;fig-02.png&quot; data-origin-width=&quot;960&quot; data-origin-height=&quot;774&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;두 실행의 통합 개인 수&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr data-ke-style=&quot;style5&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;결과 확인&lt;/h2&gt;
&lt;p style=&quot;font-size: 20px !important; font-weight: bold; line-height: 1.6 !important; color: var(--ink); margin-bottom: 16px !important;&quot; data-ke-size=&quot;size20&quot;&gt;Query Editor에서 LUKA Individual 35건이 통합 개인 35명으로 나오면, 가상 데이터끼리 묶인 레코드 없이 실행이 끝난 것입니다.&lt;/p&gt;
&lt;p style=&quot;margin-bottom: 16px !important;&quot; data-ke-size=&quot;size16&quot;&gt;Data Cloud의 Query Editor에서 Individual과 Unified Link Individual을 조인해 셉니다. Unified Link Individual은 원천 Individual과 통합 개인을 잇는 DMO입니다.&lt;/p&gt;
&lt;div data-ke-type=&quot;moreLess&quot; data-text-more=&quot;Individual 건수와 통합 개인 수를 세는 SQL 보기&quot; data-text-less=&quot;닫기&quot;&gt;&lt;a class=&quot;btn-toggle-moreless&quot;&gt;더보기&lt;/a&gt;
&lt;div class=&quot;moreless-content&quot;&gt;
&lt;p style=&quot;margin-bottom: 16px !important;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;code&gt;individual_records&lt;/code&gt;는 통합 개인에 이어진 Individual 레코드 수, &lt;code&gt;unified_people&lt;/code&gt;은 그 레코드가 이어진 통합 개인 수입니다. 두 값이 같으면 가상 데이터끼리 묶인 레코드가 없는 것입니다. &lt;code&gt;individual_records&lt;/code&gt;가 가상 데이터 건수(35)보다 적으면 실행에서 빠진 레코드가 있는 것입니다.&lt;/p&gt;
&lt;pre id=&quot;code_2&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;SELECT
  COUNT(i.ssot__Id__c)
    AS individual_records,
  COUNT(DISTINCT l.UnifiedRecordId__c)
    AS unified_people
FROM ssot__Individual__dlm i
JOIN IndividualIdentityLink__dlm l
  ON l.SourceRecordId__c = i.ssot__Id__c
WHERE i.ssot__LastName__c LIKE 'LUKA%'&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;05-완료-확인-조회.png&quot; data-origin-width=&quot;2104&quot; data-origin-height=&quot;1856&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/c7z3Fs/dJMcaf2Jyvs/hnJlZjb3PkaSrwKyuAGcfK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/c7z3Fs/dJMcaf2Jyvs/hnJlZjb3PkaSrwKyuAGcfK/img.png&quot; data-alt=&quot;LUKA Individual과 통합 개인 수&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/c7z3Fs/dJMcaf2Jyvs/hnJlZjb3PkaSrwKyuAGcfK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fc7z3Fs%2FdJMcaf2Jyvs%2FhnJlZjb3PkaSrwKyuAGcfK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; alt=&quot;Query Editor의 Query Result에서 individual_records 35, unified_people 35인 결과 행이 주황 상자로 강조되어 있다&quot; loading=&quot;lazy&quot; width=&quot;720&quot; height=&quot;635&quot; data-filename=&quot;05-완료-확인-조회.png&quot; data-origin-width=&quot;2104&quot; data-origin-height=&quot;1856&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;LUKA Individual과 통합 개인 수&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;margin-bottom: 16px !important;&quot; data-ke-size=&quot;size16&quot;&gt;문의 4건을 CRM에서 기존 학부모와 잇는 방법은 별도 글에서 다룰 예정입니다.&lt;/p&gt;
&lt;div data-ke-type=&quot;moreLess&quot; data-text-more=&quot;그림으로 쉽게 보는 요약 보기&quot; data-text-less=&quot;닫기&quot;&gt;&lt;a class=&quot;btn-toggle-moreless&quot;&gt;더보기&lt;/a&gt;
&lt;div class=&quot;moreless-content&quot;&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;eli5-01.png&quot; data-origin-width=&quot;1440&quot; data-origin-height=&quot;4850&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bsZcjS/dJMcah0xHSH/BAGKRpmkHif9PkA7zTeYW1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bsZcjS/dJMcah0xHSH/BAGKRpmkHif9PkA7zTeYW1/img.png&quot; data-alt=&quot;그림으로 쉽게 보는 요약&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bsZcjS/dJMcah0xHSH/BAGKRpmkHif9PkA7zTeYW1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbsZcjS%2FdJMcah0xHSH%2FBAGKRpmkHif9PkA7zTeYW1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; alt=&quot;같은 사람의 기록을 통합 개인으로 묶는 기능부터, 규칙이 느슨하거나 엄격할 때의 문제, 같은 이메일을 쓴 학부모 문의 4건과 공용 메일 11건, 기본 규칙의 세 조건, 이메일만 보는 시험에서 541건이 525명이 된 결과, 기본 규칙을 둔 선택, 실행 뒤 541건이 541명이고 35건이 35명인 확인까지 일곱 장면으로 보여 주는 요약 그림&quot; loading=&quot;lazy&quot; width=&quot;720&quot; height=&quot;2425&quot; data-filename=&quot;eli5-01.png&quot; data-origin-width=&quot;1440&quot; data-origin-height=&quot;4850&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;그림으로 쉽게 보는 요약&lt;/figcaption&gt;
&lt;/figure&gt;

&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p style=&quot;margin-bottom: 16px !important;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;참고 문서&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;a href=&quot;https://help.salesforce.com/s/articleView?id=mktg.mktg_admin_data_identity_resolution.htm&amp;amp;type=5&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Configure Identity Resolution Rulesets for Marketing Cloud Next&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://help.salesforce.com/s/articleView?id=data.c360_a_identity_resolution.htm&amp;amp;type=5&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Unify Source Profiles&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://help.salesforce.com/s/articleView?id=data.c360_a_match_rules_criteria_fuzzy_normalized.htm&amp;amp;type=5&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Fuzzy and Exact Match Methods&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>프로젝트</category>
      <category>Data Cloud</category>
      <category>Identity Resolution</category>
      <category>MCN</category>
      <category>portfolio</category>
      <author>Luka.dev</author>
      <guid isPermaLink="true">https://jt98.tistory.com/44</guid>
      <comments>https://jt98.tistory.com/44#entry44comment</comments>
      <pubDate>Tue, 20 Oct 2026 16:32:06 +0900</pubDate>
    </item>
    <item>
      <title>Luka MCA Lab 구축기 | 커스텀 오브젝트를 Data Cloud로 가져와 DMO에 매핑하는법</title>
      <link>https://jt98.tistory.com/43</link>
      <description>&lt;div class=&quot;greeting&quot;&gt;
&lt;p style=&quot;line-height: 1.8 !important; margin: 0 0 0px !important;&quot; data-ke-size=&quot;size16&quot;&gt;안녕하세요, 루카입니다. 오늘은 Luka MCA Lab의 수강 데이터를 Data Cloud로 가져와 사람 데이터와 이어 보겠습니다.&lt;/p&gt;
&lt;/div&gt;
&lt;hr data-ke-style=&quot;style5&quot; /&gt;
&lt;div class=&quot;lead-box&quot; style=&quot;background: color-mix(in srgb, var(--brand) 7%, transparent); border-top: 4px solid var(--brand); border-radius: 10px; padding: 18px 24px 16px; margin: 8px 0 28px;&quot;&gt;
&lt;p style=&quot;font-size: 20px !important; font-weight: bold; line-height: 1.55 !important; color: var(--ink); margin: 0 0 8px !important;&quot; data-ke-size=&quot;size16&quot;&gt;데이터 스트림(Data Stream)은 Salesforce CRM 같은 원천의 레코드를 Data Cloud로 가져오고, 원천이 바뀌면 그 변경도 이어서 반영하는 기능입니다.&lt;/p&gt;
&lt;p style=&quot;font-size: 16px !important; line-height: 1.7 !important; margin: 0 0 4px !important;&quot; data-ke-size=&quot;size16&quot;&gt;세그먼트는 Data Cloud의 데이터 모델 오브젝트(DMO)를 조건으로 읽으므로, CRM에 만든 커스텀 오브젝트도 가져와 DMO에 매핑해야 합니다.&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;fig-00.png&quot; data-origin-width=&quot;960&quot; data-origin-height=&quot;342&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cncJWb/dJMcahM0Tof/wzZWrOpAWx6Ms4GyGA2Lmk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cncJWb/dJMcahM0Tof/wzZWrOpAWx6Ms4GyGA2Lmk/img.png&quot; data-alt=&quot;프로젝트 진행 지도&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cncJWb/dJMcahM0Tof/wzZWrOpAWx6Ms4GyGA2Lmk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcncJWb%2FdJMcahM0Tof%2FwzZWrOpAWx6Ms4GyGA2Lmk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; alt=&quot;착수, 데이터, 마케팅, 운영, 제품 다섯 단계가 이어진 진행 지도에서 데이터 단계를 강조하고 이번 편을 데이터 스트림과 DMO 매핑으로 표시한 그림&quot; loading=&quot;lazy&quot; width=&quot;480&quot; height=&quot;171&quot; data-filename=&quot;fig-00.png&quot; data-origin-width=&quot;960&quot; data-origin-height=&quot;342&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;프로젝트 진행 지도&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;margin-bottom: 16px !important;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;이런 독자에게:&lt;/b&gt; CRM의 커스텀 오브젝트를 세그먼트 조건으로 쓰려는 Salesforce 관리자와 구축 컨설턴트에게 맞습니다.&lt;/p&gt;
&lt;p style=&quot;margin-bottom: 16px !important;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;준비할 것&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;Data Cloud와 권한:&lt;/b&gt; Data Cloud가 켜진 Marketing Cloud Next org와 Data Cloud Architect 권한 집합이 필요합니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;커넥터 권한:&lt;/b&gt; Data Cloud Salesforce Connector 권한 집합에 View All Data가 켜져 있으면 그대로 둡니다. 꺼져 있으면 가져올 오브젝트와 그 오브젝트가 참조하는 Campaign, Contact에 Read와 View All Records를 줍니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;사람 데이터:&lt;/b&gt; Prospect와 Contact가 데이터 키트의 스트림으로 들어와 Individual에 매핑되어 있어야 합니다. 이 org에서는 Marketing Cloud Next를 켤 때 이미 그렇게 만들어졌습니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;앞 글:&lt;/b&gt; 오브젝트와 가상 데이터는 &lt;a href=&quot;https://jt98.tistory.com/34&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;PRJ-04&lt;/a&gt;에서, 데이터 모델은 &lt;a href=&quot;https://jt98.tistory.com/28&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;PRJ-03&lt;/a&gt;에서 정했습니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;org 별칭:&lt;/b&gt; 명령의 org 별칭은 &lt;code&gt;my-org&lt;/code&gt;입니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p style=&quot;margin-bottom: 16px !important;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;완료 확인:&lt;/b&gt; 아래 세 가지가 보이면 끝입니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;스트림 목록의 Total Records가 6, 20, 14입니다.&lt;/li&gt;
&lt;li&gt;DMO 관계 6개가 모두 Active입니다.&lt;/li&gt;
&lt;li&gt;세그먼트 빌더의 Individual에서 관심 과정을 거쳐 과정의 속성까지 열립니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;가져올 범위&lt;/h2&gt;
&lt;p style=&quot;font-size: 20px !important; font-weight: bold; line-height: 1.6 !important; color: var(--ink); margin-bottom: 16px !important;&quot; data-ke-size=&quot;size20&quot;&gt;이 org의 데이터 키트는 표준 오브젝트만 가져오므로, 과정, 관심 과정, 수강 신청 세 오브젝트의 데이터 스트림은 직접 만듭니다.&lt;/p&gt;
&lt;p style=&quot;margin-bottom: 16px !important;&quot; data-ke-size=&quot;size16&quot;&gt;데이터 키트는 Marketing Cloud Next를 켤 때 표준 오브젝트의 스트림과 매핑을 한꺼번에 만들어 준 묶음입니다. 키트가 만든 Prospect, Contact의 스트림은 그대로 둡니다.&lt;/p&gt;
&lt;p style=&quot;margin-bottom: 16px !important;&quot; data-ke-size=&quot;size16&quot;&gt;가져온 필드를 DMO의 필드에 대응시키는 일을 매핑이라고 합니다.&lt;/p&gt;
&lt;p style=&quot;margin-bottom: 16px !important;&quot; data-ke-size=&quot;size16&quot;&gt;이 글에서 문의자는 Prospect이고, 수강생과 학부모는 Contact입니다. 세 오브젝트에 담긴 데이터는 아래와 같습니다.&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;오브젝트&lt;/th&gt;
&lt;th&gt;레코드&lt;/th&gt;
&lt;th&gt;담긴 핵심 필드&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;과정&lt;/td&gt;
&lt;td&gt;6&lt;/td&gt;
&lt;td&gt;과정 코드, 개강일, 지점, 캠페인&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;관심 과정&lt;/td&gt;
&lt;td&gt;20&lt;/td&gt;
&lt;td&gt;과정, Contact, 고유 키&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;수강 신청&lt;/td&gt;
&lt;td&gt;14&lt;/td&gt;
&lt;td&gt;과정, 수강생, 연락 대상, 마지막 수강일&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p style=&quot;margin-bottom: 16px !important;&quot; data-ke-size=&quot;size16&quot;&gt;수강 신청은 수강생과 연락 대상(14세 미만이면 학부모)을 Contact 조회 필드로 가리킵니다. 관심 과정은 아직 Contact가 없는 문의자도 가리켜야 하므로, 문의자의 Prospect ID를 담는 텍스트 필드 &lt;b&gt;사람 ID&lt;/b&gt;를 더합니다.&lt;/p&gt;
&lt;p style=&quot;margin-bottom: 16px !important;&quot; data-ke-size=&quot;size16&quot;&gt;스트림을 만든 뒤에 필드를 더하면 스트림과 매핑을 다시 손봐야 하므로, 사람 ID 필드부터 더합니다. 가져올 오브젝트가 Contact 조회 필드로만 사람을 가리킨다면 이 단계는 건너뜁니다.&lt;/p&gt;
&lt;p style=&quot;font-size: 18px !important; font-weight: bold; line-height: 1.5 !important; color: var(--ink); margin-bottom: 10px !important;&quot; data-ke-size=&quot;size18&quot;&gt;1. 사람 ID 필드를 더하고 채웁니다&lt;/p&gt;
&lt;p style=&quot;margin-bottom: 16px !important;&quot; data-ke-size=&quot;size16&quot;&gt;필드를 소스에 더하고, 권한 집합 LUKA_MCA_Lab_Data에 이 필드의 읽기와 쓰기 권한을 더해 함께 배포합니다.&lt;/p&gt;
&lt;div data-ke-type=&quot;moreLess&quot; data-text-more=&quot;사람 ID 필드와 권한 소스 보기&quot; data-text-less=&quot;닫기&quot;&gt;&lt;a class=&quot;btn-toggle-moreless&quot;&gt;더보기&lt;/a&gt;
&lt;div class=&quot;moreless-content&quot;&gt;
&lt;p style=&quot;margin-bottom: 16px !important;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;fields/LUKA_PersonId__c.field-meta.xml&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1&quot; class=&quot;xml&quot; data-ke-language=&quot;xml&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&amp;gt;
&amp;lt;CustomField xmlns=&quot;http://soap.sforce.com/2006/04/metadata&quot;&amp;gt;
    &amp;lt;fullName&amp;gt;LUKA_PersonId__c&amp;lt;/fullName&amp;gt;
    &amp;lt;label&amp;gt;사람 ID&amp;lt;/label&amp;gt;
    &amp;lt;externalId&amp;gt;false&amp;lt;/externalId&amp;gt;
    &amp;lt;length&amp;gt;18&amp;lt;/length&amp;gt;
    &amp;lt;required&amp;gt;false&amp;lt;/required&amp;gt;
    &amp;lt;type&amp;gt;Text&amp;lt;/type&amp;gt;
    &amp;lt;unique&amp;gt;false&amp;lt;/unique&amp;gt;
&amp;lt;/CustomField&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;margin-bottom: 16px !important;&quot; data-ke-size=&quot;size16&quot;&gt;권한 집합의 PermissionSet 안에 아래 항목을 더합니다.&lt;/p&gt;
&lt;pre id=&quot;code_2&quot; class=&quot;xml&quot; data-ke-language=&quot;xml&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;fieldPermissions&amp;gt;
    &amp;lt;editable&amp;gt;true&amp;lt;/editable&amp;gt;
    &amp;lt;field&amp;gt;LUKA_CourseInterest__c.LUKA_PersonId__c&amp;lt;/field&amp;gt;
    &amp;lt;readable&amp;gt;true&amp;lt;/readable&amp;gt;
&amp;lt;/fieldPermissions&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p style=&quot;margin-bottom: 16px !important;&quot; data-ke-size=&quot;size16&quot;&gt;이어서 기존 관심 과정 20건의 사람 ID를 채웁니다. 스크립트는 고유 키의 이메일로 Prospect를 찾아 그 ID를 씁니다. 맞는 Prospect가 없거나 둘 이상이면 아무것도 쓰지 않고 멈춥니다.&lt;/p&gt;
&lt;p style=&quot;margin-bottom: 16px !important;&quot; data-ke-size=&quot;size16&quot;&gt;먼저 옵션 없이 실행해 계획만 확인합니다. 찾은 것이 20건이면 &lt;code&gt;--apply&lt;/code&gt;를 붙여 다시 실행합니다.&lt;/p&gt;
&lt;pre id=&quot;code_3&quot; class=&quot;plaintext&quot; data-ke-language=&quot;plaintext&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;python fill_person_id.py --org my-org
python fill_person_id.py --org my-org \
  --apply&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;margin-bottom: 16px !important;&quot; data-ke-size=&quot;size16&quot;&gt;마지막 줄에는 사람 ID가 채워진 관심 과정 수가 나옵니다. 이 값이 20이면 끝입니다.&lt;/p&gt;
&lt;div data-ke-type=&quot;moreLess&quot; data-text-more=&quot;사람 ID 채우기 스크립트 전문 보기&quot; data-text-less=&quot;닫기&quot;&gt;&lt;a class=&quot;btn-toggle-moreless&quot;&gt;더보기&lt;/a&gt;
&lt;div class=&quot;moreless-content&quot;&gt;
&lt;pre id=&quot;code_4&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import argparse
import json
import shutil
import subprocess
import sys

parser = argparse.ArgumentParser()
parser.add_argument(
    '--org', default='my-org',
    help='sf CLI 의 org 별칭')
parser.add_argument(
    '--name-prefix',
    default='LUKA\\_문의',
    help=&quot;Prospect LastName LIKE &quot;
         &quot;에 쓸 앞부분(밑줄은 &quot;
         &quot;\\_ 로 이스케이프)&quot;)
parser.add_argument(
    '--apply', action='store_true',
    help='실제로 쓴다. '
         '없으면 계획만 찍는다')
args = parser.parse_args()

SF = shutil.which('sf')


def sf(*argv):
    out = subprocess.run(
        [SF, *argv, '-o', args.org,
         '--json',
         '--api-version', '67.0'],
        capture_output=True,
        text=True, encoding='utf-8')
    text = out.stdout
    # CLI 가 JSON 앞에 안내 줄을
    # 붙일 때가 있다
    data = json.loads(
        text[text.index('{'):])
    if data.get('status') != 0:
        sys.exit(
            'sf 오류: '
            + str(
                data.get('message')))
    return data['result']


def query(soql):
    return sf(
        'data', 'query', '-q', soql
    )['records']


interests = query(
    'SELECT Id, LUKA_UniqueKey__c '
    'FROM LUKA_CourseInterest__c '
    'ORDER BY LUKA_UniqueKey__c')
prospects = query(
    &quot;SELECT Id, Email FROM Prospect &quot;
    &quot;WHERE LastName LIKE &quot;
    f&quot;'{args.name_prefix}%'&quot;)

by_email = {}
for p in prospects:
    by_email.setdefault(
        (p['Email'] or '').lower(),
        []).append(p['Id'])

plan, problems = [], []
for r in interests:
    key = r['LUKA_UniqueKey__c'] or ''
    email = key.split('|')[0].lower()
    ids = by_email.get(email, [])
    if len(ids) == 1:
        plan.append((r['Id'], ids[0]))
    else:
        problems.append(
            (key, len(ids)))

print(
    f'관심 과정 {len(interests)}건, '
    f'Prospect {len(prospects)}건, '
    f'찾은 것 {len(plan)}건')
if problems:
    for key, n in problems:
        print(
            f'멈춤: 고유 키 {key} 의 '
            '이메일과 맞는 '
            f'Prospect 가 {n}건')
    sys.exit(1)

if not args.apply:
    print('계획만 찍었다. '
          '쓰려면 --apply 를 준다')
    sys.exit(0)

for interest_id, prospect_id in plan:
    sf('data', 'update', 'record',
       '-s', 'LUKA_CourseInterest__c',
       '-i', interest_id,
       '-v',
       'LUKA_PersonId__c='
       f'{prospect_id}')

print(
    '채운 뒤 사람 ID 가 있는 '
    '관심 과정:',
    sf('data', 'query', '-q',
       'SELECT COUNT() '
       'FROM LUKA_CourseInterest__c '
       'WHERE LUKA_PersonId__c '
       '!= null')['totalSize'])&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;hr data-ke-style=&quot;style5&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;데이터 스트림&lt;/h2&gt;
&lt;p style=&quot;font-size: 20px !important; font-weight: bold; line-height: 1.6 !important; color: var(--ink); margin-bottom: 16px !important;&quot; data-ke-size=&quot;size20&quot;&gt;세 오브젝트는 계속 고쳐지는 레코드이므로, 데이터 스트림의 카테고리를 Other로 두고 가져옵니다.&lt;/p&gt;
&lt;p style=&quot;margin-bottom: 16px !important;&quot; data-ke-size=&quot;size16&quot;&gt;스트림은 오브젝트마다 하나씩 만들어집니다. 카테고리(Category)는 스트림이 가져온 데이터를 Profile, Engagement, Other 가운데 어느 종류로 다룰지 정하는 값입니다.&lt;/p&gt;
&lt;p style=&quot;font-size: 18px !important; font-weight: bold; line-height: 1.5 !important; color: var(--ink); margin-bottom: 10px !important;&quot; data-ke-size=&quot;size18&quot;&gt;1. 원천으로 Salesforce CRM을 고릅니다&lt;/p&gt;
&lt;p style=&quot;margin-bottom: 16px !important;&quot; data-ke-size=&quot;size16&quot;&gt;Data Cloud 앱의 &lt;b&gt;Data Streams&lt;/b&gt; 탭에서 &lt;b&gt;New&lt;/b&gt;를 누르고, &lt;b&gt;Salesforce CRM&lt;/b&gt; 카드를 골라 &lt;b&gt;Next&lt;/b&gt;를 누릅니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;01-원천-고르기.png&quot; data-origin-width=&quot;1900&quot; data-origin-height=&quot;1682&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/GH7h4/dJMcaa8qi9m/Rl52Eyo7hT6aDy8ptFAzU1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/GH7h4/dJMcaa8qi9m/Rl52Eyo7hT6aDy8ptFAzU1/img.png&quot; data-alt=&quot;원천으로 고른 Salesforce CRM&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/GH7h4/dJMcaa8qi9m/Rl52Eyo7hT6aDy8ptFAzU1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FGH7h4%2FdJMcaa8qi9m%2FRl52Eyo7hT6aDy8ptFAzU1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; alt=&quot;New Data Stream 창에서 Salesforce CRM 카드가 선택되어 주황 상자로 강조되어 있다&quot; loading=&quot;lazy&quot; width=&quot;720&quot; height=&quot;637&quot; data-filename=&quot;01-원천-고르기.png&quot; data-origin-width=&quot;1900&quot; data-origin-height=&quot;1682&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;원천으로 고른 Salesforce CRM&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;font-size: 18px !important; font-weight: bold; line-height: 1.5 !important; color: var(--ink); margin-bottom: 10px !important;&quot; data-ke-size=&quot;size18&quot;&gt;2. 가져올 오브젝트를 고릅니다&lt;/p&gt;
&lt;p style=&quot;margin-bottom: 16px !important;&quot; data-ke-size=&quot;size16&quot;&gt;Salesforce Org 단계에서 기본으로 열리는 View Bundles 대신 &lt;b&gt;View Objects&lt;/b&gt;를 누르고 검색 칸에 LUKA를 넣습니다. &lt;b&gt;Is Custom Object&lt;/b&gt; 열에 표시가 있는 과정, 관심 과정, 수강 신청 세 줄을 체크하고 &lt;b&gt;Next&lt;/b&gt;를 누릅니다.&lt;/p&gt;
&lt;p style=&quot;margin-bottom: 16px !important;&quot; data-ke-size=&quot;size16&quot;&gt;Owner Rule로 시작하는 세 줄은 소유자 기준 공유 규칙을 담는 항목이라 고르지 않습니다.&lt;/p&gt;
&lt;p style=&quot;margin-bottom: 16px !important;&quot; data-ke-size=&quot;size16&quot;&gt;스트림 이름은 기본값을 그대로 씁니다. 기본값은 &lt;code&gt;LUKA_Course__c_Home&lt;/code&gt;처럼 오브젝트 API 이름 뒤에 _Home이 붙습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;02-오브젝트-고르기.png&quot; data-origin-width=&quot;1900&quot; data-origin-height=&quot;1540&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/CLT4B/dJMcah0xfcC/NgriQfIqwYYIbIqGBSp5j0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/CLT4B/dJMcah0xfcC/NgriQfIqwYYIbIqGBSp5j0/img.png&quot; data-alt=&quot;체크한 커스텀 오브젝트 3개&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/CLT4B/dJMcah0xfcC/NgriQfIqwYYIbIqGBSp5j0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FCLT4B%2FdJMcah0xfcC%2FNgriQfIqwYYIbIqGBSp5j0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; alt=&quot;View Objects 목록에서 LUKA로 검색한 결과 가운데 과정, 관심 과정, 수강 신청 세 커스텀 오브젝트가 체크되어 주황 상자로 강조되어 있다&quot; loading=&quot;lazy&quot; width=&quot;720&quot; height=&quot;584&quot; data-filename=&quot;02-오브젝트-고르기.png&quot; data-origin-width=&quot;1900&quot; data-origin-height=&quot;1540&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;체크한 커스텀 오브젝트 3개&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;margin-bottom: 16px !important;&quot; data-ke-size=&quot;size16&quot;&gt;목록 위 안내줄은 앞으로 만들 필드와 오브젝트도 가져오도록, 커넥터 권한 집합에 View All Fields (Global)를 주라고 권합니다. 이 글의 세 오브젝트는 이미 목록에 보이므로 그대로 진행합니다.&lt;/p&gt;
&lt;p style=&quot;font-size: 18px !important; font-weight: bold; line-height: 1.5 !important; color: var(--ink); margin-bottom: 10px !important;&quot; data-ke-size=&quot;size18&quot;&gt;3. 카테고리를 정하고 필드를 확인합니다&lt;/p&gt;
&lt;p style=&quot;margin-bottom: 16px !important;&quot; data-ke-size=&quot;size16&quot;&gt;다음 화면에서 오브젝트마다 카테고리를 고릅니다. 화면에 &quot;After saving the data stream, you can't change the category.&quot;라는 안내가 있으므로, 저장하기 전에 정합니다. 이 글은 아래 판단 카드의 기준으로 세 오브젝트 모두 Other를 골랐습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;fig-01.png&quot; data-origin-width=&quot;960&quot; data-origin-height=&quot;1432&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/oqiIs/dJMcaiSRfQA/rK42kidr5c7H5HnSs1TfJ0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/oqiIs/dJMcaiSRfQA/rK42kidr5c7H5HnSs1TfJ0/img.png&quot; data-alt=&quot;판단 카드: 카테고리&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/oqiIs/dJMcaiSRfQA/rK42kidr5c7H5HnSs1TfJ0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FoqiIs%2FdJMcaiSRfQA%2FrK42kidr5c7H5HnSs1TfJ0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; alt=&quot;세 오브젝트의 카테고리를 어떻게 정할지 묻고, Profile, Engagement, Other 세 선택지를 비교한 뒤, 계속 고쳐지는 레코드라 Other를 고른 이유와 대가를 정리한 판단 카드&quot; loading=&quot;lazy&quot; width=&quot;480&quot; height=&quot;716&quot; data-filename=&quot;fig-01.png&quot; data-origin-width=&quot;960&quot; data-origin-height=&quot;1432&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;판단 카드: 카테고리&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;margin-bottom: 16px !important;&quot; data-ke-size=&quot;size16&quot;&gt;카테고리는 처음에 비어 있으므로, 왼쪽 목록에서 세 오브젝트를 하나씩 열어 아래 두 가지를 합니다. &lt;b&gt;Primary Key&lt;/b&gt;는 &lt;b&gt;Record ID&lt;/b&gt;로 정해져 있어 바꿀 수 없습니다.&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;b&gt;Object Category&lt;/b&gt;에서 &lt;b&gt;Other&lt;/b&gt;를 고릅니다.&lt;/li&gt;
&lt;li&gt;필드는 모두 체크된 그대로 둡니다. 관심 과정에서는 사람 ID도 체크되어 있는지 확인합니다.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;03-필드와-카테고리.png&quot; data-origin-width=&quot;1900&quot; data-origin-height=&quot;1584&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/m20TN/dJMcabM3nL1/bTyKw5CK7uB4zfnKbGtLq0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/m20TN/dJMcabM3nL1/bTyKw5CK7uB4zfnKbGtLq0/img.png&quot; data-alt=&quot;Object Category를 Other로 고른 화면&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/m20TN/dJMcabM3nL1/bTyKw5CK7uB4zfnKbGtLq0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fm20TN%2FdJMcabM3nL1%2FbTyKw5CK7uB4zfnKbGtLq0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; alt=&quot;수강 신청 상세 화면에서 Object Category가 Other로 선택되어 주황 상자로 강조되어 있고, 아래 Custom Fields 탭에 수강생, 마지막 수강일, 과정, 연락 대상 필드가 체크되어 있다&quot; loading=&quot;lazy&quot; width=&quot;720&quot; height=&quot;600&quot; data-filename=&quot;03-필드와-카테고리.png&quot; data-origin-width=&quot;1900&quot; data-origin-height=&quot;1584&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Object Category를 Other로 고른 화면&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;font-size: 18px !important; font-weight: bold; line-height: 1.5 !important; color: var(--ink); margin-bottom: 10px !important;&quot; data-ke-size=&quot;size18&quot;&gt;4. Deploy하고 목록에서 건수를 확인합니다&lt;/p&gt;
&lt;p style=&quot;margin-bottom: 16px !important;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Next&lt;/b&gt;를 누르면 Data Space와 카테고리를 확인하는 화면이 나옵니다. Data Space가 default이고 Category 열의 세 줄이 모두 Other면 &lt;b&gt;Deploy&lt;/b&gt;를 누릅니다.&lt;/p&gt;
&lt;p style=&quot;margin-bottom: 16px !important;&quot; data-ke-size=&quot;size16&quot;&gt;Deploy하면 스트림마다 가져온 원본 테이블(Data Lake Object, DLO)이 만들어집니다. 이어서 Data Streams 목록에서 LUKA로 검색합니다. &lt;b&gt;Last Run Status&lt;/b&gt;가 Success이고 &lt;b&gt;Total Records&lt;/b&gt;가 6, 20, 14면 가져오기가 끝난 것입니다.&lt;/p&gt;
&lt;p style=&quot;font-size: 14px !important; line-height: 1.7 !important; color: var(--muted); margin-bottom: 16px !important;&quot; data-ke-size=&quot;size14&quot;&gt;이번 시험에서 목록은 약 5분 뒤에 Success가 되었지만, SQL로 DLO를 조회하면 약 10분 뒤부터 보였습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;04-스트림-목록.png&quot; data-origin-width=&quot;1936&quot; data-origin-height=&quot;696&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/zLSp4/dJMcafojVji/nFfHoXWZKWSsuSpxGzKMWk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/zLSp4/dJMcafojVji/nFfHoXWZKWSsuSpxGzKMWk/img.png&quot; data-alt=&quot;가져오기가 끝난 스트림 목록&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/zLSp4/dJMcafojVji/nFfHoXWZKWSsuSpxGzKMWk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FzLSp4%2FdJMcafojVji%2FnFfHoXWZKWSsuSpxGzKMWk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; alt=&quot;Data Streams 목록에서 LUKA 스트림 세 개의 Last Run Status가 Success이고 Total Records가 6, 20, 14로 주황 상자로 강조되어 있다&quot; loading=&quot;lazy&quot; width=&quot;720&quot; height=&quot;259&quot; data-filename=&quot;04-스트림-목록.png&quot; data-origin-width=&quot;1936&quot; data-origin-height=&quot;696&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;가져오기가 끝난 스트림 목록&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr data-ke-style=&quot;style5&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;DMO 매핑&lt;/h2&gt;
&lt;p style=&quot;font-size: 20px !important; font-weight: bold; line-height: 1.6 !important; color: var(--ink); margin-bottom: 16px !important;&quot; data-ke-size=&quot;size20&quot;&gt;세 오브젝트에 맞는 표준 DMO를 찾지 못해, 모두 커스텀 DMO를 만들어 매핑합니다.&lt;/p&gt;
&lt;p style=&quot;margin-bottom: 16px !important;&quot; data-ke-size=&quot;size16&quot;&gt;수강 신청의 후보로 본 표준 DMO는 주문을 담는 Sales Order였지만, 과정을 둘 필드가 없었습니다. 과정과 관심 과정도 맞는 표준 DMO를 찾지 못했습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;fig-02.png&quot; data-origin-width=&quot;960&quot; data-origin-height=&quot;1488&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/F4was/dJMcaiSRfQG/r7iQVQAkyZfC8G1vDOnkYk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/F4was/dJMcaiSRfQG/r7iQVQAkyZfC8G1vDOnkYk/img.png&quot; data-alt=&quot;판단 카드: 어느 DMO에 매핑할지&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/F4was/dJMcaiSRfQG/r7iQVQAkyZfC8G1vDOnkYk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FF4was%2FdJMcaiSRfQG%2Fr7iQVQAkyZfC8G1vDOnkYk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; alt=&quot;수강 신청을 어느 DMO에 매핑할지 묻고, Sales Order에 매핑, Sales Order에 커스텀 필드 더하기, 커스텀 DMO 세 선택지를 비교한 뒤, 커스텀 DMO를 고른 이유와 대가를 정리한 판단 카드&quot; loading=&quot;lazy&quot; width=&quot;480&quot; height=&quot;744&quot; data-filename=&quot;fig-02.png&quot; data-origin-width=&quot;960&quot; data-origin-height=&quot;1488&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;판단 카드: 어느 DMO에 매핑할지&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;font-size: 18px !important; font-weight: bold; line-height: 1.5 !important; color: var(--ink); margin-bottom: 10px !important;&quot; data-ke-size=&quot;size18&quot;&gt;1. 커스텀 DMO를 만듭니다&lt;/p&gt;
&lt;p style=&quot;margin-bottom: 16px !important;&quot; data-ke-size=&quot;size16&quot;&gt;수강 신청 스트림의 상세 화면에서 오른쪽 &lt;b&gt;Data Mapping&lt;/b&gt; 구역의 &lt;b&gt;Start&lt;/b&gt;를 누릅니다. 매핑 화면에서 &lt;b&gt;Select Objects&lt;/b&gt;를 열고 &lt;b&gt;Custom Data Model&lt;/b&gt; 탭의 &lt;b&gt;New Custom Object&lt;/b&gt;를 누릅니다.&lt;/p&gt;
&lt;p style=&quot;margin-bottom: 16px !important;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Object Label&lt;/b&gt;에 LUKA_Enrollment를 쓰면 &lt;b&gt;Object API Name&lt;/b&gt;이 따라 바뀝니다. &lt;b&gt;Object Category&lt;/b&gt;는 스트림과 같은 Other로 채워집니다. 필드 목록에는 스트림의 필드가 모두 체크되어 있습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;05-커스텀-DMO-만들기.png&quot; data-origin-width=&quot;1944&quot; data-origin-height=&quot;1536&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cxp6DI/dJMcacSpAjO/vvtDuHDdFDIojAPq1TuLq0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cxp6DI/dJMcacSpAjO/vvtDuHDdFDIojAPq1TuLq0/img.png&quot; data-alt=&quot;새 커스텀 DMO의 이름&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cxp6DI/dJMcacSpAjO/vvtDuHDdFDIojAPq1TuLq0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fcxp6DI%2FdJMcacSpAjO%2FvvtDuHDdFDIojAPq1TuLq0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; alt=&quot;New Custom Object 화면에서 Object Label 칸에 LUKA_Enrollment가 입력되어 주황 상자로 강조되어 있다&quot; loading=&quot;lazy&quot; width=&quot;720&quot; height=&quot;569&quot; data-filename=&quot;05-커스텀-DMO-만들기.png&quot; data-origin-width=&quot;1944&quot; data-origin-height=&quot;1536&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;새 커스텀 DMO의 이름&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;margin-bottom: 16px !important;&quot; data-ke-size=&quot;size16&quot;&gt;만들어진 DMO의 API 이름은 끝에 __dlm이 붙은 &lt;code&gt;LUKA_Enrollment__dlm&lt;/code&gt;입니다.&lt;/p&gt;
&lt;p style=&quot;font-size: 18px !important; font-weight: bold; line-height: 1.5 !important; color: var(--ink); margin-bottom: 10px !important;&quot; data-ke-size=&quot;size18&quot;&gt;2. 필드 매핑을 확인합니다&lt;/p&gt;
&lt;p style=&quot;margin-bottom: 16px !important;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Save&lt;/b&gt;를 누르면 DMO가 만들어지고, DLO의 필드가 새 DMO의 필드에 자동으로 매핑됩니다. 화면 아래의 &lt;b&gt;Unmapped&lt;/b&gt;가 0이면 매핑이 끝난 것입니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;06-필드-매핑-결과.png&quot; data-origin-width=&quot;2026&quot; data-origin-height=&quot;1636&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/wvTiJ/dJMcaa8qi9A/ctr8YxmcKDck35BND5u961/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/wvTiJ/dJMcaa8qi9A/ctr8YxmcKDck35BND5u961/img.png&quot; data-alt=&quot;필드 매핑이 끝난 화면&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/wvTiJ/dJMcaa8qi9A/ctr8YxmcKDck35BND5u961/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FwvTiJ%2FdJMcaa8qi9A%2Fctr8YxmcKDck35BND5u961%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; alt=&quot;필드 매핑 화면에서 DMO의 필드 16개가 모두 선으로 이어져 있고 아래 Unmapped (0)이 주황 상자로 강조되어 있다&quot; loading=&quot;lazy&quot; width=&quot;720&quot; height=&quot;581&quot; data-filename=&quot;06-필드-매핑-결과.png&quot; data-origin-width=&quot;2026&quot; data-origin-height=&quot;1636&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;필드 매핑이 끝난 화면&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;margin-bottom: 16px !important;&quot; data-ke-size=&quot;size16&quot;&gt;과정과 관심 과정도 같은 순서로 매핑합니다. DMO 이름은 LUKA_Course와 LUKA_CourseInterest입니다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style5&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;사람과 잇기&lt;/h2&gt;
&lt;p style=&quot;font-size: 20px !important; font-weight: bold; line-height: 1.6 !important; color: var(--ink); margin-bottom: 16px !important;&quot; data-ke-size=&quot;size20&quot;&gt;Individual의 ID는 원천 레코드의 ID와 같으므로, 관심 과정에 담아 둔 Prospect ID로 문의자와 관계를 걸 수 있습니다.&lt;/p&gt;
&lt;p style=&quot;margin-bottom: 16px !important;&quot; data-ke-size=&quot;size16&quot;&gt;관계(Relationship)는 DMO의 필드 하나를 다른 DMO의 키와 잇는 설정입니다.&lt;/p&gt;
&lt;p style=&quot;margin-bottom: 16px !important;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;목적:&lt;/b&gt; 세그먼트는 Individual에서 출발해 조건을 겁니다. &quot;이 과정에 관심을 표시한 사람&quot;을 고르려면, 관심 과정 레코드가 어느 Individual의 것인지 Data Cloud가 알아야 합니다. 그러려면 관심 과정에 Individual의 ID와 같은 값을 가진 필드가 있어야 합니다.&lt;/p&gt;
&lt;p style=&quot;margin-bottom: 16px !important;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;확인한 사실:&lt;/b&gt; Individual은 Data Cloud에서 사람 한 명을 나타내는 표준 DMO입니다. Individual의 ID는 원천 레코드의 ID를 그대로 씁니다.&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;사람&lt;/th&gt;
&lt;th&gt;원천&lt;/th&gt;
&lt;th&gt;Individual의 ID&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;문의자&lt;/td&gt;
&lt;td&gt;Prospect&lt;/td&gt;
&lt;td&gt;Prospect ID&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;수강생, 학부모&lt;/td&gt;
&lt;td&gt;Contact&lt;/td&gt;
&lt;td&gt;Contact ID&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p style=&quot;margin-bottom: 16px !important;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;기존 필드로 안 되는 이유:&lt;/b&gt; 관심 과정에서 사람을 가리키는 방법은 셋이었지만 모두 막혔습니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;Contact 조회 필드:&lt;/b&gt; 수강생이 된 뒤에야 값이 들어갑니다. 관심 과정의 주인은 대부분 아직 Contact가 없는 문의자입니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;이메일이 든 고유 키:&lt;/b&gt; Individual에는 이메일 필드가 없습니다. 또 문의자 4명은 학부모와 이메일이 같아 한 사람으로 정해지지 않습니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Prospect 조회 필드:&lt;/b&gt; 다른 오브젝트에서 Prospect를 조회 필드로 가리킬 수 없어 배포 단계에서 거절됩니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p style=&quot;margin-bottom: 16px !important;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;고른 것:&lt;/b&gt; 그래서 Prospect ID를 텍스트로 담는 사람 ID를 더했습니다. 값이 Individual의 ID와 같으므로, 조회 필드가 아니어도 관계를 걸 수 있습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;fig-03.png&quot; data-origin-width=&quot;960&quot; data-origin-height=&quot;1376&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/qkiSE/dJMcaiSRfQK/iPCrkn0BPE8h2PU54fWepK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/qkiSE/dJMcaiSRfQK/iPCrkn0BPE8h2PU54fWepK/img.png&quot; data-alt=&quot;판단 카드: 사람과 잇는 키&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/qkiSE/dJMcaiSRfQK/iPCrkn0BPE8h2PU54fWepK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FqkiSE%2FdJMcaiSRfQK%2FiPCrkn0BPE8h2PU54fWepK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; alt=&quot;Data Cloud에서 관심 과정을 사람과 어떻게 이을지 묻고, Contact 관계만, 이메일, 사람 ID 텍스트 필드 세 선택지를 비교한 뒤, 사람 ID를 고른 이유와 대가를 정리한 판단 카드&quot; loading=&quot;lazy&quot; width=&quot;480&quot; height=&quot;688&quot; data-filename=&quot;fig-03.png&quot; data-origin-width=&quot;960&quot; data-origin-height=&quot;1376&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;판단 카드: 사람과 잇는 키&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;margin-bottom: 16px !important;&quot; data-ke-size=&quot;size16&quot;&gt;관계는 모두 여섯 개를 겁니다. 관심 과정과 수강 신청은 각각 과정에 관계를 겁니다. Individual과는 사람 ID, Contact, 수강생, 연락 대상 네 필드로 잇습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;fig-04.png&quot; data-origin-width=&quot;960&quot; data-origin-height=&quot;1322&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/lPad3/dJMcab0x39h/kxfmwEK4v2kQrBrVFJ4NL1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/lPad3/dJMcab0x39h/kxfmwEK4v2kQrBrVFJ4NL1/img.png&quot; data-alt=&quot;DMO 사이의 관계 6개&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/lPad3/dJMcab0x39h/kxfmwEK4v2kQrBrVFJ4NL1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FlPad3%2FdJMcab0x39h%2FkxfmwEK4v2kQrBrVFJ4NL1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; alt=&quot;과정, 관심 과정, 수강 신청 DMO와 Individual 사이에 건 관계 여섯 개와 관계에 쓴 필드를 보여 주는 관계도&quot; loading=&quot;lazy&quot; width=&quot;480&quot; height=&quot;661&quot; data-filename=&quot;fig-04.png&quot; data-origin-width=&quot;960&quot; data-origin-height=&quot;1322&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;DMO 사이의 관계 6개&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;font-size: 14px !important; line-height: 1.7 !important; color: var(--muted); margin-bottom: 16px !important;&quot; data-ke-size=&quot;size14&quot;&gt;관심 과정의 Contact 필드는 이번 데이터에 값이 없지만, 문의자가 수강생이 된 뒤에 쓰도록 관계를 함께 겁니다.&lt;/p&gt;
&lt;p style=&quot;font-size: 18px !important; font-weight: bold; line-height: 1.5 !important; color: var(--ink); margin-bottom: 10px !important;&quot; data-ke-size=&quot;size18&quot;&gt;관계를 걸고 상태를 확인합니다&lt;/p&gt;
&lt;p style=&quot;margin-bottom: 16px !important;&quot; data-ke-size=&quot;size16&quot;&gt;Data Model 탭에서 관심 과정 DMO(LUKA_CourseInterest)를 열고 &lt;b&gt;Relationships&lt;/b&gt; 탭을 엽니다. 관계가 없으면 &lt;b&gt;New&lt;/b&gt;를, 있으면 같은 자리의 &lt;b&gt;Edit&lt;/b&gt;를 눌러 &lt;b&gt;Edit Relationships&lt;/b&gt; 창을 엽니다.&lt;/p&gt;
&lt;p style=&quot;margin-bottom: 16px !important;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;New Relationship&lt;/b&gt;을 눌러 아래 값을 고르고 &lt;b&gt;Save &amp;amp; Close&lt;/b&gt;를 누릅니다. Cardinality는 모든 관계에서 N:1입니다.&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Field&lt;/th&gt;
&lt;th&gt;Related Object&lt;/th&gt;
&lt;th&gt;Related Field&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;사람 ID&lt;/td&gt;
&lt;td&gt;Individual&lt;/td&gt;
&lt;td&gt;Individual Id&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;과정&lt;/td&gt;
&lt;td&gt;LUKA_Course&lt;/td&gt;
&lt;td&gt;Record ID&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Contact&lt;/td&gt;
&lt;td&gt;Individual&lt;/td&gt;
&lt;td&gt;Individual Id&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p style=&quot;margin-bottom: 16px !important;&quot; data-ke-size=&quot;size16&quot;&gt;수강 신청 DMO에도 같은 방법으로 과정, 수강생, 연락 대상 세 관계를 겁니다. 과정은 LUKA_Course의 Record ID에, 수강생과 연락 대상은 Individual의 Individual Id에 잇습니다. 관심 과정에 세 관계를 걸면 Relationships 탭 표에 세 줄이 보입니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;07-관계-목록.png&quot; data-origin-width=&quot;2104&quot; data-origin-height=&quot;936&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cCw5XJ/dJMcabzhnQu/Wkn2NkNr4hJw5iKonXC61K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cCw5XJ/dJMcabzhnQu/Wkn2NkNr4hJw5iKonXC61K/img.png&quot; data-alt=&quot;관계 세 개를 건 뒤의 Relationships 탭&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cCw5XJ/dJMcabzhnQu/Wkn2NkNr4hJw5iKonXC61K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcCw5XJ%2FdJMcabzhnQu%2FWkn2NkNr4hJw5iKonXC61K%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; alt=&quot;관심 과정 DMO의 Relationships 탭 표에서 사람 ID, 과정, Contact 관계 세 행이 주황 상자로 강조되어 있다&quot; loading=&quot;lazy&quot; width=&quot;720&quot; height=&quot;320&quot; data-filename=&quot;07-관계-목록.png&quot; data-origin-width=&quot;2104&quot; data-origin-height=&quot;936&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;관계 세 개를 건 뒤의 Relationships 탭&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;margin-bottom: 16px !important;&quot; data-ke-size=&quot;size16&quot;&gt;표에는 상태 열이 없으므로, 활성 여부는 &lt;b&gt;Edit&lt;/b&gt;로 여는 &lt;b&gt;Edit Relationships&lt;/b&gt; 창의 &lt;b&gt;Active&lt;/b&gt; 스위치로 확인합니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;07b-관계-편집-창.png&quot; data-origin-width=&quot;1546&quot; data-origin-height=&quot;1306&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/tLjwr/dJMcaiLUFkf/FouXcFG33tnRemDwvoUbl1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/tLjwr/dJMcaiLUFkf/FouXcFG33tnRemDwvoUbl1/img.png&quot; data-alt=&quot;Active가 켜진 관계 세 개&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/tLjwr/dJMcaiLUFkf/FouXcFG33tnRemDwvoUbl1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FtLjwr%2FdJMcaiLUFkf%2FFouXcFG33tnRemDwvoUbl1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; alt=&quot;Edit Relationships 창에서 사람 ID, 과정, Contact 관계 세 줄과 켜진 Active 스위치가 주황 상자로 강조되어 있다&quot; loading=&quot;lazy&quot; width=&quot;720&quot; height=&quot;608&quot; data-filename=&quot;07b-관계-편집-창.png&quot; data-origin-width=&quot;1546&quot; data-origin-height=&quot;1306&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Active가 켜진 관계 세 개&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr data-ke-style=&quot;style5&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;세그먼트에서 확인&lt;/h2&gt;
&lt;p style=&quot;font-size: 20px !important; font-weight: bold; line-height: 1.6 !important; color: var(--ink); margin-bottom: 16px !important;&quot; data-ke-size=&quot;size20&quot;&gt;세그먼트 빌더의 Individual 아래에서 관심 과정을 거쳐 과정의 속성까지 고를 수 있으면, 세그먼트 조건으로 쓸 준비가 끝난 것입니다.&lt;/p&gt;
&lt;p style=&quot;margin-bottom: 16px !important;&quot; data-ke-size=&quot;size16&quot;&gt;세그먼트 빌더를 열려면 먼저 세그먼트를 하나 저장합니다.&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;Segments 탭에서 &lt;b&gt;New&lt;/b&gt;를 누르고 Visual, Standard를 고른 뒤 &lt;b&gt;Next&lt;/b&gt;를 누릅니다.&lt;/li&gt;
&lt;li&gt;Segment On에 &lt;b&gt;Individual&lt;/b&gt;을 고르고 이름을 넣은 뒤 &lt;b&gt;Next&lt;/b&gt;를 누릅니다.&lt;/li&gt;
&lt;li&gt;Run Mode를 &lt;b&gt;Do Not Schedule&lt;/b&gt;로 두고 &lt;b&gt;Save&lt;/b&gt;를 누릅니다.&lt;/li&gt;
&lt;/ol&gt;
&lt;div class=&quot;say warn&quot;&gt;&lt;span class=&quot;badge i-alert&quot; aria-hidden=&quot;true&quot;&gt;&lt;/span&gt;
&lt;div&gt;&lt;b&gt;주의&lt;/b&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;확인용 세그먼트는 게시하지 않고, 확인한 뒤 지웁니다. 저장 뒤 Segment Status가 Active, Publish Schedule이 Don't refresh로 보여도 게시된 것은 아닙니다.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p style=&quot;margin-bottom: 16px !important;&quot; data-ke-size=&quot;size16&quot;&gt;빌더 왼쪽 &lt;b&gt;Attributes&lt;/b&gt; 탭에서 &lt;b&gt;Attributes&lt;/b&gt; 단추를 누르고 &lt;b&gt;Resources&lt;/b&gt;의 &lt;b&gt;Individual&lt;/b&gt;을 엽니다. 목록 위쪽에는 Individual 자체의 속성이 나옵니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;08b-세그먼트-빌더-Individual.png&quot; data-origin-width=&quot;2104&quot; data-origin-height=&quot;1096&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bFW1I8/dJMcabM3nMd/ioF8Xt5P3mFl3kiz0laDkk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bFW1I8/dJMcabM3nMd/ioF8Xt5P3mFl3kiz0laDkk/img.png&quot; data-alt=&quot;Resources의 Individual&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bFW1I8/dJMcabM3nMd/ioF8Xt5P3mFl3kiz0laDkk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbFW1I8%2FdJMcabM3nMd%2FioF8Xt5P3mFl3kiz0laDkk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; alt=&quot;세그먼트 빌더 왼쪽 Attributes 탭의 Resources 아래 Individual 링크가 주황 상자로 강조되어 있고, 그 아래에 Individual의 속성 목록이 시작된다&quot; loading=&quot;lazy&quot; width=&quot;720&quot; height=&quot;375&quot; data-filename=&quot;08b-세그먼트-빌더-Individual.png&quot; data-origin-width=&quot;2104&quot; data-origin-height=&quot;1096&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Resources의 Individual&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;margin-bottom: 16px !important;&quot; data-ke-size=&quot;size16&quot;&gt;속성 목록을 내리면 관련 속성 묶음이 이어집니다. 묶음 이름은 &quot;DMO - 관계를 건 필드 라벨&quot; 형식이며, Individual과 건 관계마다 한 줄씩 모두 네 줄이 나옵니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;08-세그먼트-빌더.png&quot; data-origin-width=&quot;2104&quot; data-origin-height=&quot;1576&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dG2qJL/dJMcaa8qi9E/NSRLK11fZeTwA34bDG4FRk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dG2qJL/dJMcaa8qi9E/NSRLK11fZeTwA34bDG4FRk/img.png&quot; data-alt=&quot;Individual 아래의 관련 속성&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dG2qJL/dJMcaa8qi9E/NSRLK11fZeTwA34bDG4FRk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdG2qJL%2FdJMcaa8qi9E%2FNSRLK11fZeTwA34bDG4FRk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; alt=&quot;세그먼트 빌더의 Individual 관련 속성 목록에서 LUKA_CourseInterest 두 줄과 LUKA_Enrollment 두 줄이 주황 상자로 강조되어 있다&quot; loading=&quot;lazy&quot; width=&quot;720&quot; height=&quot;539&quot; data-filename=&quot;08-세그먼트-빌더.png&quot; data-origin-width=&quot;2104&quot; data-origin-height=&quot;1576&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Individual 아래의 관련 속성&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;margin-bottom: 16px !important;&quot; data-ke-size=&quot;size16&quot;&gt;과정은 Individual과 직접 관계가 없으므로 이 목록에 없습니다. &lt;b&gt;LUKA_CourseInterest - 사람 ID&lt;/b&gt;를 누르면 관심 과정의 속성이 나옵니다. 그 아래 &lt;b&gt;LUKA_Course&lt;/b&gt;를 누르면 과정의 속성이 나옵니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;09-관련-속성-과정.png&quot; data-origin-width=&quot;2104&quot; data-origin-height=&quot;1616&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ufnC0/dJMcabM3nMq/xow63QSzaPoXpygkSgylM0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ufnC0/dJMcabM3nMq/xow63QSzaPoXpygkSgylM0/img.png&quot; data-alt=&quot;관심 과정을 거쳐 연 과정의 속성&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ufnC0/dJMcabM3nMq/xow63QSzaPoXpygkSgylM0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FufnC0%2FdJMcabM3nMq%2Fxow63QSzaPoXpygkSgylM0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; alt=&quot;관심 과정을 거쳐 연 LUKA_Course의 속성 목록에서 개강일, 과정 이름, 과정 코드, 지점, 캠페인이 주황 상자로 강조되어 있다&quot; loading=&quot;lazy&quot; width=&quot;720&quot; height=&quot;553&quot; data-filename=&quot;09-관련-속성-과정.png&quot; data-origin-width=&quot;2104&quot; data-origin-height=&quot;1616&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;관심 과정을 거쳐 연 과정의 속성&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;margin-bottom: 16px !important;&quot; data-ke-size=&quot;size16&quot;&gt;과정 이름을 캔버스로 끌면 관심 과정에서 과정으로 이어진 경로와 함께 조건 칸이 열립니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;10-과정-조건.png&quot; data-origin-width=&quot;2104&quot; data-origin-height=&quot;1656&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/uxLo9/dJMcabM3nMu/QJcZ063kiqYac49MWYNfxk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/uxLo9/dJMcabM3nMu/QJcZ063kiqYac49MWYNfxk/img.png&quot; data-alt=&quot;과정 이름으로 거는 조건&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/uxLo9/dJMcabM3nMu/QJcZ063kiqYac49MWYNfxk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FuxLo9%2FdJMcabM3nMu%2FQJcZ063kiqYac49MWYNfxk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; alt=&quot;조건 카드에서 LUKA_CourseInterest.과정에서 LUKA_Course로 이어진 경로와 과정 이름, Is Equal To, 과정 이름을 넣은 값 칸이 주황 상자로 강조되어 있다&quot; loading=&quot;lazy&quot; width=&quot;720&quot; height=&quot;567&quot; data-filename=&quot;10-과정-조건.png&quot; data-origin-width=&quot;2104&quot; data-origin-height=&quot;1656&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;과정 이름으로 거는 조건&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;margin-bottom: 16px !important;&quot; data-ke-size=&quot;size16&quot;&gt;값이 실제로 이어졌는지는 Query Editor에서 DMO를 조인해 사람 이름과 과정 이름으로 확인합니다. 이번 시험에서는 관심 과정 20건과 수강 신청 14건 모두 두 이름이 나왔습니다.&lt;/p&gt;
&lt;div data-ke-type=&quot;moreLess&quot; data-text-more=&quot;관심 과정과 수강 신청 조인 SQL 보기&quot; data-text-less=&quot;닫기&quot;&gt;&lt;a class=&quot;btn-toggle-moreless&quot;&gt;더보기&lt;/a&gt;
&lt;div class=&quot;moreless-content&quot;&gt;
&lt;p style=&quot;margin-bottom: 16px !important;&quot; data-ke-size=&quot;size16&quot;&gt;DMO에서는 CRM 필드 이름의 끝이 &lt;code&gt;_c__c&lt;/code&gt;로 바뀝니다.&lt;/p&gt;
&lt;p style=&quot;margin-bottom: 16px !important;&quot; data-ke-size=&quot;size16&quot;&gt;아래 쿼리는 JOIN으로 사람과 과정을 붙이므로 이어지지 않은 관심 과정은 결과에서 빠집니다. 20행이 모두 나오면 20건이 다 이어진 것입니다.&lt;/p&gt;
&lt;pre id=&quot;code_5&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;SELECT p.ssot__LastName__c AS person,
  c.Name__c AS course
FROM LUKA_CourseInterest__dlm i
JOIN ssot__Individual__dlm p
  ON i.LUKA_PersonId_c__c
   = p.ssot__Id__c
JOIN LUKA_Course__dlm c
  ON i.LUKA_Course_c__c = c.Id__c
ORDER BY person&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;margin-bottom: 16px !important;&quot; data-ke-size=&quot;size16&quot;&gt;수강 신청 쿼리는 수강생과 연락 대상을 각각 Individual에 조인합니다. 수강 신청 한 건이 한 행이라 14행이 나옵니다. 14세 미만 수강생 8건은 연락 대상이 학부모라서 두 이름이 다릅니다.&lt;/p&gt;
&lt;pre id=&quot;code_6&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;SELECT s.ssot__LastName__c AS student,
  t.ssot__LastName__c
    AS contact_person,
  c.Name__c AS course
FROM LUKA_Enrollment__dlm e
JOIN ssot__Individual__dlm s
  ON e.LUKA_Student_c__c
   = s.ssot__Id__c
JOIN ssot__Individual__dlm t
  ON e.LUKA_ContactPerson_c__c
   = t.ssot__Id__c
JOIN LUKA_Course__dlm c
  ON e.LUKA_Course_c__c = c.Id__c
ORDER BY student&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p style=&quot;margin-bottom: 16px !important;&quot; data-ke-size=&quot;size16&quot;&gt;여러 원천의 같은 사람을 하나로 묶는 동일인 판정(Identity Resolution)은 별도 글에서 다룰 예정입니다.&lt;/p&gt;
&lt;div data-ke-type=&quot;moreLess&quot; data-text-more=&quot;그림으로 쉽게 보는 요약 보기&quot; data-text-less=&quot;닫기&quot;&gt;&lt;a class=&quot;btn-toggle-moreless&quot;&gt;더보기&lt;/a&gt;
&lt;div class=&quot;moreless-content&quot;&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;eli5-01.png&quot; data-origin-width=&quot;1440&quot; data-origin-height=&quot;5388&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bexUaL/dJMcafojVkd/E9CnT4fIARDbLGV2R81NH0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bexUaL/dJMcafojVkd/E9CnT4fIARDbLGV2R81NH0/img.png&quot; data-alt=&quot;그림으로 쉽게 보는 요약&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bexUaL/dJMcafojVkd/E9CnT4fIARDbLGV2R81NH0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbexUaL%2FdJMcafojVkd%2FE9CnT4fIARDbLGV2R81NH0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; alt=&quot;왜 가져오나, 세 오브젝트, 사람 ID, 데이터 스트림, 커스텀 DMO 매핑, 관계 6개, 세그먼트 빌더 확인의 일곱 장면으로 글 전체를 줄인 요약 그림&quot; loading=&quot;lazy&quot; width=&quot;720&quot; height=&quot;2694&quot; data-filename=&quot;eli5-01.png&quot; data-origin-width=&quot;1440&quot; data-origin-height=&quot;5388&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;그림으로 쉽게 보는 요약&lt;/figcaption&gt;
&lt;/figure&gt;

&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p style=&quot;margin-bottom: 16px !important;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;참고 문서&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;a href=&quot;https://help.salesforce.com/s/articleView?id=data.c360_a_create_crm_data_stream.htm&amp;amp;type=5&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Create a Salesforce CRM Data Stream&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://help.salesforce.com/s/articleView?id=data.c360_a_enable_user_permissions_external_salesforce_org.htm&amp;amp;type=5&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Salesforce CRM Permissions&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://help.salesforce.com/s/articleView?id=data.c360_a_crm_enable_object_and_field_permissions.htm&amp;amp;type=5&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Enable Object and Field Permissions for CRM Connections&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://help.salesforce.com/s/articleView?id=data.c360_a_category.htm&amp;amp;type=5&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Category&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://help.salesforce.com/s/articleView?id=data.c360_a_map_custom_data_model_objects.htm&amp;amp;type=5&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Map Data Model Objects&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://help.salesforce.com/s/articleView?id=data.c360_a_data_mapping_best_practices.htm&amp;amp;type=5&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Data Mapping Best Practices&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://help.salesforce.com/s/articleView?id=data.c360_a_data_model_object_relationships.htm&amp;amp;type=5&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Data Model Object Relationships&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://help.salesforce.com/s/articleView?id=mktg.mktg_admin_dmo_mappings_reengagement_trigger.htm&amp;amp;type=5&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;DMO Mappings for Reengagement Trigger&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://developer.salesforce.com/docs/data/data-cloud-dmo-mapping/guide/c360dm-sales-order-dmo.html&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Sales Order DMO&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://developer.salesforce.com/docs/data/data-cloud-dmo-mapping/guide/c360dm-crm-prospect.html&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Salesforce CRM: Prospect Mappings&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>프로젝트</category>
      <category>Data Cloud</category>
      <category>MCN</category>
      <category>portfolio</category>
      <author>Luka.dev</author>
      <guid isPermaLink="true">https://jt98.tistory.com/43</guid>
      <comments>https://jt98.tistory.com/43#entry43comment</comments>
      <pubDate>Tue, 20 Oct 2026 10:42:32 +0900</pubDate>
    </item>
    <item>
      <title>Agentforce | 블로그에 Agentforce 채팅 위젯 설치하기</title>
      <link>https://jt98.tistory.com/42</link>
      <description>&lt;div class=&quot;greeting&quot;&gt;
&lt;p style=&quot;line-height: 1.8 !important; margin: 0 0 0px !important;&quot; data-ke-size=&quot;size16&quot;&gt;안녕하세요, 루카입니다. 오늘은 티스토리 블로그에 Agentforce 에이전트와 대화하는 채팅 창을 달아 보겠습니다.&lt;/p&gt;
&lt;/div&gt;
&lt;hr data-ke-style=&quot;style5&quot; /&gt;
&lt;div class=&quot;lead-box&quot; style=&quot;background: color-mix(in srgb, var(--brand) 7%, transparent); border-top: 4px solid var(--brand); border-radius: 10px; padding: 18px 24px 16px; margin: 8px 0 28px;&quot;&gt;
&lt;p style=&quot;font-size: 20px !important; font-weight: bold; line-height: 1.55 !important; color: var(--ink); margin: 0 0 8px !important;&quot; data-ke-size=&quot;size16&quot;&gt;Vercel Functions(Vercel 함수)는 요청이 올 때만 실행되는 서버 코드를 서버 관리 없이 배포하는 기능입니다.&lt;/p&gt;
&lt;p style=&quot;font-size: 16px !important; line-height: 1.7 !important; margin: 0 0 4px !important;&quot; data-ke-size=&quot;size16&quot;&gt;Agent API의 Consumer Secret을 블로그 페이지에 넣으면 누구나 볼 수 있으므로, Secret을 보관하고 Agent API를 대신 불러 줄 Vercel 함수가 필요합니다.&lt;/p&gt;
&lt;/div&gt;
&lt;p style=&quot;margin-bottom: 16px !important;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;준비할 것&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;에이전트와 앱:&lt;/b&gt; &lt;a href=&quot;https://jt98.tistory.com/40&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Agent API로 Salesforce 밖에서 에이전트와 대화하기&lt;/a&gt;에서 만든 활성 에이전트와 External Client App이 필요합니다. 그 글에서 확인한 Consumer Key&amp;middot;Secret, My Domain 주소, Agent ID를 환경변수로 씁니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;개발 도구:&lt;/b&gt; Node.js 20 이상과 Vercel 계정이 필요합니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Vercel 플랜:&lt;/b&gt; 이번에는 무료 Hobby 플랜을 썼습니다. Hobby 플랜은 비상업적인 개인 용도로만 쓸 수 있어서, 회사 사이트에는 Pro 플랜이 필요합니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;블로그 권한:&lt;/b&gt; 티스토리 블로그의 관리자 권한(스킨 편집)이 필요합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p style=&quot;margin-bottom: 16px !important;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;완료 확인:&lt;/b&gt; 블로그 아무 페이지에서 오른쪽 아래 &lt;b&gt;에이전트에게 묻기&lt;/b&gt;를 눌러 질문했을 때, 에이전트의 한국어 답이 창에 뜨면 끝입니다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;구성&lt;/h2&gt;
&lt;p style=&quot;font-size: 20px !important; font-weight: bold; line-height: 1.6 !important; color: var(--ink); margin-bottom: 16px !important;&quot; data-ke-size=&quot;size20&quot;&gt;브라우저는 Vercel 함수만 부르고, Consumer Secret과 토큰은 그 함수 안에서만 씁니다.&lt;/p&gt;
&lt;p style=&quot;margin-bottom: 16px !important;&quot; data-ke-size=&quot;size16&quot;&gt;완성하면 아래 창에서 에이전트와 대화합니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;04-PC-대화.png&quot; data-origin-width=&quot;828&quot; data-origin-height=&quot;1260&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cgoWg0/dJMcahl877H/veUyjPr6AZAJomx7GlZ0Vk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cgoWg0/dJMcahl877H/veUyjPr6AZAJomx7GlZ0Vk/img.png&quot; data-alt=&quot;완성한 위젯&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cgoWg0/dJMcahl877H/veUyjPr6AZAJomx7GlZ0Vk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcgoWg0%2FdJMcahl877H%2FveUyjPr6AZAJomx7GlZ0Vk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; alt=&quot;대화 창에 한국어 인사, 무엇을 도와줄 수 있나요라는 질문, 제품과 정책 문의를 도울 수 있다는 에이전트의 답이 차례로 있다&quot; loading=&quot;lazy&quot; width=&quot;414&quot; height=&quot;630&quot; data-filename=&quot;04-PC-대화.png&quot; data-origin-width=&quot;828&quot; data-origin-height=&quot;1260&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;완성한 위젯&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;margin-bottom: 16px !important;&quot; data-ke-size=&quot;size16&quot;&gt;블로그 페이지에는 위젯 스크립트(widget.js)만 들어갑니다. 위젯이 Vercel 함수에 질문을 보내면, Vercel 함수가 토큰을 받아 Agent API를 부르고 답을 돌려줍니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;fig-01.png&quot; data-origin-width=&quot;960&quot; data-origin-height=&quot;1494&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/KaweQ/dJMcahl877K/UH9cczCGcK6cYrDfoKpYK1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/KaweQ/dJMcahl877K/UH9cczCGcK6cYrDfoKpYK1/img.png&quot; data-alt=&quot;구성과 Secret의 자리&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/KaweQ/dJMcahl877K/UH9cczCGcK6cYrDfoKpYK1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FKaweQ%2FdJMcahl877K%2FUH9cczCGcK6cYrDfoKpYK1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; alt=&quot;블로그 페이지의 위젯, 환경변수에 Secret을 둔 Vercel 함수, 토큰과 Agent API를 맡는 Salesforce 세 칸이 위에서 아래로 이어진 그림&quot; loading=&quot;lazy&quot; width=&quot;480&quot; height=&quot;747&quot; data-filename=&quot;fig-01.png&quot; data-origin-width=&quot;960&quot; data-origin-height=&quot;1494&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;구성과 Secret의 자리&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;margin-bottom: 16px !important;&quot; data-ke-size=&quot;size16&quot;&gt;프로젝트 폴더는 아래처럼 나눕니다. 이번 배포에서는 api 폴더의 파일이 Vercel 함수로, 빌드할 때 만들어지는 public 폴더의 파일이 정적 파일로 올라갔습니다.&lt;/p&gt;
&lt;pre id=&quot;code_1&quot; class=&quot;text&quot; data-ke-language=&quot;text&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;luka-agent-widget/
├─ api/
│  ├─ session.js
│  └─ message.js
├─ lib/
│  ├─ agent.js
│  └─ http.js
├─ widget/
│  ├─ main.jsx
│  ├─ Chat.jsx
│  └─ style.css
├─ vite.config.js
├─ vercel.json
└─ package.json&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;font-size: 14px !important; line-height: 1.7 !important; color: var(--muted); margin-bottom: 16px !important;&quot; data-ke-size=&quot;size14&quot;&gt;Salesforce가 제공하는 웹 채팅(Enhanced Chat)은 메시징 채널, 큐, 라우팅이나 에스컬레이션 Flow를 먼저 설정해야 합니다. 이 글은 그 준비 없이 Agent API와 Vercel 함수만으로 위젯을 띄우는 대신, 상담원에게 대화를 넘기는 기능은 없습니다.&lt;/p&gt;
&lt;div class=&quot;say warn&quot;&gt;&lt;span class=&quot;badge i-alert&quot; aria-hidden=&quot;true&quot;&gt;&lt;/span&gt;
&lt;div&gt;&lt;b&gt;주의&lt;/b&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 글의 Vercel 함수에는 호출 횟수 제한이 없어서, 누구나 함수를 직접 불러 Agent API 사용량(크레딧)을 쓸 수 있습니다. 공개하기 전에 에이전트에 붙은 액션과 에이전트 사용자의 권한을 확인합니다.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;hr data-ke-style=&quot;style5&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;Vercel 함수&lt;/h2&gt;
&lt;p style=&quot;font-size: 20px !important; font-weight: bold; line-height: 1.6 !important; color: var(--ink); margin-bottom: 16px !important;&quot; data-ke-size=&quot;size20&quot;&gt;Vercel 함수는 토큰을 받아 재사용하고, 다른 사이트가 위젯을 그대로 붙여 쓰지 못하게 블로그 주소에서 온 브라우저 요청만 받습니다.&lt;/p&gt;
&lt;p style=&quot;font-size: 18px !important; font-weight: bold; line-height: 1.5 !important; color: var(--ink); margin-bottom: 10px !important;&quot; data-ke-size=&quot;size18&quot;&gt;1. Agent API 호출을 모듈 하나에 모읍니다&lt;/p&gt;
&lt;p style=&quot;margin-bottom: 16px !important;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;lib/agent.js&lt;/b&gt;는 토큰 발급, 세션 시작, 메시지 전송, 세션 종료를 맡습니다. 받은 토큰은 함수 메모리에 두고 만료 1분 전까지 다시 씁니다.&lt;/p&gt;
&lt;pre id=&quot;code_2&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;if (
  cached &amp;amp;&amp;amp;
  cached.expiresAt &amp;gt;
    Date.now() + 60_000
)
  return cached.token;&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;margin-bottom: 16px !important;&quot; data-ke-size=&quot;size16&quot;&gt;Agent API가 401을 돌려주면 토큰을 새로 받아 한 번만 다시 보냅니다. 세션을 열 때는 &lt;a href=&quot;https://jt98.tistory.com/40&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;앞 글&lt;/a&gt;과 같이 endpoint에 My Domain 주소를 넣고, bypassUser를 true로 둡니다. 메시지 응답에서는 type이 Inform인 메시지만 답으로 돌려줍니다.&lt;/p&gt;
&lt;div data-ke-type=&quot;moreLess&quot; data-text-more=&quot;lib/agent.js 전체 코드 보기&quot; data-text-less=&quot;닫기&quot;&gt;&lt;a class=&quot;btn-toggle-moreless&quot;&gt;더보기&lt;/a&gt;
&lt;div class=&quot;moreless-content&quot;&gt;
&lt;pre id=&quot;code_3&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;const API =
  'https://api.salesforce.com/einstein/ai-agent/v1';

export class AgentError
  extends Error {
  constructor(
    step,
    status,
    detail = '',
  ) {
    super(
      `${step} ${status} ${detail}`
        .trim(),
    );
    this.step = step;
    this.status = status;
  }
}

// { token, expiresAt }
let cached = null;

export function clearTokenCache() {
  cached = null;
}

export async function getToken(
  env = process.env,
) {
  if (
    cached &amp;amp;&amp;amp;
    cached.expiresAt &amp;gt;
      Date.now() + 60_000
  )
    return cached.token;
  const res = await fetch(
    env.SF_MY_DOMAIN_URL +
      '/services/oauth2/token',
    {
      method: 'POST',
      headers: {
        'Content-Type':
          'application/x-www-form-urlencoded',
      },
      body: new URLSearchParams({
        grant_type:
          'client_credentials',
        client_id: env.SF_CLIENT_ID,
        client_secret:
          env.SF_CLIENT_SECRET,
      }),
      // My Domain 이 아니면 302
      redirect: 'manual',
    },
  );
  if (res.status !== 200)
    throw new AgentError(
      'token',
      res.status,
    );
  const body = await res.json();
  cached = {
    token: body.access_token,
    expiresAt:
      Date.now() +
      (body.expires_in ?? 1800) *
        1000,
  };
  return cached.token;
}

// 401 이면 토큰을 새로 받아
// 한 번만 다시 보낸다
async function call(
  step,
  path,
  init,
  env,
) {
  for (
    let attempt = 0;
    attempt &amp;lt; 2;
    attempt++
  ) {
    const token = await getToken(env);
    const res = await fetch(
      `${API}${path}`,
      {
        ...init,
        headers: {
          Authorization:
            `Bearer ${token}`,
          Accept: 'application/json',
          ...init.headers,
        },
      },
    );
    if (
      res.status === 401 &amp;amp;&amp;amp;
      attempt === 0
    ) {
      clearTokenCache();
      continue;
    }
    const text = await res.text();
    if (!res.ok)
      throw new AgentError(
        step,
        res.status,
        text.slice(0, 300),
      );
    return text
      ? JSON.parse(text)
      : {};
  }
}

export async function startSession(
  env = process.env,
) {
  const body = await call(
    'session',
    '/agents/' +
      env.SF_AGENT_ID +
      '/sessions',
    {
      method: 'POST',
      headers: {
        'Content-Type':
          'application/json',
      },
      body: JSON.stringify({
        externalSessionKey:
          crypto.randomUUID(),
        instanceConfig: {
          endpoint:
            env.SF_MY_DOMAIN_URL,
        },
        streamingCapabilities: {
          chunkTypes: ['Text'],
        },
        bypassUser: true,
      }),
    },
    env,
  );
  return {
    sessionId: body.sessionId,
  };
}

export async function sendMessage(
  sessionId,
  sequenceId,
  text,
  env = process.env,
) {
  const body = await call(
    'message',
    `/sessions/${sessionId}/messages`,
    {
      method: 'POST',
      headers: {
        'Content-Type':
          'application/json',
      },
      body: JSON.stringify({
        message: {
          sequenceId,
          type: 'Text',
          text,
        },
      }),
    },
    env,
  );
  const replies = (
    body.messages ?? []
  )
    .filter(
      (m) =&amp;gt; m.type === 'Inform',
    )
    .map((m) =&amp;gt; m.message);
  return { replies };
}

export async function endSession(
  sessionId,
  env = process.env,
) {
  await call(
    'end',
    `/sessions/${sessionId}`,
    {
      method: 'DELETE',
      headers: {
        'x-session-end-reason':
          'UserRequest',
      },
    },
    env,
  );
}&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p style=&quot;font-size: 18px !important; font-weight: bold; line-height: 1.5 !important; color: var(--ink); margin-bottom: 10px !important;&quot; data-ke-size=&quot;size18&quot;&gt;2. 허용 주소와 CORS 헤더를 확인합니다&lt;/p&gt;
&lt;p style=&quot;margin-bottom: 16px !important;&quot; data-ke-size=&quot;size16&quot;&gt;블로그와 Vercel 함수는 주소가 달라서, 응답에 이 블로그를 허용한다는 헤더(CORS 헤더)가 있어야 브라우저가 답을 읽습니다. &lt;b&gt;lib/http.js&lt;/b&gt;의 preflight 함수는 요청의 Origin(요청을 보낸 페이지의 주소)이 허용 목록에 있을 때만 이 헤더를 붙입니다. 목록에 없으면 403을 돌려줍니다.&lt;/p&gt;
&lt;pre id=&quot;code_4&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;const origin = req.headers.origin;
if (!allowed.includes(origin)) {
  res
    .status(403)
    .json({
      error:
        '허용되지 않은 사이트입니다.',
    });
  return false;
}
res.setHeader(
  'Access-Control-Allow-Origin',
  origin,
);&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;margin-bottom: 16px !important;&quot; data-ke-size=&quot;size16&quot;&gt;Content-Type이 application/json인 POST와 DELETE 앞에는 브라우저가 OPTIONS 요청을 먼저 보내므로, preflight 함수는 OPTIONS에 204로 답합니다.&lt;/p&gt;
&lt;p style=&quot;margin-bottom: 16px !important;&quot; data-ke-size=&quot;size16&quot;&gt;Agent API의 오류는 화면에 보일 응답으로 바꿉니다. 끝난 세션(404)은 410, 겹친 요청(423)은 409, 그 밖의 오류는 502입니다.&lt;/p&gt;
&lt;p style=&quot;font-size: 14px !important; line-height: 1.7 !important; color: var(--muted); margin-bottom: 16px !important;&quot; data-ke-size=&quot;size14&quot;&gt;Origin은 curl로 꾸밀 수 있으므로, 이 검사는 접근 통제가 아닙니다.&lt;/p&gt;
&lt;div data-ke-type=&quot;moreLess&quot; data-text-more=&quot;lib/http.js 전체 코드 보기&quot; data-text-less=&quot;닫기&quot;&gt;&lt;a class=&quot;btn-toggle-moreless&quot;&gt;더보기&lt;/a&gt;
&lt;div class=&quot;moreless-content&quot;&gt;
&lt;pre id=&quot;code_5&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import {
  AgentError,
} from './agent.js';

const UUID =
  /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;
export const MAX_TEXT = 500;

// true: 핸들러가 계속 처리한다
// false: 이미 응답을 보냈다
export function preflight(
  req,
  res,
  methods,
  env = process.env,
) {
  const allowed = (
    env.ALLOWED_ORIGINS ?? ''
  )
    .split(',')
    .map((s) =&amp;gt; s.trim())
    .filter(Boolean);
  const origin = req.headers.origin;
  if (!allowed.includes(origin)) {
    res
      .status(403)
      .json({
        error:
          '허용되지 않은 사이트입니다.',
      });
    return false;
  }
  res.setHeader(
    'Access-Control-Allow-Origin',
    origin,
  );
  res.setHeader('Vary', 'Origin');
  res.setHeader(
    'Access-Control-Allow-Methods',
    `${methods.join(', ')}, OPTIONS`,
  );
  res.setHeader(
    'Access-Control-Allow-Headers',
    'Content-Type',
  );
  if (req.method === 'OPTIONS') {
    res.status(204).end();
    return false;
  }
  if (!methods.includes(req.method)) {
    res
      .status(405)
      .json({
        error:
          '지원하지 않는 요청입니다.',
      });
    return false;
  }
  return true;
}

export function isSessionId(v) {
  return (
    typeof v === 'string' &amp;amp;&amp;amp;
    UUID.test(v)
  );
}

export function sendError(res, err) {
  console.error(err);
  if (err instanceof AgentError) {
    if (
      err.status === 404 ||
      err.status === 410
    )
      return res
        .status(410)
        .json({
          error: 'session_expired',
        });
    if (err.status === 423)
      return res
        .status(409)
        .json({
          error:
            '앞의 답을 기다리는 중입니다.',
        });
  }
  return res
    .status(502)
    .json({
      error:
        '에이전트에 연결하지 못했습니다. 잠시 뒤 다시 시도해 주세요.',
    });
}&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p style=&quot;font-size: 18px !important; font-weight: bold; line-height: 1.5 !important; color: var(--ink); margin-bottom: 10px !important;&quot; data-ke-size=&quot;size18&quot;&gt;3. 세션 함수와 메시지 함수를 만듭니다&lt;/p&gt;
&lt;p style=&quot;margin-bottom: 16px !important;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;api/session.js&lt;/b&gt;는 POST로 세션을 열어 sessionId를 돌려주고, DELETE로 세션을 닫습니다. &lt;b&gt;api/message.js&lt;/b&gt;는 세션 ID 형식, 순번, 메시지 길이(500자 이하)를 검사한 뒤 에이전트의 답만 돌려줍니다.&lt;/p&gt;
&lt;pre id=&quot;code_6&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;if (
  typeof text !== 'string' ||
  !text.trim() ||
  text.length &amp;gt; MAX_TEXT
) {
  return res
    .status(400)&lt;/code&gt;&lt;/pre&gt;
&lt;div data-ke-type=&quot;moreLess&quot; data-text-more=&quot;api/session.js 전체 코드 보기&quot; data-text-less=&quot;닫기&quot;&gt;&lt;a class=&quot;btn-toggle-moreless&quot;&gt;더보기&lt;/a&gt;
&lt;div class=&quot;moreless-content&quot;&gt;
&lt;pre id=&quot;code_7&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import {
  startSession,
  endSession,
} from '../lib/agent.js';
import {
  preflight,
  isSessionId,
  sendError,
} from '../lib/http.js';

export default async function handler(
  req,
  res,
) {
  if (
    !preflight(req, res, [
      'POST',
      'DELETE',
    ])
  )
    return;
  try {
    if (req.method === 'POST')
      return res
        .status(200)
        .json(await startSession());
    const { sessionId } =
      req.body ?? {};
    if (!isSessionId(sessionId))
      return res
        .status(400)
        .json({
          error:
            '세션 정보가 올바르지 않습니다.',
        });
    await endSession(sessionId);
    return res.status(204).end();
  } catch (err) {
    return sendError(res, err);
  }
}&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div data-ke-type=&quot;moreLess&quot; data-text-more=&quot;api/message.js 전체 코드 보기&quot; data-text-less=&quot;닫기&quot;&gt;&lt;a class=&quot;btn-toggle-moreless&quot;&gt;더보기&lt;/a&gt;
&lt;div class=&quot;moreless-content&quot;&gt;
&lt;pre id=&quot;code_8&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import {
  sendMessage,
} from '../lib/agent.js';
import {
  preflight,
  isSessionId,
  sendError,
  MAX_TEXT,
} from '../lib/http.js';

export default async function handler(
  req,
  res,
) {
  if (!preflight(req, res, ['POST']))
    return;
  const {
    sessionId,
    sequenceId,
    text,
  } = req.body ?? {};
  if (
    !isSessionId(sessionId) ||
    !Number.isInteger(sequenceId) ||
    sequenceId &amp;lt; 1
  ) {
    return res
      .status(400)
      .json({
        error:
          '세션 정보가 올바르지 않습니다.',
      });
  }
  if (
    typeof text !== 'string' ||
    !text.trim() ||
    text.length &amp;gt; MAX_TEXT
  ) {
    return res
      .status(400)
      .json({
        error: `메시지는 1~${MAX_TEXT}자로 보내 주세요.`,
      });
  }
  try {
    return res
      .status(200)
      .json(
        await sendMessage(
          sessionId,
          sequenceId,
          text.trim(),
        ),
      );
  } catch (err) {
    return sendError(res, err);
  }
}&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;hr data-ke-style=&quot;style5&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;채팅 위젯&lt;/h2&gt;
&lt;p style=&quot;font-size: 20px !important; font-weight: bold; line-height: 1.6 !important; color: var(--ink); margin-bottom: 16px !important;&quot; data-ke-size=&quot;size20&quot;&gt;위젯은 세션 ID와 순번을 sessionStorage에 두어, 같은 탭에서 페이지를 옮겨도 대화를 이어 갑니다.&lt;/p&gt;
&lt;p style=&quot;font-size: 18px !important; font-weight: bold; line-height: 1.5 !important; color: var(--ink); margin-bottom: 10px !important;&quot; data-ke-size=&quot;size18&quot;&gt;1. Shadow DOM 안에 위젯을 그립니다&lt;/p&gt;
&lt;p style=&quot;margin-bottom: 16px !important;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;widget/main.jsx&lt;/b&gt;는 body 끝에 div 하나를 붙이고, 그 안에 Shadow DOM(페이지와 분리된 별도 DOM 영역)을 만들어 위젯을 그립니다. 그래서 블로그 스킨의 CSS와 위젯의 CSS가 서로 섞이지 않습니다.&lt;/p&gt;
&lt;pre id=&quot;code_9&quot; class=&quot;jsx javascript&quot; data-ke-language=&quot;jsx&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;const shadow = host.attachShadow({
  mode: 'open',
});
const style =
  document.createElement('style');
style.textContent = css;
shadow.appendChild(style);&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;margin-bottom: 16px !important;&quot; data-ke-size=&quot;size16&quot;&gt;Vercel 함수의 주소는 스크립트 자신의 주소에서 읽습니다. 그래서 스킨에는 스크립트 한 줄만 넣으면 됩니다.&lt;/p&gt;
&lt;div data-ke-type=&quot;moreLess&quot; data-text-more=&quot;widget/main.jsx 전체 코드 보기&quot; data-text-less=&quot;닫기&quot;&gt;&lt;a class=&quot;btn-toggle-moreless&quot;&gt;더보기&lt;/a&gt;
&lt;div class=&quot;moreless-content&quot;&gt;
&lt;pre id=&quot;code_10&quot; class=&quot;jsx javascript&quot; data-ke-language=&quot;jsx&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import {
  createRoot,
} from 'react-dom/client';
import Chat from './Chat.jsx';
import css from './style.css?inline';

const apiBase = new URL(
  document.currentScript.src,
).origin;

function mount() {
  const host =
    document.createElement('div');
  host.id = 'luka-agent-widget';
  document.body.appendChild(host);
  const shadow = host.attachShadow({
    mode: 'open',
  });
  const style =
    document.createElement('style');
  style.textContent = css;
  shadow.appendChild(style);
  const root =
    document.createElement('div');
  shadow.appendChild(root);
  createRoot(root).render(
    &amp;lt;Chat apiBase={apiBase} /&amp;gt;,
  );
}

if (document.readyState === 'loading')
  document.addEventListener(
    'DOMContentLoaded',
    mount,
  );
else mount();&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div data-ke-type=&quot;moreLess&quot; data-text-more=&quot;widget/style.css 전체 코드 보기&quot; data-text-less=&quot;닫기&quot;&gt;&lt;a class=&quot;btn-toggle-moreless&quot;&gt;더보기&lt;/a&gt;
&lt;div class=&quot;moreless-content&quot;&gt;
&lt;pre id=&quot;code_11&quot; class=&quot;css&quot; data-ke-language=&quot;css&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;:host {
  all: initial;
}
* {
  box-sizing: border-box;
  font-family:
    system-ui,
    -apple-system,
    &quot;Apple SD Gothic Neo&quot;,
    &quot;Malgun Gothic&quot;,
    sans-serif;
}

.launcher {
  position: fixed;
  right: 20px;
  bottom: 20px;
  z-index: 2147483000;
  padding: 12px 18px;
  border: 0;
  border-radius: 999px;
  background: #0b5cab;
  color: #fff;
  font-size: 15px;
  font-weight: 600;
  box-shadow: 0 4px 14px
    rgba(0, 0, 0, 0.2);
  cursor: pointer;
}

.panel {
  position: fixed;
  right: 20px;
  bottom: 76px;
  z-index: 2147483000;
  display: flex;
  flex-direction: column;
  width: 360px;
  height: 520px;
  max-height: calc(100vh - 100px);
  background: #fff;
  color: #181818;
  border: 1px solid #d8dde6;
  border-radius: 12px;
  box-shadow: 0 8px 28px
    rgba(0, 0, 0, 0.18);
  overflow: hidden;
}

header {
  display: flex;
  align-items: center;
  justify-content: space-between;
  padding: 12px 14px;
  background: #0b5cab;
  color: #fff;
  font-size: 15px;
}
header button {
  margin-left: 6px;
  padding: 4px 8px;
  border: 1px solid
    rgba(255, 255, 255, 0.6);
  border-radius: 6px;
  background: transparent;
  color: #fff;
  font-size: 13px;
  cursor: pointer;
}

.list {
  flex: 1;
  margin: 0;
  padding: 14px;
  list-style: none;
  overflow-y: auto;
  background: #f4f6f9;
}
.list li {
  max-width: 85%;
  margin: 0 0 10px;
  padding: 9px 12px;
  border-radius: 10px;
  font-size: 14px;
  line-height: 1.55;
  white-space: pre-wrap;
  word-break: break-word;
}
.list .agent {
  background: #fff;
  border: 1px solid #e1e5ec;
}
.list .user {
  margin-left: auto;
  background: #0b5cab;
  color: #fff;
}
.list .typing {
  color: #5c6470;
}

form {
  display: flex;
  gap: 8px;
  padding: 10px;
  border-top: 1px solid #e1e5ec;
}
input {
  flex: 1;
  min-width: 0;
  padding: 9px 10px;
  border: 1px solid #c9ced6;
  border-radius: 8px;
  font-size: 14px;
}
form button {
  padding: 0 14px;
  border: 0;
  border-radius: 8px;
  background: #0b5cab;
  color: #fff;
  font-size: 14px;
  cursor: pointer;
}
button:disabled {
  opacity: 0.5;
  cursor: default;
}

.note {
  margin: 0;
  padding: 0 12px 10px;
  color: #5c6470;
  font-size: 12px;
}

/* 이 폭 이하에서는 스킨의
   목차 단추가 뜨므로 그 위로 올린다 */
@media (max-width: 1359px) {
  .launcher {
    bottom: 68px;
  }
  .panel {
    bottom: 124px;
    max-height: calc(100vh - 148px);
  }
}

@media (max-width: 480px) {
  .panel {
    right: 8px;
    left: 8px;
    bottom: 120px;
    width: auto;
    height: calc(100vh - 140px);
  }
  .launcher {
    right: 12px;
    bottom: 64px;
  }
}&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p style=&quot;font-size: 18px !important; font-weight: bold; line-height: 1.5 !important; color: var(--ink); margin-bottom: 10px !important;&quot; data-ke-size=&quot;size18&quot;&gt;2. 세션과 순번을 저장합니다&lt;/p&gt;
&lt;p style=&quot;margin-bottom: 16px !important;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;widget/Chat.jsx&lt;/b&gt;는 첫 질문을 보낼 때 세션을 열고, 메시지마다 순번(sequenceId)을 1씩 올립니다. 순번은 요청을 보내기 전에 sessionStorage에 저장하므로, 답을 기다리다 다른 글로 옮겨도 같은 순번을 다시 보내지 않습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;fig-02.png&quot; data-origin-width=&quot;960&quot; data-origin-height=&quot;1206&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/d86qwM/dJMcaaN4fAM/KXkW44NZQg6ZlZh0eotNQ1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/d86qwM/dJMcaaN4fAM/KXkW44NZQg6ZlZh0eotNQ1/img.png&quot; data-alt=&quot;세션과 순번&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/d86qwM/dJMcaaN4fAM/KXkW44NZQg6ZlZh0eotNQ1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fd86qwM%2FdJMcaaN4fAM%2FKXkW44NZQg6ZlZh0eotNQ1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; alt=&quot;첫 질문에 세션을 열고 순번 1, 다음 질문은 순번 2, 다른 글로 옮기면 sessionStorage에서 이어 가고, 세션이 끝났으면 410을 받아 새 세션에서 순번 1로 다시 보내는 네 단계 그림&quot; loading=&quot;lazy&quot; width=&quot;480&quot; height=&quot;603&quot; data-filename=&quot;fig-02.png&quot; data-origin-width=&quot;960&quot; data-origin-height=&quot;1206&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;세션과 순번&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;margin-bottom: 16px !important;&quot; data-ke-size=&quot;size16&quot;&gt;세션이 끝나 Vercel 함수가 410을 돌려주면, 위젯은 새 세션을 열어 같은 질문을 순번 1로 다시 보냅니다.&lt;/p&gt;
&lt;pre id=&quot;code_12&quot; class=&quot;jsx javascript&quot; data-ke-language=&quot;jsx&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;if (
  status === 410 &amp;amp;&amp;amp;
  attempt === 0
) {
  // 세션이 끝났으면 새로 열어
  // 한 번 더 보낸다
  sessionId = null;
  continue;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;margin-bottom: 16px !important;&quot; data-ke-size=&quot;size16&quot;&gt;이 에이전트의 첫인사는 영어로 오므로, 위젯은 세션 응답의 인사 대신 한국어 인사를 직접 보여 줍니다. 질문은 화면에서 대화 하나에 20회까지 받고, 새 대화를 누르면 다시 셉니다.&lt;/p&gt;
&lt;p style=&quot;font-size: 14px !important; line-height: 1.7 !important; color: var(--muted); margin-bottom: 16px !important;&quot; data-ke-size=&quot;size14&quot;&gt;닫힌 세션에 메시지를 보내면 Agent API는 404(NotFoundException)를 돌려줬습니다. 문서는 404를 토큰이나 주소가 틀렸을 때의 응답으로만 안내합니다.&lt;/p&gt;
&lt;div data-ke-type=&quot;moreLess&quot; data-text-more=&quot;widget/Chat.jsx 전체 코드 보기&quot; data-text-less=&quot;닫기&quot;&gt;&lt;a class=&quot;btn-toggle-moreless&quot;&gt;더보기&lt;/a&gt;
&lt;div class=&quot;moreless-content&quot;&gt;
&lt;pre id=&quot;code_13&quot; class=&quot;jsx javascript&quot; data-ke-language=&quot;jsx&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import {
  useEffect,
  useRef,
  useState,
} from 'react';

const KEY = 'luka-agent-widget';
// 화면용 제한(서버는 세지 않음)
const MAX_TURNS = 20;
const GREETING =
  '안녕하세요. Agentforce 에이전트입니다. 궁금한 것을 물어보세요.';

function load() {
  try {
    return (
      JSON.parse(
        sessionStorage.getItem(KEY),
      ) ?? null
    );
  } catch {
    return null;
  }
}

function save(state) {
  try {
    sessionStorage.setItem(
      KEY,
      JSON.stringify(state),
    );
  } catch {
    // 저장하지 못해도 이 페이지 안에서는 대화가 이어진다
  }
}

const fresh = () =&amp;gt; ({
  sessionId: null,
  seq: 0,
  messages: [
    { role: 'agent', text: GREETING },
  ],
});

export default function Chat({
  apiBase,
}) {
  const [open, setOpen] =
    useState(false);
  const [state, setState] = useState(
    () =&amp;gt; load() ?? fresh(),
  );
  const [input, setInput] =
    useState('');
  const [busy, setBusy] =
    useState(false);
  const listRef = useRef(null);

  useEffect(
    () =&amp;gt; save(state),
    [state],
  );
  useEffect(() =&amp;gt; {
    listRef.current?.scrollTo({
      top: listRef.current
        .scrollHeight,
    });
  }, [state.messages, open, busy]);

  const post = async (
    path,
    body,
    method = 'POST',
  ) =&amp;gt; {
    const res = await fetch(
      `${apiBase}${path}`,
      {
        method,
        headers: {
          'Content-Type':
            'application/json',
        },
        body: body
          ? JSON.stringify(body)
          : undefined,
      },
    );
    const data =
      res.status === 204
        ? {}
        : await res.json();
    return {
      status: res.status,
      data,
    };
  };

  const startSession = async () =&amp;gt; {
    const { status, data } =
      await post('/api/session');
    if (status !== 200)
      throw new Error(data.error);
    return data.sessionId;
  };

  const turns = state.messages.filter(
    (m) =&amp;gt; m.role === 'user',
  ).length;

  const send = async (e) =&amp;gt; {
    e.preventDefault();
    const text = input.trim();
    if (
      !text ||
      busy ||
      turns &amp;gt;= MAX_TURNS
    )
      return;
    setInput('');
    setBusy(true);
    let { sessionId, seq } = state;
    const messages = [
      ...state.messages,
      { role: 'user', text },
    ];
    setState({
      sessionId,
      seq,
      messages,
    });
    try {
      for (
        let attempt = 0;
        attempt &amp;lt; 2;
        attempt++
      ) {
        if (!sessionId) {
          sessionId =
            await startSession();
          seq = 0;
        }
        seq += 1;
        // 보내기 전에 순번을 저장한다
        // (답을 기다리다 페이지를
        // 옮겨도 같은 순번을 안 보냄)
        save({
          sessionId,
          seq,
          messages,
        });
        setState({
          sessionId,
          seq,
          messages,
        });
        const { status, data } =
          await post('/api/message', {
            sessionId,
            sequenceId: seq,
            text,
          });
        if (
          status === 410 &amp;amp;&amp;amp;
          attempt === 0
        ) {
          // 세션이 끝났으면 새로 열어
          // 한 번 더 보낸다
          sessionId = null;
          continue;
        }
        const replies =
          status === 200
            ? data.replies
            : [
                status === 410
                  ? '대화가 끝났습니다. 새 대화를 눌러 다시 시작하세요.'
                  : data.error,
              ];
        const answer = replies.length
          ? replies
          : ['답을 받지 못했습니다.'];
        setState({
          sessionId,
          seq,
          messages: [
            ...messages,
            ...answer.map((t) =&amp;gt; ({
              role: 'agent',
              text: t,
            })),
          ],
        });
        break;
      }
    } catch {
      setState({
        sessionId,
        seq,
        messages: [
          ...messages,
          {
            role: 'agent',
            text: '에이전트에 연결하지 못했습니다. 잠시 뒤 다시 시도해 주세요.',
          },
        ],
      });
    } finally {
      setBusy(false);
    }
  };

  const reset = () =&amp;gt; {
    if (state.sessionId)
      post(
        '/api/session',
        {
          sessionId: state.sessionId,
        },
        'DELETE',
      ).catch(() =&amp;gt; {});
    setState(fresh());
  };

  return (
    &amp;lt;&amp;gt;
      {open &amp;amp;&amp;amp; (
        &amp;lt;section
          className=&quot;panel&quot;
          role=&quot;dialog&quot;
          aria-label=&quot;Agentforce 채팅&quot;
        &amp;gt;
          &amp;lt;header&amp;gt;
            &amp;lt;strong&amp;gt;
              Agentforce 에이전트
            &amp;lt;/strong&amp;gt;
            &amp;lt;div&amp;gt;
              &amp;lt;button
                type=&quot;button&quot;
                onClick={reset}
                disabled={busy}
              &amp;gt;
                새 대화
              &amp;lt;/button&amp;gt;
              &amp;lt;button
                type=&quot;button&quot;
                onClick={() =&amp;gt;
                  setOpen(false)
                }
                aria-label=&quot;닫기&quot;
              &amp;gt;
                ✕
              &amp;lt;/button&amp;gt;
            &amp;lt;/div&amp;gt;
          &amp;lt;/header&amp;gt;
          &amp;lt;ol
            className=&quot;list&quot;
            ref={listRef}
          &amp;gt;
            {state.messages.map(
              (m, i) =&amp;gt; (
                &amp;lt;li
                  key={i}
                  className={m.role}
                &amp;gt;
                  {m.text}
                &amp;lt;/li&amp;gt;
              ),
            )}
            {busy &amp;amp;&amp;amp; (
              &amp;lt;li className=&quot;agent typing&quot;&amp;gt;
                답을 기다리는 중&amp;hellip;
              &amp;lt;/li&amp;gt;
            )}
          &amp;lt;/ol&amp;gt;
          &amp;lt;form onSubmit={send}&amp;gt;
            &amp;lt;input
              value={input}
              onChange={(e) =&amp;gt;
                setInput(
                  e.target.value,
                )
              }
              maxLength={500}
              placeholder={
                turns &amp;gt;= MAX_TURNS
                  ? '새 대화를 눌러 다시 시작하세요'
                  : '메시지를 입력하세요'
              }
              disabled={
                turns &amp;gt;= MAX_TURNS
              }
              aria-label=&quot;메시지&quot;
            /&amp;gt;
            &amp;lt;button
              type=&quot;submit&quot;
              disabled={
                busy ||
                !input.trim() ||
                turns &amp;gt;= MAX_TURNS
              }
            &amp;gt;
              보내기
            &amp;lt;/button&amp;gt;
          &amp;lt;/form&amp;gt;
          &amp;lt;p className=&quot;note&quot;&amp;gt;
            답은 Salesforce
            Agentforce가 만듭니다.
            개인 정보는 입력하지
            마세요.
          &amp;lt;/p&amp;gt;
        &amp;lt;/section&amp;gt;
      )}
      &amp;lt;button
        type=&quot;button&quot;
        className=&quot;launcher&quot;
        onClick={() =&amp;gt; setOpen(!open)}
        aria-expanded={open}
      &amp;gt;
        {open
          ? '닫기'
          : '에이전트에게 묻기'}
      &amp;lt;/button&amp;gt;
    &amp;lt;/&amp;gt;
  );
}&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p style=&quot;font-size: 18px !important; font-weight: bold; line-height: 1.5 !important; color: var(--ink); margin-bottom: 10px !important;&quot; data-ke-size=&quot;size18&quot;&gt;3. widget.js 하나로 빌드합니다&lt;/p&gt;
&lt;p style=&quot;margin-bottom: 16px !important;&quot; data-ke-size=&quot;size16&quot;&gt;Vite의 라이브러리 모드로 위젯을 widget.js 파일 하나로 묶고, 출력 폴더를 public으로 둡니다.&lt;/p&gt;
&lt;pre id=&quot;code_14&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;npm install
npm run build&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;margin-bottom: 16px !important;&quot; data-ke-size=&quot;size16&quot;&gt;이번에 만든 widget.js는 약 148KB(gzip으로 약 48KB)였습니다.&lt;/p&gt;
&lt;div data-ke-type=&quot;moreLess&quot; data-text-more=&quot;vite.config.js 전체 코드 보기&quot; data-text-less=&quot;닫기&quot;&gt;&lt;a class=&quot;btn-toggle-moreless&quot;&gt;더보기&lt;/a&gt;
&lt;div class=&quot;moreless-content&quot;&gt;
&lt;p style=&quot;margin-bottom: 16px !important;&quot; data-ke-size=&quot;size16&quot;&gt;vite.config.js의 define은 React가 브라우저에서 찾는 process.env.NODE_ENV 값을 채웁니다. publicDir를 false로 둔 것은 출력 폴더와 이름이 같은 public 폴더를 다시 복사하지 않게 하려는 것입니다.&lt;/p&gt;
&lt;pre id=&quot;code_15&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import { defineConfig } from 'vite';
import react from
  '@vitejs/plugin-react';

export default defineConfig({
  plugins: [react()],
  define: {
    'process.env.NODE_ENV':
      '&quot;production&quot;',
  },
  publicDir: false,
  build: {
    outDir: 'public',
    emptyOutDir: true,
    lib: {
      entry: 'widget/main.jsx',
      formats: ['iife'],
      name: 'LukaAgentWidget',
      fileName: () =&amp;gt; 'widget.js',
    },
  },
});&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div data-ke-type=&quot;moreLess&quot; data-text-more=&quot;package.json 전체 코드 보기&quot; data-text-less=&quot;닫기&quot;&gt;&lt;a class=&quot;btn-toggle-moreless&quot;&gt;더보기&lt;/a&gt;
&lt;div class=&quot;moreless-content&quot;&gt;
&lt;pre id=&quot;code_16&quot; class=&quot;json&quot; data-ke-language=&quot;json&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;{
  &quot;name&quot;: &quot;luka-agent-widget&quot;,
  &quot;private&quot;: true,
  &quot;type&quot;: &quot;module&quot;,
  &quot;scripts&quot;: {
    &quot;build&quot;: &quot;vite build&quot;
  },
  &quot;dependencies&quot;: {
    &quot;react&quot;: &quot;18.3.1&quot;,
    &quot;react-dom&quot;: &quot;18.3.1&quot;
  },
  &quot;devDependencies&quot;: {
    &quot;@vitejs/plugin-react&quot;: &quot;4.3.4&quot;,
    &quot;vite&quot;: &quot;6.0.7&quot;
  }
}&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;hr data-ke-style=&quot;style5&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;배포&lt;/h2&gt;
&lt;p style=&quot;font-size: 20px !important; font-weight: bold; line-height: 1.6 !important; color: var(--ink); margin-bottom: 16px !important;&quot; data-ke-size=&quot;size20&quot;&gt;환경변수 다섯 개를 넣고 배포한 뒤, 스킨을 고치기 전에 curl로 함수의 응답을 먼저 확인합니다.&lt;/p&gt;
&lt;p style=&quot;font-size: 18px !important; font-weight: bold; line-height: 1.5 !important; color: var(--ink); margin-bottom: 10px !important;&quot; data-ke-size=&quot;size18&quot;&gt;1. 프로젝트를 연결하고 환경변수를 넣습니다&lt;/p&gt;
&lt;p style=&quot;margin-bottom: 16px !important;&quot; data-ke-size=&quot;size16&quot;&gt;프로젝트 폴더에서 Vercel CLI를 설치해 로그인하고, Vercel 프로젝트를 만들어 연결합니다. 환경변수는 아래 다섯 이름으로 vercel env add를 한 번씩 실행해 넣고, 값은 명령이 물을 때 입력합니다. SF_로 시작하는 네 값에는 --sensitive를 붙입니다.&lt;/p&gt;
&lt;pre id=&quot;code_17&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;npm i -g vercel
vercel login
vercel link --yes \
  --project luka-agent-widget
vercel env add SF_CLIENT_ID \
  production --sensitive&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;SF_CLIENT_ID:&lt;/b&gt; External Client App의 Consumer Key&lt;/li&gt;
&lt;li&gt;&lt;b&gt;SF_CLIENT_SECRET:&lt;/b&gt; External Client App의 Consumer Secret&lt;/li&gt;
&lt;li&gt;&lt;b&gt;SF_MY_DOMAIN_URL:&lt;/b&gt; https로 시작하는 My Domain 주소&lt;/li&gt;
&lt;li&gt;&lt;b&gt;SF_AGENT_ID:&lt;/b&gt; 0Xx로 시작하는 Agent ID&lt;/li&gt;
&lt;li&gt;&lt;b&gt;ALLOWED_ORIGINS:&lt;/b&gt; 위젯을 띄울 블로그 주소입니다. https://로 시작하고 끝에 슬래시를 붙이지 않으며, 주소가 여럿이면 쉼표로 잇습니다&lt;/li&gt;
&lt;/ul&gt;
&lt;p style=&quot;font-size: 18px !important; font-weight: bold; line-height: 1.5 !important; color: var(--ink); margin-bottom: 10px !important;&quot; data-ke-size=&quot;size18&quot;&gt;2. 운영 환경으로 배포합니다&lt;/p&gt;
&lt;div data-ke-type=&quot;moreLess&quot; data-text-more=&quot;vercel.json 전체 코드 보기&quot; data-text-less=&quot;닫기&quot;&gt;&lt;a class=&quot;btn-toggle-moreless&quot;&gt;더보기&lt;/a&gt;
&lt;div class=&quot;moreless-content&quot;&gt;
&lt;p style=&quot;margin-bottom: 16px !important;&quot; data-ke-size=&quot;size16&quot;&gt;vercel.json은 빌드 명령과 출력 폴더, 함수의 실행 시간 상한, widget.js의 캐시 시간을 정합니다. 실행 시간 상한(maxDuration)은 60초로 직접 정했고, 답이 그 안에 오지 않으면 위젯에 연결 오류가 뜹니다. Agent API의 시간 제한은 120초이므로, 더 기다리려면 Hobby 플랜의 한도(300초) 안에서 값을 올립니다.&lt;/p&gt;
&lt;pre id=&quot;code_18&quot; class=&quot;json&quot; data-ke-language=&quot;json&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;{
  &quot;buildCommand&quot;: &quot;npm run build&quot;,
  &quot;outputDirectory&quot;: &quot;public&quot;,
  &quot;functions&quot;: {
    &quot;api/*.js&quot;: { &quot;maxDuration&quot;: 60 }
  },
  &quot;headers&quot;: [
    {
      &quot;source&quot;: &quot;/widget.js&quot;,
      &quot;headers&quot;: [
        {
          &quot;key&quot;: &quot;Cache-Control&quot;,
          &quot;value&quot;: &quot;public, max-age=300&quot;
        }
      ]
    }
  ]
}&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;pre id=&quot;code_19&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;vercel deploy --prod --yes&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;margin-bottom: 16px !important;&quot; data-ke-size=&quot;size16&quot;&gt;배포가 끝나면 출력의 Aliased 줄에 운영 주소가 나옵니다.&lt;/p&gt;
&lt;p style=&quot;font-size: 14px !important; line-height: 1.7 !important; color: var(--muted); margin-bottom: 16px !important;&quot; data-ke-size=&quot;size14&quot;&gt;widget.js는 5분 동안 캐시되므로, 위젯을 고쳐 다시 배포하면 블로그에는 최대 5분 늦게 반영될 수 있습니다.&lt;/p&gt;
&lt;p style=&quot;font-size: 18px !important; font-weight: bold; line-height: 1.5 !important; color: var(--ink); margin-bottom: 10px !important;&quot; data-ke-size=&quot;size18&quot;&gt;3. curl로 응답을 확인합니다&lt;/p&gt;
&lt;p style=&quot;margin-bottom: 16px !important;&quot; data-ke-size=&quot;size16&quot;&gt;함수 주소로 직접 요청을 보냅니다. Origin 헤더에 블로그 주소를 넣어야 함수가 요청을 받습니다.&lt;/p&gt;
&lt;pre id=&quot;code_20&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;B=https://luka-agent-widget.vercel.app
O=&quot;Origin: https://jt98.tistory.com&quot;
curl -X POST -H &quot;$O&quot; $B/api/session&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;margin-bottom: 16px !important;&quot; data-ke-size=&quot;size16&quot;&gt;세션 시작 응답의 sessionId를 msg.json에 넣고 메시지를 보냅니다.&lt;/p&gt;
&lt;pre id=&quot;code_21&quot; class=&quot;json&quot; data-ke-language=&quot;json&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;{
  &quot;sessionId&quot;: &quot;&amp;lt;세션 ID&amp;gt;&quot;,
  &quot;sequenceId&quot;: 1,
  &quot;text&quot;: &quot;무엇을 도와줄 수 있나요?&quot;
}&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_22&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;CT=&quot;Content-Type: application/json&quot;
curl -X POST -H &quot;$O&quot; -H &quot;$CT&quot; \
  --data-binary @msg.json \
  $B/api/message&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;margin-bottom: 16px !important;&quot; data-ke-size=&quot;size16&quot;&gt;나머지 세 요청은 아래처럼 보냅니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;Origin 확인:&lt;/b&gt; 세션 시작 명령에서 -H &quot;$O&quot;를 빼고 보냅니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;빈 메시지:&lt;/b&gt; msg.json의 text를 빈 문자열로 바꿔 보냅니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;닫은 세션:&lt;/b&gt; 아래 명령으로 세션을 닫고(204) 같은 메시지를 다시 보냅니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_23&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;curl -X DELETE -H &quot;$O&quot; -H &quot;$CT&quot; \
  -d '{&quot;sessionId&quot;:&quot;&amp;lt;세션 ID&amp;gt;&quot;}' \
  $B/api/session&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;margin-bottom: 16px !important;&quot; data-ke-size=&quot;size16&quot;&gt;다섯 요청이 표와 같이 답하면 다음 단계로 넘어갑니다. 403과 400은 함수가 의도대로 막은 결과입니다.&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;요청&lt;/th&gt;
&lt;th&gt;기대 응답&lt;/th&gt;
&lt;th&gt;다르면 볼 곳&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;세션 시작&lt;/td&gt;
&lt;td&gt;200, sessionId&lt;/td&gt;
&lt;td&gt;403이면 ALLOWED_ORIGINS, 502면 vercel logs&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;메시지&lt;/td&gt;
&lt;td&gt;200, replies&lt;/td&gt;
&lt;td&gt;400이면 세션 ID와 순번&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Origin이 없거나 다름&lt;/td&gt;
&lt;td&gt;403&lt;/td&gt;
&lt;td&gt;200이면 ALLOWED_ORIGINS&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;빈 메시지&lt;/td&gt;
&lt;td&gt;400&lt;/td&gt;
&lt;td&gt;메시지 함수의 검사&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;닫은 세션에 메시지&lt;/td&gt;
&lt;td&gt;410&lt;/td&gt;
&lt;td&gt;lib/http.js의 오류 변환&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr data-ke-style=&quot;style5&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;블로그 연결&lt;/h2&gt;
&lt;p style=&quot;font-size: 20px !important; font-weight: bold; line-height: 1.6 !important; color: var(--ink); margin-bottom: 16px !important;&quot; data-ke-size=&quot;size20&quot;&gt;스킨 HTML의 &amp;lt;/body&amp;gt; 앞에 스크립트 한 줄을 넣으면 모든 페이지에 위젯이 뜹니다.&lt;/p&gt;
&lt;p style=&quot;font-size: 18px !important; font-weight: bold; line-height: 1.5 !important; color: var(--ink); margin-bottom: 10px !important;&quot; data-ke-size=&quot;size18&quot;&gt;1. 스킨 HTML 편집기를 엽니다&lt;/p&gt;
&lt;p style=&quot;margin-bottom: 16px !important;&quot; data-ke-size=&quot;size16&quot;&gt;블로그 관리의 &lt;b&gt;꾸미기 &amp;gt; 스킨 편집&lt;/b&gt;에서 오른쪽 패널의 &lt;b&gt;html 편집&lt;/b&gt;을 누릅니다. &quot;html 및 CSS 편집으로 인해 발생하는 문제는 직접 수정하셔야 합니다.&quot; 확인 창이 뜨면 &lt;b&gt;확인&lt;/b&gt;을 누릅니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;01-html-편집-단추.png&quot; data-origin-width=&quot;384&quot; data-origin-height=&quot;472&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cxqnXk/dJMcafV8bO4/VjDAe4byVKr4DnslTOpzn0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cxqnXk/dJMcafV8bO4/VjDAe4byVKr4DnslTOpzn0/img.png&quot; data-alt=&quot;html 편집 단추&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cxqnXk/dJMcafV8bO4/VjDAe4byVKr4DnslTOpzn0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcxqnXk%2FdJMcafV8bO4%2FVjDAe4byVKr4DnslTOpzn0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; alt=&quot;스킨 편집 오른쪽 패널에서 스킨 미리보기 아래 html 편집 단추가 강조되어 있다&quot; loading=&quot;lazy&quot; width=&quot;192&quot; height=&quot;236&quot; data-filename=&quot;01-html-편집-단추.png&quot; data-origin-width=&quot;384&quot; data-origin-height=&quot;472&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;html 편집 단추&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;font-size: 18px !important; font-weight: bold; line-height: 1.5 !important; color: var(--ink); margin-bottom: 10px !important;&quot; data-ke-size=&quot;size18&quot;&gt;2. body 닫는 태그 앞에 스크립트를 넣고 적용합니다&lt;/p&gt;
&lt;p style=&quot;margin-bottom: 16px !important;&quot; data-ke-size=&quot;size16&quot;&gt;HTML 탭의 맨 아래로 내려가 &amp;lt;/body&amp;gt; 바로 위에 아래 한 줄을 넣고, 오른쪽 위 &lt;b&gt;적용&lt;/b&gt;을 누릅니다. 주소는 배포 출력의 Aliased 줄에 나온 자신의 운영 주소로 바꿉니다.&lt;/p&gt;
&lt;pre id=&quot;code_24&quot; class=&quot;markup xml&quot; data-ke-language=&quot;markup&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;script
  src=&quot;https://luka-agent-widget.vercel.app/widget.js&quot;
  defer&amp;gt;&amp;lt;/script&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;02-body-앞-위젯-줄.png&quot; data-origin-width=&quot;1256&quot; data-origin-height=&quot;598&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/4pZjc/dJMb992CPK5/iqB3NSDh8eOKvcqLIhd1r1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/4pZjc/dJMb992CPK5/iqB3NSDh8eOKvcqLIhd1r1/img.png&quot; data-alt=&quot;body 닫는 태그 앞의 위젯 스크립트&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/4pZjc/dJMb992CPK5/iqB3NSDh8eOKvcqLIhd1r1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F4pZjc%2FdJMb992CPK5%2FiqB3NSDh8eOKvcqLIhd1r1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; alt=&quot;HTML 편집기 327번 줄의 widget.js 스크립트 줄이 강조되어 있고 바로 아래 줄이 body 닫는 태그다&quot; loading=&quot;lazy&quot; width=&quot;620&quot; height=&quot;295&quot; data-filename=&quot;02-body-앞-위젯-줄.png&quot; data-origin-width=&quot;1256&quot; data-origin-height=&quot;598&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;body 닫는 태그 앞의 위젯 스크립트&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;font-size: 18px !important; font-weight: bold; line-height: 1.5 !important; color: var(--ink); margin-bottom: 10px !important;&quot; data-ke-size=&quot;size18&quot;&gt;3. 블로그에서 대화해 봅니다&lt;/p&gt;
&lt;p style=&quot;margin-bottom: 16px !important;&quot; data-ke-size=&quot;size16&quot;&gt;블로그 아무 페이지나 열면 오른쪽 아래에 &lt;b&gt;에이전트에게 묻기&lt;/b&gt; 단추가 보입니다. 단추가 스킨의 고정 단추와 겹치면 widget/style.css의 right와 bottom 값을 바꿉니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;03-위젯-단추.png&quot; data-origin-width=&quot;1336&quot; data-origin-height=&quot;936&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/DgxA4/dJMcafV8bO9/opavgNA4kzbsq4jGAinM81/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/DgxA4/dJMcafV8bO9/opavgNA4kzbsq4jGAinM81/img.png&quot; data-alt=&quot;오른쪽 아래의 위젯 단추&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/DgxA4/dJMcafV8bO9/opavgNA4kzbsq4jGAinM81/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FDgxA4%2FdJMcafV8bO9%2FopavgNA4kzbsq4jGAinM81%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; alt=&quot;글 화면 오른쪽 아래에 에이전트에게 묻기 단추가 강조되어 있다&quot; loading=&quot;lazy&quot; width=&quot;600&quot; height=&quot;420&quot; data-filename=&quot;03-위젯-단추.png&quot; data-origin-width=&quot;1336&quot; data-origin-height=&quot;936&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;오른쪽 아래의 위젯 단추&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;margin-bottom: 16px !important;&quot; data-ke-size=&quot;size16&quot;&gt;단추를 누르고 질문을 보내면 구성 절의 그림처럼 답이 뜹니다. 이번에는 세션을 여는 시간까지 더해 약 5~6초 뒤에 답이 왔습니다. 답의 내용은 에이전트에 연결한 지식과 액션에 따라 달라집니다.&lt;/p&gt;
&lt;p style=&quot;margin-bottom: 16px !important;&quot; data-ke-size=&quot;size16&quot;&gt;좁은 화면에서는 대화 창이 화면 대부분을 덮습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;05-모바일-대화.png&quot; data-origin-width=&quot;836&quot; data-origin-height=&quot;1704&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/y9uz3/dJMcahl8770/K07meraeoa39lBKV6tH6yk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/y9uz3/dJMcahl8770/K07meraeoa39lBKV6tH6yk/img.png&quot; data-alt=&quot;모바일 대화 창&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/y9uz3/dJMcahl8770/K07meraeoa39lBKV6tH6yk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fy9uz3%2FdJMcahl8770%2FK07meraeoa39lBKV6tH6yk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; alt=&quot;모바일 화면 대부분을 덮은 대화 창에 같은 질문에 대한 에이전트의 답이 있고, 오른쪽 아래 닫기 단추 밑에 스킨의 목차 단추가 보인다&quot; loading=&quot;lazy&quot; width=&quot;418&quot; height=&quot;852&quot; data-filename=&quot;05-모바일-대화.png&quot; data-origin-width=&quot;836&quot; data-origin-height=&quot;1704&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;모바일 대화 창&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;현재는 UI/UX 개선이 진행되어 다음과 같은 귀여운 에이전트 포스 봇을 만날 수 있습니다 !&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;128&quot; data-origin-height=&quot;132&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/kDssX/dJMcafojAbZ/R8uCMavvklrAKalIUEZXfK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/kDssX/dJMcafojAbZ/R8uCMavvklrAKalIUEZXfK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/kDssX/dJMcafojAbZ/R8uCMavvklrAKalIUEZXfK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FkDssX%2FdJMcafojAbZ%2FR8uCMavvklrAKalIUEZXfK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;128&quot; height=&quot;132&quot; data-origin-width=&quot;128&quot; data-origin-height=&quot;132&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;div data-ke-type=&quot;moreLess&quot; data-text-more=&quot;그림으로 쉽게 보는 요약 보기&quot; data-text-less=&quot;닫기&quot;&gt;&lt;a class=&quot;btn-toggle-moreless&quot;&gt;더보기&lt;/a&gt;
&lt;div class=&quot;moreless-content&quot;&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;eli5-01.png&quot; data-origin-width=&quot;1440&quot; data-origin-height=&quot;6470&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/2jVFo/dJMb992CPLo/Uzf5Waq9Q1AroYzlDHNmc0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/2jVFo/dJMb992CPLo/Uzf5Waq9Q1AroYzlDHNmc0/img.png&quot; data-alt=&quot;그림으로 쉽게 보는 요약&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/2jVFo/dJMb992CPLo/Uzf5Waq9Q1AroYzlDHNmc0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F2jVFo%2FdJMb992CPLo%2FUzf5Waq9Q1AroYzlDHNmc0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; alt=&quot;Vercel 함수가 필요한 이유, 준비물, 위젯과 Vercel 함수와 Salesforce 세 칸, 함수가 토큰을 맡는 방법, 블로그 주소에서 온 요청만 받는 검사, 위젯이 세션과 순번을 기억하는 방법, 배포와 curl 확인, 스킨에 한 줄 넣기를 차례로 그린 요약 그림&quot; loading=&quot;lazy&quot; width=&quot;720&quot; height=&quot;3235&quot; data-filename=&quot;eli5-01.png&quot; data-origin-width=&quot;1440&quot; data-origin-height=&quot;6470&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;그림으로 쉽게 보는 요약&lt;/figcaption&gt;
&lt;/figure&gt;

&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p style=&quot;margin-bottom: 16px !important;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;참고 문서&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;a href=&quot;https://developer.salesforce.com/docs/ai/agentforce/guide/agent-api.html&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Chat with Agents Using Agent API&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://developer.salesforce.com/docs/ai/agentforce/guide/agent-api-get-started.html&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Get Started with Agent API&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://developer.salesforce.com/docs/ai/agentforce/guide/agent-api-considerations.html&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Agent API Considerations&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://developer.salesforce.com/docs/ai/agentforce/guide/agent-api-troubleshooting.html&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Agent API Troubleshooting&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://help.salesforce.com/s/articleView?id=ai.agent_deploy_enhanced_chat_v1.htm&amp;amp;type=5&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Connect an Agent to Enhanced Chat v1&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://vercel.com/docs/functions&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Vercel Functions&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://vercel.com/docs/plans/hobby&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Vercel Hobby Plan&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://vite.dev/guide/build.html#library-mode&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Vite Library Mode&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/API/Web_components/Using_shadow_DOM&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Using shadow DOM (MDN)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/HTTP/Guides/CORS&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Cross-Origin Resource Sharing (MDN)&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>Salesforce/Agentforce</category>
      <category>Agent API</category>
      <category>Agentforce</category>
      <category>react</category>
      <category>vercel</category>
      <author>Luka.dev</author>
      <guid isPermaLink="true">https://jt98.tistory.com/42</guid>
      <comments>https://jt98.tistory.com/42#entry42comment</comments>
      <pubDate>Mon, 19 Oct 2026 15:40:40 +0900</pubDate>
    </item>
    <item>
      <title>Agentforce | Draft with Agentforce로 이메일 제목과 본문 초안 생성</title>
      <link>https://jt98.tistory.com/41</link>
      <description>&lt;div class=&quot;greeting&quot;&gt;
&lt;p style=&quot;line-height: 1.8 !important; margin: 0 0 0px !important;&quot; data-ke-size=&quot;size16&quot;&gt;안녕하세요, 루카입니다. 오늘은 Draft with Agentforce로 메일 제목과 본문 초안을 한국어로 받아서 이메일에 넣어 보겠습니다.&lt;/p&gt;
&lt;/div&gt;
&lt;hr data-ke-style=&quot;style5&quot; /&gt;
&lt;div class=&quot;lead-box&quot; style=&quot;background: color-mix(in srgb, var(--brand) 7%, transparent); border-top: 4px solid var(--brand); border-radius: 10px; padding: 18px 24px 16px; margin: 8px 0 28px;&quot;&gt;
&lt;p style=&quot;font-size: 20px !important; font-weight: bold; line-height: 1.55 !important; color: var(--ink); margin: 0 0 8px !important;&quot; data-ke-size=&quot;size16&quot;&gt;Draft with Agentforce는 Email Builder에서 메일 제목이나 문단에 넣을 초안을 AI에게 받는 기능입니다.&lt;/p&gt;
&lt;p style=&quot;font-size: 16px !important; line-height: 1.7 !important; margin: 0 0 4px !important;&quot; data-ke-size=&quot;size16&quot;&gt;받은 초안을 고쳐 쓰면 되므로 메일 제목과 첫 문단을 빨리 채울 수 있습니다.&lt;/p&gt;
&lt;/div&gt;
&lt;p style=&quot;margin-bottom: 16px !important;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;준비할 것&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;켜 둘 기능:&lt;/b&gt; Marketing Cloud Next(MCN) org에 Agentforce와 Einstein 생성형 AI가 켜져 있어야 합니다. 관리자가 마케팅 에이전트도 설정해 두어야 합니다(&lt;a href=&quot;https://jt98.tistory.com/26&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;AF-03 준비와 과금&lt;/a&gt;).&lt;/li&gt;
&lt;li&gt;&lt;b&gt;권한:&lt;/b&gt; 마케팅 에이전트를 쓰는 Marketing Team Agent Access 권한과, 마케팅 워크스페이스에서 이메일을 만들 수 있는 권한이 있어야 합니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Email Builder:&lt;/b&gt; 컴포넌트를 캔버스에 놓고 Settings 패널을 여는 방법은 &lt;a href=&quot;https://jt98.tistory.com/17&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;008 Email Builder&lt;/a&gt;에서 다뤘습니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;언어:&lt;/b&gt; 도움말은 초안 생성의 지원 언어를 영어(en_US) 하나로 적습니다. 이 글의 한국어 초안은 2026년 10월에 요청에 &quot;한국어로&quot;를 적어 받은 결과입니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;사용량:&lt;/b&gt; 초안을 받을 때 생성형 AI 사용량(Einstein Requests 또는 Flex Credits)을 씁니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p style=&quot;margin-bottom: 16px !important;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;완료 확인:&lt;/b&gt; 저장한 이메일을 다시 열었을 때 메일 제목과 문단에 한국어 초안이 들어 있으면 끝입니다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;브랜드 준비&lt;/h2&gt;
&lt;p style=&quot;font-size: 20px !important; font-weight: bold; line-height: 1.6 !important; color: var(--ink); margin-bottom: 16px !important;&quot; data-ke-size=&quot;size20&quot;&gt;이메일에 브랜드를 지정하면, 브랜드에 적어 둔 브랜드 소개와 톤이 초안 요청에 함께 들어갑니다.&lt;/p&gt;
&lt;p style=&quot;margin-bottom: 16px !important;&quot; data-ke-size=&quot;size16&quot;&gt;브랜드 지정은 필수가 아닙니다.&lt;/p&gt;
&lt;p style=&quot;font-size: 18px !important; font-weight: bold; line-height: 1.5 !important; color: var(--ink); margin-bottom: 10px !important;&quot; data-ke-size=&quot;size18&quot;&gt;1. 브랜드에 브랜드 소개와 톤을 적습니다&lt;/p&gt;
&lt;p style=&quot;margin-bottom: 16px !important;&quot; data-ke-size=&quot;size16&quot;&gt;마케팅 워크스페이스에서 &lt;b&gt;Add&lt;/b&gt; &amp;gt; &lt;b&gt;Content&lt;/b&gt;를 누르고 &lt;b&gt;Brand&lt;/b&gt;를 골라 &lt;b&gt;Create&lt;/b&gt;를 누릅니다. &lt;b&gt;Title&lt;/b&gt;에 브랜드 이름을, &lt;b&gt;Brand Identity&lt;/b&gt;에 브랜드 소개를 두 문장 정도 적습니다.&lt;/p&gt;
&lt;p style=&quot;font-size: 14px !important; line-height: 1.7 !important; color: var(--muted); margin-bottom: 16px !important;&quot; data-ke-size=&quot;size14&quot;&gt;Continue with Existing Builder와 Try Brand Center를 고르는 창이 뜨면 Continue with Existing Builder를 고릅니다. Brand Center는 관리자가 따로 켜야 합니다.&lt;/p&gt;
&lt;p style=&quot;margin-bottom: 16px !important;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Brand Tone&lt;/b&gt;에서 쓸 톤 카드의 메뉴를 열어 &lt;b&gt;Set as Default&lt;/b&gt;를 고르고 &lt;b&gt;Save&lt;/b&gt;를 누릅니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;01-브랜드-값.png&quot; data-origin-width=&quot;2104&quot; data-origin-height=&quot;1856&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/nDDhh/dJMcabM3wpI/NT4BksL96sTVEMkXWeihVK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/nDDhh/dJMcabM3wpI/NT4BksL96sTVEMkXWeihVK/img.png&quot; data-alt=&quot;Brand Identity와 기본 톤&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/nDDhh/dJMcabM3wpI/NT4BksL96sTVEMkXWeihVK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FnDDhh%2FdJMcabM3wpI%2FNT4BksL96sTVEMkXWeihVK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; alt=&quot;브랜드 편집 화면에서 Brand Identity 칸에 가상 학원 소개 두 문장이, Brand Tone에서 Casual 카드에 Default 표시가 번호로 강조되어 있다&quot; loading=&quot;lazy&quot; width=&quot;720&quot; height=&quot;635&quot; data-filename=&quot;01-브랜드-값.png&quot; data-origin-width=&quot;2104&quot; data-origin-height=&quot;1856&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Brand Identity와 기본 톤&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;margin-bottom: 16px !important;&quot; data-ke-size=&quot;size16&quot;&gt;이번 화면의 톤은 다섯 가지였습니다. 처음 기본값은 Professional이었고, 체험수업 안내에 맞춰 Casual로 바꿨습니다.&lt;/p&gt;
&lt;p style=&quot;font-size: 18px !important; font-weight: bold; line-height: 1.5 !important; color: var(--ink); margin-bottom: 10px !important;&quot; data-ke-size=&quot;size18&quot;&gt;2. 이메일에 브랜드를 지정합니다&lt;/p&gt;
&lt;p style=&quot;margin-bottom: 16px !important;&quot; data-ke-size=&quot;size16&quot;&gt;새 이메일을 &lt;b&gt;Use Components&lt;/b&gt;로 만들고 이름을 정합니다. 캔버스에 &lt;b&gt;Paragraph&lt;/b&gt;를 하나 놓으면 오른쪽 Settings 패널이 Paragraph 설정으로 바뀌므로, 뒤로 가기를 눌러 이메일 Settings 패널로 돌아옵니다.&lt;/p&gt;
&lt;p style=&quot;margin-bottom: 16px !important;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Brand&lt;/b&gt;의 &lt;b&gt;Select Brand&lt;/b&gt;에서 방금 만든 브랜드를 고르고 &lt;b&gt;Add&lt;/b&gt;를 누릅니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;02-이메일-브랜드.png&quot; data-origin-width=&quot;2104&quot; data-origin-height=&quot;1856&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/tMYuG/dJMcaa8qp1u/BtOkt2e4kWjKmSDItvJDJ0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/tMYuG/dJMcaa8qp1u/BtOkt2e4kWjKmSDItvJDJ0/img.png&quot; data-alt=&quot;이메일에 지정한 브랜드&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/tMYuG/dJMcaa8qp1u/BtOkt2e4kWjKmSDItvJDJ0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FtMYuG%2FdJMcaa8qp1u%2FBtOkt2e4kWjKmSDItvJDJ0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; alt=&quot;이메일 Settings 패널의 Brand 칸에 LUKA_033 브랜드가 지정되어 강조되어 있다&quot; loading=&quot;lazy&quot; width=&quot;720&quot; height=&quot;635&quot; data-filename=&quot;02-이메일-브랜드.png&quot; data-origin-width=&quot;2104&quot; data-origin-height=&quot;1856&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;이메일에 지정한 브랜드&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr data-ke-style=&quot;style5&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;제목 초안&lt;/h2&gt;
&lt;p style=&quot;font-size: 20px !important; font-weight: bold; line-height: 1.6 !important; color: var(--ink); margin-bottom: 16px !important;&quot; data-ke-size=&quot;size20&quot;&gt;메일 제목은 기본 확인 카드를 두고 요청을 새로 적어 보낸 뒤, 그 요청으로 뜬 확인 카드에서 Confirm을 눌러 초안을 받습니다.&lt;/p&gt;
&lt;p style=&quot;font-size: 18px !important; font-weight: bold; line-height: 1.5 !important; color: var(--ink); margin-bottom: 10px !important;&quot; data-ke-size=&quot;size18&quot;&gt;1. 메일 제목 칸의 반짝이 단추를 누릅니다&lt;/p&gt;
&lt;p style=&quot;margin-bottom: 16px !important;&quot; data-ke-size=&quot;size16&quot;&gt;이메일 Settings 패널을 아래로 내리면 메일 제목을 넣는 &lt;b&gt;Subject Line&lt;/b&gt; 칸이 있습니다. 칸 오른쪽의 반짝이 모양 단추가 &lt;b&gt;Draft with Agentforce&lt;/b&gt; 단추입니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;03-제목-반짝이.png&quot; data-origin-width=&quot;2104&quot; data-origin-height=&quot;1856&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/5xrdv/dJMcabM3wp5/kPZUO0jKKdpLH4E0FpjK1K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/5xrdv/dJMcabM3wp5/kPZUO0jKKdpLH4E0FpjK1K/img.png&quot; data-alt=&quot;메일 제목 칸 옆의 반짝이 단추&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/5xrdv/dJMcabM3wp5/kPZUO0jKKdpLH4E0FpjK1K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F5xrdv%2FdJMcabM3wp5%2FkPZUO0jKKdpLH4E0FpjK1K%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; alt=&quot;Settings 패널의 Subject Line 칸이 비어 있고 칸 오른쪽의 반짝이 단추가 강조되어 있다&quot; loading=&quot;lazy&quot; width=&quot;720&quot; height=&quot;635&quot; data-filename=&quot;03-제목-반짝이.png&quot; data-origin-width=&quot;2104&quot; data-origin-height=&quot;1856&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;메일 제목 칸 옆의 반짝이 단추&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;font-size: 14px !important; line-height: 1.7 !important; color: var(--muted); margin-bottom: 16px !important;&quot; data-ke-size=&quot;size14&quot;&gt;패널 위쪽의 data graph 경고는 Dynamic Content에 관한 것이라 초안 받기와는 상관없습니다.&lt;/p&gt;
&lt;p style=&quot;font-size: 18px !important; font-weight: bold; line-height: 1.5 !important; color: var(--ink); margin-bottom: 10px !important;&quot; data-ke-size=&quot;size18&quot;&gt;2. 요청을 새로 적어 보냅니다&lt;/p&gt;
&lt;p style=&quot;margin-bottom: 16px !important;&quot; data-ke-size=&quot;size16&quot;&gt;단추를 누르면 화면 위에 Agentforce 창이 뜨고, 기본 확인 카드가 먼저 나옵니다. 이 카드의 User Input에는 &quot;Can you draft a new subject line for my email?&quot; 같은 영어 기본 요청이 들어 있습니다.&lt;/p&gt;
&lt;p style=&quot;margin-bottom: 16px !important;&quot; data-ke-size=&quot;size16&quot;&gt;메일 제목에서는 이 카드의 &lt;b&gt;Confirm&lt;/b&gt;을 누르지 않습니다. 창 아래 입력 칸에 &quot;체험수업 신청을 권하는 메일 제목을 한국어로 써 줘&quot;처럼 요청을 적어 보내면, 적은 요청으로 새 확인 카드가 뜹니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;04-확인-카드.png&quot; data-origin-width=&quot;896&quot; data-origin-height=&quot;1516&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ba9Tpf/dJMcabFZXan/mTDodLUw8dM667egLK9imk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ba9Tpf/dJMcabFZXan/mTDodLUw8dM667egLK9imk/img.png&quot; data-alt=&quot;적은 요청으로 뜬 새 확인 카드&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ba9Tpf/dJMcabFZXan/mTDodLUw8dM667egLK9imk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fba9Tpf%2FdJMcabFZXan%2FmTDodLUw8dM667egLK9imk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; alt=&quot;Agentforce 창의 확인 카드에 User Input, Key Message, Tone casual, Brand Identity가 보이고 카드 전체와 Confirm 단추가 번호로 강조되어 있다&quot; loading=&quot;lazy&quot; width=&quot;448&quot; height=&quot;758&quot; data-filename=&quot;04-확인-카드.png&quot; data-origin-width=&quot;896&quot; data-origin-height=&quot;1516&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;적은 요청으로 뜬 새 확인 카드&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;margin-bottom: 16px !important;&quot; data-ke-size=&quot;size16&quot;&gt;새 확인 카드의 &lt;b&gt;User Input&lt;/b&gt;에는 적은 요청이 들어갑니다. &lt;b&gt;Key Message&lt;/b&gt;에는 에이전트가 요약한 핵심 메시지가, &lt;b&gt;Tone&lt;/b&gt;과 &lt;b&gt;Brand Identity&lt;/b&gt;에는 브랜드의 값이 들어 있습니다.&lt;/p&gt;
&lt;div class=&quot;say warn&quot;&gt;&lt;span class=&quot;badge i-alert&quot; aria-hidden=&quot;true&quot;&gt;&lt;/span&gt;
&lt;div&gt;&lt;b&gt;주의&lt;/b&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;요청을 보냈는데 새 확인 카드 없이 영어 초안이 바로 나올 수 있습니다. 이 초안은 Apply하지 않고 같은 요청을 한 번 더 보냅니다. 이번 시험에서는 두 번째에 새 확인 카드가 떴습니다.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p style=&quot;font-size: 18px !important; font-weight: bold; line-height: 1.5 !important; color: var(--ink); margin-bottom: 10px !important;&quot; data-ke-size=&quot;size18&quot;&gt;3. Confirm을 누르고 초안을 Apply합니다&lt;/p&gt;
&lt;p style=&quot;margin-bottom: 16px !important;&quot; data-ke-size=&quot;size16&quot;&gt;새 확인 카드의 &lt;b&gt;Confirm&lt;/b&gt;을 누르면 결과 카드에 메일 제목 초안이 나옵니다. &lt;b&gt;Apply&lt;/b&gt;를 누르면 Subject Line 칸과 캔버스 위 메일 제목에 초안이 들어갑니다. 초안이 마음에 들지 않으면 &lt;b&gt;Try Again&lt;/b&gt;으로 다시 받습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;05-한국어-결과.png&quot; data-origin-width=&quot;896&quot; data-origin-height=&quot;1536&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bHukgA/dJMcaf9pGmW/PoIwyEgnCAqdpRU7D9k571/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bHukgA/dJMcaf9pGmW/PoIwyEgnCAqdpRU7D9k571/img.png&quot; data-alt=&quot;한국어로 받은 메일 제목 초안&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bHukgA/dJMcaf9pGmW/PoIwyEgnCAqdpRU7D9k571/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbHukgA%2FdJMcaf9pGmW%2FPoIwyEgnCAqdpRU7D9k571%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; alt=&quot;결과 카드에 한국어 메일 제목 초안 '지금 바로 체험수업을 신청하세요!'와 Apply 단추가 번호로 강조되어 있다&quot; loading=&quot;lazy&quot; width=&quot;448&quot; height=&quot;768&quot; data-filename=&quot;05-한국어-결과.png&quot; data-origin-width=&quot;896&quot; data-origin-height=&quot;1536&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;한국어로 받은 메일 제목 초안&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;06-제목-적용.png&quot; data-origin-width=&quot;2104&quot; data-origin-height=&quot;1856&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bXUOaG/dJMcaggjzkc/zqySVqAxBvVp6JbOw8FeMk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bXUOaG/dJMcaggjzkc/zqySVqAxBvVp6JbOw8FeMk/img.png&quot; data-alt=&quot;메일 제목에 넣은 초안&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bXUOaG/dJMcaggjzkc/zqySVqAxBvVp6JbOw8FeMk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbXUOaG%2FdJMcaggjzkc%2FzqySVqAxBvVp6JbOw8FeMk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; alt=&quot;Apply 뒤 Settings 패널의 Subject Line 칸과 캔버스 위 메일 제목에 한국어 초안이 들어가 번호로 강조되어 있다&quot; loading=&quot;lazy&quot; width=&quot;720&quot; height=&quot;635&quot; data-filename=&quot;06-제목-적용.png&quot; data-origin-width=&quot;2104&quot; data-origin-height=&quot;1856&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;메일 제목에 넣은 초안&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;margin-bottom: 16px !important;&quot; data-ke-size=&quot;size16&quot;&gt;메일 제목이 들어가면 &lt;b&gt;Save&lt;/b&gt;를 누릅니다. 새 이메일은 메일 제목이 있어야 저장됩니다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style5&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;본문 초안&lt;/h2&gt;
&lt;p style=&quot;font-size: 20px !important; font-weight: bold; line-height: 1.6 !important; color: var(--ink); margin-bottom: 16px !important;&quot; data-ke-size=&quot;size20&quot;&gt;문단은 기본 확인 카드에서 바로 Confirm을 누릅니다. 먼저 나온 영어 초안을 &quot;한국어로 다시 써 줘&quot;로 다시 받은 뒤 Apply합니다.&lt;/p&gt;
&lt;p style=&quot;font-size: 18px !important; font-weight: bold; line-height: 1.5 !important; color: var(--ink); margin-bottom: 10px !important;&quot; data-ke-size=&quot;size18&quot;&gt;1. 문단 툴바의 반짝이 단추를 누릅니다&lt;/p&gt;
&lt;p style=&quot;margin-bottom: 16px !important;&quot; data-ke-size=&quot;size16&quot;&gt;캔버스의 Paragraph를 두 번 누르면 서식 툴바가 뜹니다. 툴바 위쪽 줄에 반짝이 단추가 있고, 한 번만 누르면 이 단추가 보이지 않습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;07-문단-반짝이.png&quot; data-origin-width=&quot;2104&quot; data-origin-height=&quot;1856&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/biz2lt/dJMcaggjzkf/89zVFJfCcr4jkseWNG2zhK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/biz2lt/dJMcaggjzkf/89zVFJfCcr4jkseWNG2zhK/img.png&quot; data-alt=&quot;문단 툴바의 반짝이 단추&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/biz2lt/dJMcaggjzkf/89zVFJfCcr4jkseWNG2zhK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbiz2lt%2FdJMcaggjzkf%2F89zVFJfCcr4jkseWNG2zhK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; alt=&quot;캔버스의 Paragraph를 두 번 눌러 뜬 툴바에서 반짝이 단추가 강조되어 있다&quot; loading=&quot;lazy&quot; width=&quot;720&quot; height=&quot;635&quot; data-filename=&quot;07-문단-반짝이.png&quot; data-origin-width=&quot;2104&quot; data-origin-height=&quot;1856&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;문단 툴바의 반짝이 단추&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;font-size: 18px !important; font-weight: bold; line-height: 1.5 !important; color: var(--ink); margin-bottom: 10px !important;&quot; data-ke-size=&quot;size18&quot;&gt;2. 영어 초안을 받은 뒤 한국어로 다시 받습니다&lt;/p&gt;
&lt;p style=&quot;margin-bottom: 16px !important;&quot; data-ke-size=&quot;size16&quot;&gt;문단은 메일 제목과 순서가 다릅니다. 처음부터 &quot;한국어로&quot;를 넣어 보내면 영어 초안이 나오거나, Apply해도 문단에 글자가 들어가지 않은 적이 있었습니다.&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;기본 확인 카드에서 바로 &lt;b&gt;Confirm&lt;/b&gt;을 눌러 영어 초안을 받습니다.&lt;/li&gt;
&lt;li&gt;영어 초안은 Apply하지 않고, 창 아래 입력 칸에 &quot;한국어로 다시 써 줘&quot;를 보냅니다.&lt;/li&gt;
&lt;li&gt;새 확인 카드에서 &lt;b&gt;Confirm&lt;/b&gt;을 누르면 한국어 초안이 나옵니다.&lt;/li&gt;
&lt;/ol&gt;
&lt;p style=&quot;font-size: 18px !important; font-weight: bold; line-height: 1.5 !important; color: var(--ink); margin-bottom: 10px !important;&quot; data-ke-size=&quot;size18&quot;&gt;3. Apply한 뒤 문단을 확인하고 저장합니다&lt;/p&gt;
&lt;p style=&quot;margin-bottom: 16px !important;&quot; data-ke-size=&quot;size16&quot;&gt;받은 초안에는 브랜드 소개에 없는 내용이 섞일 수 있으므로, 넣기 전에 직접 읽고 사실과 다른 곳을 고칩니다.&lt;/p&gt;
&lt;p style=&quot;margin-bottom: 16px !important;&quot; data-ke-size=&quot;size16&quot;&gt;한국어 초안의 &lt;b&gt;Apply&lt;/b&gt;를 누르고, 캔버스 문단에 글자가 들어갔는지 확인한 뒤 &lt;b&gt;Save&lt;/b&gt;를 누릅니다. 문단이 빈 채로 남으면 저장하지 않고 반짝이 단추부터 다시 누릅니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;09-완료-확인.png&quot; data-origin-width=&quot;2104&quot; data-origin-height=&quot;1856&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bxTpZN/dJMcajqsXfJ/GIdobKH0wXrdl4yWRUQ0O0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bxTpZN/dJMcajqsXfJ/GIdobKH0wXrdl4yWRUQ0O0/img.png&quot; data-alt=&quot;저장한 뒤 다시 연 이메일&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bxTpZN/dJMcajqsXfJ/GIdobKH0wXrdl4yWRUQ0O0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbxTpZN%2FdJMcajqsXfJ%2FGIdobKH0wXrdl4yWRUQ0O0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; alt=&quot;저장한 이메일을 다시 연 캔버스에 한국어 메일 제목과 한국어 문단이 들어 있고 문단이 강조되어 있다&quot; loading=&quot;lazy&quot; width=&quot;720&quot; height=&quot;635&quot; data-filename=&quot;09-완료-확인.png&quot; data-origin-width=&quot;2104&quot; data-origin-height=&quot;1856&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;저장한 뒤 다시 연 이메일&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;div data-ke-type=&quot;moreLess&quot; data-text-more=&quot;결과 카드 메뉴와 주의할 점 보기&quot; data-text-less=&quot;닫기&quot;&gt;&lt;a class=&quot;btn-toggle-moreless&quot;&gt;더보기&lt;/a&gt;
&lt;div class=&quot;moreless-content&quot;&gt;
&lt;p style=&quot;margin-bottom: 16px !important;&quot; data-ke-size=&quot;size16&quot;&gt;결과 카드의 Try Again 옆 ▼ 메뉴에는 톤 바꾸기 다섯 가지, 길이 늘리기&amp;middot;줄이기, 핵심 메시지와 대상 고객으로 다시 쓰기가 있습니다.&lt;/p&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;08-결과-메뉴.png&quot; data-origin-width=&quot;896&quot; data-origin-height=&quot;1536&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/balmrQ/dJMcac536sk/4q9yCfHTNeGw3xlVAmlNgK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/balmrQ/dJMcac536sk/4q9yCfHTNeGw3xlVAmlNgK/img.png&quot; data-alt=&quot;결과 카드의 메뉴&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/balmrQ/dJMcac536sk/4q9yCfHTNeGw3xlVAmlNgK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbalmrQ%2FdJMcac536sk%2F4q9yCfHTNeGw3xlVAmlNgK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; alt=&quot;문단 결과 카드 아래의 메뉴가 펼쳐져 Revise by Key Message부터 Decrease Length까지의 항목이 강조되어 있다&quot; loading=&quot;lazy&quot; width=&quot;448&quot; height=&quot;768&quot; data-filename=&quot;08-결과-메뉴.png&quot; data-origin-width=&quot;896&quot; data-origin-height=&quot;1536&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;결과 카드의 메뉴&lt;/figcaption&gt;
&lt;/figure&gt;

&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;길이 늘리기:&lt;/b&gt; 한국어 초안에서 고르면 한국어로 늘어났습니다. 그러나 늘어난 초안은 Apply해도 문단에 들어가지 않았고, 브랜드 소개에 없는 &quot;전문 강사진&quot;도 생겼습니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;글이 있는 문단:&lt;/b&gt; 이미 글이 들어간 문단에서 받은 새 초안은 영어였습니다. 여기에 &quot;한국어로 다시 써 줘&quot;를 보내면 지원하지 않는다는 답이 나왔습니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;그래서 이 글에서는:&lt;/b&gt; 메뉴를 거치지 않은 한국어 초안을 Apply했습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;hr data-ke-style=&quot;style5&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;결과 언어&lt;/h2&gt;
&lt;p style=&quot;font-size: 20px !important; font-weight: bold; line-height: 1.6 !important; color: var(--ink); margin-bottom: 16px !important;&quot; data-ke-size=&quot;size20&quot;&gt;요청을 한국어로 써도 초안은 영어로 나올 수 있습니다. &quot;한국어로 써 줘&quot;처럼 결과 언어를 요청에 적습니다.&lt;/p&gt;
&lt;p style=&quot;margin-bottom: 16px !important;&quot; data-ke-size=&quot;size16&quot;&gt;같은 요청에서 &quot;한국어로&quot;만 빼고 보냈습니다. 창의 안내 문장은 한국어였지만 메일 제목 초안은 영어였습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;10-영어-결과.png&quot; data-origin-width=&quot;896&quot; data-origin-height=&quot;1536&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Jhljy/dJMcaaN5fh3/OBvUVB5uesDh56ceEv3qTk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Jhljy/dJMcaaN5fh3/OBvUVB5uesDh56ceEv3qTk/img.png&quot; data-alt=&quot;&amp;quot;한국어로&amp;quot;를 빼고 요청한 결과&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Jhljy/dJMcaaN5fh3/OBvUVB5uesDh56ceEv3qTk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FJhljy%2FdJMcaaN5fh3%2FOBvUVB5uesDh56ceEv3qTk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; alt=&quot;User Input에 '체험수업 신청을 권하는 메일 제목을 써 줘'가 보이는 카드 아래 결과 카드에 영어 메일 제목 'Join Our Trial Class Today!'가 강조되어 있다&quot; loading=&quot;lazy&quot; width=&quot;448&quot; height=&quot;768&quot; data-filename=&quot;10-영어-결과.png&quot; data-origin-width=&quot;896&quot; data-origin-height=&quot;1536&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;&quot;한국어로&quot;를 빼고 요청한 결과&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;fig-01.png&quot; data-origin-width=&quot;1016&quot; data-origin-height=&quot;1000&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/P5oKY/dJMcaf9pGny/N21l3ImpELHV3Lyyc2jwK0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/P5oKY/dJMcaf9pGny/N21l3ImpELHV3Lyyc2jwK0/img.png&quot; data-alt=&quot;요청 문장과 결과 언어&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/P5oKY/dJMcaf9pGny/N21l3ImpELHV3Lyyc2jwK0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FP5oKY%2FdJMcaf9pGny%2FN21l3ImpELHV3Lyyc2jwK0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; alt=&quot;두 요청 문장과 결과를 위아래로 견준 그림: '메일 제목을 써 줘'는 영어 제목, '메일 제목을 한국어로 써 줘'는 한국어 제목이 나왔다&quot; loading=&quot;lazy&quot; width=&quot;480&quot; height=&quot;472&quot; data-filename=&quot;fig-01.png&quot; data-origin-width=&quot;1016&quot; data-origin-height=&quot;1000&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;요청 문장과 결과 언어&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;font-size: 14px !important; line-height: 1.7 !important; color: var(--muted); margin-bottom: 16px !important;&quot; data-ke-size=&quot;size14&quot;&gt;두 요청은 캔버스가 빈 이메일에서 한 번씩 보냈습니다.&lt;/p&gt;
&lt;div data-ke-type=&quot;moreLess&quot; data-text-more=&quot;그림으로 쉽게 보는 요약 보기&quot; data-text-less=&quot;닫기&quot;&gt;&lt;a class=&quot;btn-toggle-moreless&quot;&gt;더보기&lt;/a&gt;
&lt;div class=&quot;moreless-content&quot;&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;eli5-01.png&quot; data-origin-width=&quot;1440&quot; data-origin-height=&quot;4082&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bbRCf3/dJMcab7cm0D/xjYM0LUuZIBlZvgt1jyh3K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bbRCf3/dJMcab7cm0D/xjYM0LUuZIBlZvgt1jyh3K/img.png&quot; data-alt=&quot;그림으로 쉽게 보는 요약&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bbRCf3/dJMcab7cm0D/xjYM0LUuZIBlZvgt1jyh3K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbbRCf3%2FdJMcab7cm0D%2FxjYM0LUuZIBlZvgt1jyh3K%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; alt=&quot;켜 둘 기능과 권한과 사용량, 브랜드 소개와 톤 적기, 메일 제목은 요청을 직접 적어 Confirm 뒤 Apply, 본문은 영어 초안을 Apply하지 않고 다시 써 달라고 해 한국어 받기, 넣기 전에 직접 읽고 저장, 결과 언어는 요청에 적기를 차례로 그린 그림&quot; loading=&quot;lazy&quot; width=&quot;720&quot; height=&quot;2041&quot; data-filename=&quot;eli5-01.png&quot; data-origin-width=&quot;1440&quot; data-origin-height=&quot;4082&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;그림으로 쉽게 보는 요약&lt;/figcaption&gt;
&lt;/figure&gt;

&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p style=&quot;margin-bottom: 16px !important;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;참고 문서&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;a href=&quot;https://help.salesforce.com/s/articleView?id=mktg.mktg_content_email_create.htm&amp;amp;type=5&amp;amp;language=en_US&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Create an Email in Marketing Cloud Next&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://help.salesforce.com/s/articleView?id=ai.copilot_actions_ref_mc_draft_content.htm&amp;amp;type=5&amp;amp;language=en_US&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Marketing | Draft Content&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://help.salesforce.com/s/articleView?id=mktg.mktg_einstein_draft_content_considerations.htm&amp;amp;type=5&amp;amp;language=en_US&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Considerations for Drafting Content in Marketing Cloud Next&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://help.salesforce.com/s/articleView?id=mktg.mktg_einstein_copilot_in_mc.htm&amp;amp;type=5&amp;amp;language=en_US&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;AI in Marketing Cloud Next&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://help.salesforce.com/s/articleView?id=mktg.mktg_content_brand.htm&amp;amp;type=5&amp;amp;language=en_US&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Brand Your Content in Marketing Cloud Next&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://help.salesforce.com/s/articleView?id=mktg.mktg_admin_setup_einstein.htm&amp;amp;type=5&amp;amp;language=en_US&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Enable AI Features in Marketing Cloud Next&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>Salesforce/Agentforce</category>
      <category>Agentforce</category>
      <category>Draft with Agentforce</category>
      <category>Email Builder</category>
      <category>Marketing Cloud Next</category>
      <category>mca</category>
      <author>Luka.dev</author>
      <guid isPermaLink="true">https://jt98.tistory.com/41</guid>
      <comments>https://jt98.tistory.com/41#entry41comment</comments>
      <pubDate>Mon, 19 Oct 2026 14:40:55 +0900</pubDate>
    </item>
    <item>
      <title>Agentforce | Agent API로 Salesforce 외부에서 에이전트와 메시지 주고받는법</title>
      <link>https://jt98.tistory.com/40</link>
      <description>&lt;div class=&quot;greeting&quot;&gt;
&lt;p style=&quot;line-height: 1.8 !important; margin: 0 0 0px !important;&quot; data-ke-size=&quot;size16&quot;&gt;안녕하세요, 루카입니다. 오늘은 External Client App을 만들고 curl로 Agent API를 호출해, Salesforce 밖에서 Agentforce 에이전트와 메시지를 주고받아 보겠습니다.&lt;/p&gt;
&lt;/div&gt;
&lt;hr data-ke-style=&quot;style5&quot; /&gt;
&lt;div class=&quot;lead-box&quot; style=&quot;background: color-mix(in srgb, var(--brand) 7%, transparent); border-top: 4px solid var(--brand); border-radius: 10px; padding: 18px 24px 16px; margin: 8px 0 28px;&quot;&gt;
&lt;p style=&quot;font-size: 20px !important; font-weight: bold; line-height: 1.55 !important; color: var(--ink); margin: 0 0 8px !important;&quot; data-ke-size=&quot;size16&quot;&gt;Agent API는 Salesforce 밖의 프로그램이 Agentforce 에이전트에게 메시지를 보내고 답을 받게 해 주는 기능입니다.&lt;/p&gt;
&lt;p style=&quot;font-size: 16px !important; line-height: 1.7 !important; margin: 0 0 4px !important;&quot; data-ke-size=&quot;size16&quot;&gt;홈페이지나 사내 시스템이 자기 화면에 에이전트의 답을 보여 주려면, 그 시스템이 이 API를 호출해야 합니다.&lt;/p&gt;
&lt;/div&gt;
&lt;p style=&quot;margin-bottom: 16px !important;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;준비할 것&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;org와 권한:&lt;/b&gt; Agentforce가 켜진 org와 시스템 관리자 권한이 필요합니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;터미널:&lt;/b&gt; curl을 쓸 수 있는 bash 계열 터미널(macOS, Linux, Windows는 Git Bash)을 준비합니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;사용자 라이선스:&lt;/b&gt; 이번에는 연동 사용자에게 &lt;b&gt;Salesforce Integration&lt;/b&gt; 라이선스를 썼습니다. 남은 수는 Setup의 &lt;b&gt;Company Information&lt;/b&gt;에서 확인합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p style=&quot;margin-bottom: 16px !important;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;완료 확인:&lt;/b&gt; 메시지를 보내면 에이전트의 답(type Inform)이 오고, 세션을 닫았을 때 SessionEnded가 오면 끝입니다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;에이전트 준비&lt;/h2&gt;
&lt;p style=&quot;font-size: 20px !important; font-weight: bold; line-height: 1.6 !important; color: var(--ink); margin-bottom: 16px !important;&quot; data-ke-size=&quot;size20&quot;&gt;Agent API로 부를 에이전트를 만들어 활성화한 뒤, Agent ID는 빌더 주소가 아니라 조회로 얻습니다.&lt;/p&gt;
&lt;p style=&quot;font-size: 18px !important; font-weight: bold; line-height: 1.5 !important; color: var(--ink); margin-bottom: 10px !important;&quot; data-ke-size=&quot;size18&quot;&gt;1. Service 에이전트를 만듭니다&lt;/p&gt;
&lt;p style=&quot;margin-bottom: 16px !important;&quot; data-ke-size=&quot;size16&quot;&gt;Setup의 &lt;b&gt;Agentforce Agents&lt;/b&gt;에서 &lt;b&gt;New Agent&lt;/b&gt;를 누르고, 새 빌더 안내 창의 &lt;b&gt;Create Agent&lt;/b&gt;를 누릅니다. 새 탭의 템플릿 목록에서 &lt;b&gt;Agentforce Service Agent&lt;/b&gt;의 &lt;b&gt;Select&lt;/b&gt;를 누릅니다.&lt;/p&gt;
&lt;p style=&quot;margin-bottom: 16px !important;&quot; data-ke-size=&quot;size16&quot;&gt;Agent API 문서에 따르면 Agentforce (Default) 유형은 Agent API로 부를 수 없습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;01-템플릿-선택.png&quot; data-origin-width=&quot;1716&quot; data-origin-height=&quot;1016&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dAiMqT/dJMcag1zwnT/zrzgJi3EHGTg47jfD1JRF1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dAiMqT/dJMcag1zwnT/zrzgJi3EHGTg47jfD1JRF1/img.png&quot; data-alt=&quot;Agentforce Service Agent 템플릿&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dAiMqT/dJMcag1zwnT/zrzgJi3EHGTg47jfD1JRF1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdAiMqT%2FdJMcag1zwnT%2FzrzgJi3EHGTg47jfD1JRF1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; alt=&quot;템플릿 목록에서 Agentforce Service Agent 카드가 주황 상자로 강조되어 있다&quot; loading=&quot;lazy&quot; width=&quot;720&quot; height=&quot;426&quot; data-filename=&quot;01-템플릿-선택.png&quot; data-origin-width=&quot;1716&quot; data-origin-height=&quot;1016&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Agentforce Service Agent 템플릿&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;margin-bottom: 16px !important;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Name your agent&lt;/b&gt; 창에서 이름과 Developer Name을 넣고, &lt;b&gt;New User&lt;/b&gt;를 고른 뒤 &lt;b&gt;Let's Go&lt;/b&gt;를 누릅니다. New User를 고르면 이 에이전트가 동작할 때 쓰는 에이전트 사용자(Agent User)가 함께 만들어집니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;01b-에이전트-이름.png&quot; data-origin-width=&quot;1376&quot; data-origin-height=&quot;966&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/qIq1s/dJMcafIC6jI/Jyox5YYD7jz2kBJVEsHBRk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/qIq1s/dJMcafIC6jI/Jyox5YYD7jz2kBJVEsHBRk/img.png&quot; data-alt=&quot;이름과 에이전트 사용자 지정&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/qIq1s/dJMcafIC6jI/Jyox5YYD7jz2kBJVEsHBRk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FqIq1s%2FdJMcafIC6jI%2FJyox5YYD7jz2kBJVEsHBRk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; alt=&quot;Name your agent 창에 Agent Name과 Developer Name이 입력되어 있고 New User 단추가 강조되어 있다&quot; loading=&quot;lazy&quot; width=&quot;540&quot; height=&quot;379&quot; data-filename=&quot;01b-에이전트-이름.png&quot; data-origin-width=&quot;1376&quot; data-origin-height=&quot;966&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;이름과 에이전트 사용자 지정&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;font-size: 18px !important; font-weight: bold; line-height: 1.5 !important; color: var(--ink); margin-bottom: 10px !important;&quot; data-ke-size=&quot;size18&quot;&gt;2. 허용 언어에 Korean을 추가합니다&lt;/p&gt;
&lt;p style=&quot;margin-bottom: 16px !important;&quot; data-ke-size=&quot;size16&quot;&gt;빌더의 &lt;b&gt;Language Settings&lt;/b&gt;에서 &lt;b&gt;Allowed Languages&lt;/b&gt;에 Korean을 더하고 저장합니다. 이렇게 둔 뒤 에이전트는 한국어 질문에 한국어로 답했고, 첫인사는 기본 언어인 영어로 보냈습니다.&lt;/p&gt;
&lt;p style=&quot;font-size: 18px !important; font-weight: bold; line-height: 1.5 !important; color: var(--ink); margin-bottom: 10px !important;&quot; data-ke-size=&quot;size18&quot;&gt;3. 버전을 커밋하고 활성화합니다&lt;/p&gt;
&lt;p style=&quot;margin-bottom: 16px !important;&quot; data-ke-size=&quot;size16&quot;&gt;빌더에서 &lt;b&gt;Commit Version&lt;/b&gt;을 누르고 확인 창의 &lt;b&gt;Commit&lt;/b&gt;을 누릅니다. 커밋하기 전의 Draft 버전에는 &lt;b&gt;Activate&lt;/b&gt; 단추가 보이지 않습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;02a-commit-확인.png&quot; data-origin-width=&quot;1096&quot; data-origin-height=&quot;696&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cpGnSX/dJMcaf9pzQ1/CCkCSjfnLsfVZfALUk3NKK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cpGnSX/dJMcaf9pzQ1/CCkCSjfnLsfVZfALUk3NKK/img.png&quot; data-alt=&quot;버전 커밋 확인 창&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cpGnSX/dJMcaf9pzQ1/CCkCSjfnLsfVZfALUk3NKK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcpGnSX%2FdJMcaf9pzQ1%2FCCkCSjfnLsfVZfALUk3NKK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; alt=&quot;Commit Version 확인 창에서 Commit 단추가 강조되어 있다&quot; loading=&quot;lazy&quot; width=&quot;540&quot; height=&quot;343&quot; data-filename=&quot;02a-commit-확인.png&quot; data-origin-width=&quot;1096&quot; data-origin-height=&quot;696&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;버전 커밋 확인 창&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;margin-bottom: 16px !important;&quot; data-ke-size=&quot;size16&quot;&gt;커밋이 끝나면 &lt;b&gt;Activate&lt;/b&gt;를 누르고, &lt;b&gt;Ready to activate your agent?&lt;/b&gt; 창에서 다시 &lt;b&gt;Activate&lt;/b&gt;를 누릅니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;02a2-활성화-확인.png&quot; data-origin-width=&quot;1136&quot; data-origin-height=&quot;636&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/vnNUp/dJMcag1zwol/kakChrxKIOPe2ZQlEeGGjK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/vnNUp/dJMcag1zwol/kakChrxKIOPe2ZQlEeGGjK/img.png&quot; data-alt=&quot;활성화 확인 창&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/vnNUp/dJMcag1zwol/kakChrxKIOPe2ZQlEeGGjK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FvnNUp%2FdJMcag1zwol%2FkakChrxKIOPe2ZQlEeGGjK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; alt=&quot;Ready to activate your agent? 창에서 Activate 단추가 강조되어 있다&quot; loading=&quot;lazy&quot; width=&quot;540&quot; height=&quot;302&quot; data-filename=&quot;02a2-활성화-확인.png&quot; data-origin-width=&quot;1136&quot; data-origin-height=&quot;636&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;활성화 확인 창&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;02b2-활성-상태.png&quot; data-origin-width=&quot;2104&quot; data-origin-height=&quot;276&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bod2Zq/dJMcaaHk4u0/8qwijYqBdKAGZgOndfLk8K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bod2Zq/dJMcaaHk4u0/8qwijYqBdKAGZgOndfLk8K/img.png&quot; data-alt=&quot;활성화된 에이전트&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bod2Zq/dJMcaaHk4u0/8qwijYqBdKAGZgOndfLk8K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbod2Zq%2FdJMcaaHk4u0%2F8qwijYqBdKAGZgOndfLk8K%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; alt=&quot;빌더 머리에 Version 1 (Active)와 Deactivate 단추가 강조되어 있다&quot; loading=&quot;lazy&quot; width=&quot;720&quot; height=&quot;94&quot; data-filename=&quot;02b2-활성-상태.png&quot; data-origin-width=&quot;2104&quot; data-origin-height=&quot;276&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;활성화된 에이전트&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;font-size: 18px !important; font-weight: bold; line-height: 1.5 !important; color: var(--ink); margin-bottom: 10px !important;&quot; data-ke-size=&quot;size18&quot;&gt;4. Agent ID를 조회합니다&lt;/p&gt;
&lt;p style=&quot;margin-bottom: 16px !important;&quot; data-ke-size=&quot;size16&quot;&gt;새 빌더의 주소에 보이는 ID는 빌더 프로젝트와 버전의 ID(각각 1bY, 1bZ로 시작)라서 Agent ID가 아닙니다. Agent ID는 Developer Console의 &lt;b&gt;Query Editor&lt;/b&gt;에서 아래처럼 조회합니다. 결과의 Id가 0Xx로 시작하면 맞게 찾은 것입니다.&lt;/p&gt;
&lt;pre id=&quot;code_1&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;SELECT Id FROM BotDefinition
WHERE DeveloperName =
  'LUKA_031_Class_Guide'&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;02c-에이전트-ID-조회.png&quot; data-origin-width=&quot;1336&quot; data-origin-height=&quot;304&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/G0vnP/dJMcafIC6k6/T5vNRIQTFYoG3US0YcdGfK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/G0vnP/dJMcafIC6k6/T5vNRIQTFYoG3US0YcdGfK/img.png&quot; data-alt=&quot;BotDefinition으로 찾은 Agent ID&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/G0vnP/dJMcafIC6k6/T5vNRIQTFYoG3US0YcdGfK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FG0vnP%2FdJMcafIC6k6%2FT5vNRIQTFYoG3US0YcdGfK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; alt=&quot;Query Editor에 BotDefinition 조회 결과 한 행이 있고 0Xx로 시작하는 Id가 강조되어 있다&quot; loading=&quot;lazy&quot; width=&quot;660&quot; height=&quot;150&quot; data-filename=&quot;02c-에이전트-ID-조회.png&quot; data-origin-width=&quot;1336&quot; data-origin-height=&quot;304&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;BotDefinition으로 찾은 Agent ID&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;margin-bottom: 16px !important;&quot; data-ke-size=&quot;size16&quot;&gt;DeveloperName에는 만든 에이전트의 Developer Name을 넣습니다.&lt;/p&gt;
&lt;p style=&quot;font-size: 14px !important; line-height: 1.7 !important; color: var(--muted); margin-bottom: 16px !important;&quot; data-ke-size=&quot;size14&quot;&gt;이번에 시험한 Developer Edition org 하나에서는 커밋과 활성화가 계속 실패했고, 내부 응답은 &quot;Changes for this Bot Version are not allowed at the moment&quot;였습니다. 다른 org에서는 같은 순서로 활성화됐습니다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style5&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;앱 만들기&lt;/h2&gt;
&lt;p style=&quot;font-size: 20px !important; font-weight: bold; line-height: 1.6 !important; color: var(--ink); margin-bottom: 16px !important;&quot; data-ke-size=&quot;size20&quot;&gt;External Client App에서 Client Credentials Flow를 켜고, API만 쓸 수 있는 연동 사용자를 Run As로 지정합니다.&lt;/p&gt;
&lt;p style=&quot;margin-bottom: 16px !important;&quot; data-ke-size=&quot;size16&quot;&gt;External Client App은 외부 시스템이 Salesforce API에 접속할 때 쓰는 앱 설정입니다. Agent API 문서는 Connected App이 아니라 이 앱을 만들라고 안내합니다.&lt;/p&gt;
&lt;p style=&quot;font-size: 18px !important; font-weight: bold; line-height: 1.5 !important; color: var(--ink); margin-bottom: 10px !important;&quot; data-ke-size=&quot;size18&quot;&gt;1. 연동 사용자를 만듭니다&lt;/p&gt;
&lt;p style=&quot;margin-bottom: 16px !important;&quot; data-ke-size=&quot;size16&quot;&gt;Setup의 &lt;b&gt;Users&lt;/b&gt;에서 &lt;b&gt;New User&lt;/b&gt;를 엽니다. &lt;b&gt;User License&lt;/b&gt;는 Salesforce Integration, &lt;b&gt;Profile&lt;/b&gt;은 &lt;b&gt;Minimum Access - API Only Integrations&lt;/b&gt;를 고릅니다.&lt;/p&gt;
&lt;p style=&quot;margin-bottom: 16px !important;&quot; data-ke-size=&quot;size16&quot;&gt;이번에는 이 사용자에게 권한 집합을 따로 할당하지 않았고, 이 상태로 토큰 발급과 대화가 모두 됐습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;03-연동-사용자.png&quot; data-origin-width=&quot;1536&quot; data-origin-height=&quot;616&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/tYMDJ/dJMcaikYL8C/Ajas9Vk9WZGFLLGCmEB9Yk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/tYMDJ/dJMcaikYL8C/Ajas9Vk9WZGFLLGCmEB9Yk/img.png&quot; data-alt=&quot;연동 사용자의 라이선스와 프로필&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/tYMDJ/dJMcaikYL8C/Ajas9Vk9WZGFLLGCmEB9Yk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FtYMDJ%2FdJMcaikYL8C%2FAjas9Vk9WZGFLLGCmEB9Yk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; alt=&quot;New User 화면에서 User License Salesforce Integration과 Profile Minimum Access - API Only Integrations가 강조되어 있다&quot; loading=&quot;lazy&quot; width=&quot;720&quot; height=&quot;289&quot; data-filename=&quot;03-연동-사용자.png&quot; data-origin-width=&quot;1536&quot; data-origin-height=&quot;616&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;연동 사용자의 라이선스와 프로필&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;font-size: 18px !important; font-weight: bold; line-height: 1.5 !important; color: var(--ink); margin-bottom: 10px !important;&quot; data-ke-size=&quot;size18&quot;&gt;2. External Client App을 만듭니다&lt;/p&gt;
&lt;p style=&quot;margin-bottom: 16px !important;&quot; data-ke-size=&quot;size16&quot;&gt;Setup의 &lt;b&gt;External Client App Manager&lt;/b&gt;에서 &lt;b&gt;New External Client App&lt;/b&gt;을 누르고 이름과 연락 이메일을 넣습니다.&lt;/p&gt;
&lt;p style=&quot;margin-bottom: 16px !important;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Enable OAuth&lt;/b&gt;를 체크하고 &lt;b&gt;Callback URL&lt;/b&gt;에 값을 하나 넣습니다. api, refresh_token offline_access, chatbot_api, sfap_api 네 스코프를 &lt;b&gt;Selected OAuth Scopes&lt;/b&gt;로 옮깁니다. 화면에서는 Manage user data via APIs (api)처럼 설명과 함께 보입니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;04a-앱-스코프.png&quot; data-origin-width=&quot;1456&quot; data-origin-height=&quot;904&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b5c0ec/dJMcag1zwoU/gK3HzuEWpJinUbFkltRk50/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b5c0ec/dJMcag1zwoU/gK3HzuEWpJinUbFkltRk50/img.png&quot; data-alt=&quot;선택한 OAuth 스코프 네 개&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b5c0ec/dJMcag1zwoU/gK3HzuEWpJinUbFkltRk50/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb5c0ec%2FdJMcag1zwoU%2FgK3HzuEWpJinUbFkltRk50%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; alt=&quot;Selected OAuth Scopes 목록에 api와 chatbot_api를 비롯한 네 스코프가 들어 있다&quot; loading=&quot;lazy&quot; width=&quot;720&quot; height=&quot;447&quot; data-filename=&quot;04a-앱-스코프.png&quot; data-origin-width=&quot;1456&quot; data-origin-height=&quot;904&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;선택한 OAuth 스코프 네 개&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;font-size: 14px !important; line-height: 1.7 !important; color: var(--muted); margin-bottom: 16px !important;&quot; data-ke-size=&quot;size14&quot;&gt;Callback URL은 이 방식에서 쓰지 않지만 필수 칸이라, 이번에는 &lt;a href=&quot;https://localhost/callback을&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://localhost/callback을&lt;/a&gt; 넣었습니다.&lt;/p&gt;
&lt;p style=&quot;margin-bottom: 16px !important;&quot; data-ke-size=&quot;size16&quot;&gt;같은 화면 아래쪽의 체크박스 다섯 개를 다음처럼 맞추고 &lt;b&gt;Create&lt;/b&gt;를 누릅니다. Agent API 문서가 안내하는 설정이고, 해제하는 두 항목은 이 앱이 쓰지 않는 다른 흐름(Web Server, Refresh Token)의 설정입니다.&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;b&gt;Enable Client Credentials Flow&lt;/b&gt;를 체크합니다. 확인 창이 뜨면 &lt;b&gt;OK&lt;/b&gt;를 누릅니다&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Require secret for Web Server Flow&lt;/b&gt;가 체크되어 있으면 해제합니다&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Require secret for Refresh Token Flow&lt;/b&gt;가 체크되어 있으면 해제합니다&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Require Proof Key for Code Exchange (PKCE)&lt;/b&gt; 항목은 체크된 채 바꿀 수 없으면 그대로 둡니다&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Issue JSON Web Token (JWT)-based access tokens for named users&lt;/b&gt;를 체크합니다&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;04b-앱-체크박스.png&quot; data-origin-width=&quot;1336&quot; data-origin-height=&quot;1056&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/buHRQB/dJMcafBJ70h/4CRV6q9T6bkkhwqm7McwK0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/buHRQB/dJMcafBJ70h/4CRV6q9T6bkkhwqm7McwK0/img.png&quot; data-alt=&quot;Client Credentials와 보안 체크박스&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/buHRQB/dJMcafBJ70h/4CRV6q9T6bkkhwqm7McwK0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbuHRQB%2FdJMcafBJ70h%2F4CRV6q9T6bkkhwqm7McwK0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; alt=&quot;Flow Enablement와 Security 구역의 다섯 칸이 번호로 강조되어 있다&quot; loading=&quot;lazy&quot; width=&quot;660&quot; height=&quot;522&quot; data-filename=&quot;04b-앱-체크박스.png&quot; data-origin-width=&quot;1336&quot; data-origin-height=&quot;1056&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Client Credentials와 보안 체크박스&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;font-size: 18px !important; font-weight: bold; line-height: 1.5 !important; color: var(--ink); margin-bottom: 10px !important;&quot; data-ke-size=&quot;size18&quot;&gt;3. 연동 사용자를 Run As로 지정합니다&lt;/p&gt;
&lt;p style=&quot;margin-bottom: 16px !important;&quot; data-ke-size=&quot;size16&quot;&gt;만든 앱의 &lt;b&gt;Policies&lt;/b&gt; 탭에서 &lt;b&gt;Edit&lt;/b&gt;를 누릅니다. &lt;b&gt;OAuth Flows and External Client App Enhancements&lt;/b&gt;에서 &lt;b&gt;Enable Client Credentials Flow&lt;/b&gt;를 다시 체크합니다.&lt;/p&gt;
&lt;p style=&quot;margin-bottom: 16px !important;&quot; data-ke-size=&quot;size16&quot;&gt;문서도 앱 설정과 정책 두 곳에서 모두 켜도록 안내하고, Run As는 정책 쪽에만 있습니다.&lt;/p&gt;
&lt;p style=&quot;margin-bottom: 16px !important;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Run As (Username)&lt;/b&gt; 칸에 연동 사용자의 Username을 넣고 저장합니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;05-앱-정책.png&quot; data-origin-width=&quot;1496&quot; data-origin-height=&quot;444&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/wFGOQ/dJMcafBJ70w/oJORKGffgw2Qe9ErdKZp51/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/wFGOQ/dJMcafBJ70w/oJORKGffgw2Qe9ErdKZp51/img.png&quot; data-alt=&quot;Run As에 지정한 연동 사용자&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/wFGOQ/dJMcafBJ70w/oJORKGffgw2Qe9ErdKZp51/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FwFGOQ%2FdJMcafBJ70w%2FoJORKGffgw2Qe9ErdKZp51%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; alt=&quot;Policies의 Enable Client Credentials Flow 아래 Run As (Username) 칸에 연동 사용자 이름이 들어가 있다&quot; loading=&quot;lazy&quot; width=&quot;720&quot; height=&quot;214&quot; data-filename=&quot;05-앱-정책.png&quot; data-origin-width=&quot;1496&quot; data-origin-height=&quot;444&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Run As에 지정한 연동 사용자&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;font-size: 18px !important; font-weight: bold; line-height: 1.5 !important; color: var(--ink); margin-bottom: 10px !important;&quot; data-ke-size=&quot;size18&quot;&gt;4. Consumer Key와 Secret을 확인합니다&lt;/p&gt;
&lt;p style=&quot;margin-bottom: 16px !important;&quot; data-ke-size=&quot;size16&quot;&gt;앱의 &lt;b&gt;Settings&lt;/b&gt; 탭에서 &lt;b&gt;OAuth Settings&lt;/b&gt;를 펼치고 &lt;b&gt;Consumer Key and Secret&lt;/b&gt;을 누릅니다. 본인 확인 코드를 넣으면 새 탭에 Key와 Secret이 보입니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;06-키-시크릿-단추.png&quot; data-origin-width=&quot;1376&quot; data-origin-height=&quot;596&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/s4m3D/dJMcaggjzcr/aNQeSeQJ3542EKBhBJLj01/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/s4m3D/dJMcaggjzcr/aNQeSeQJ3542EKBhBJLj01/img.png&quot; data-alt=&quot;Key와 Secret을 여는 단추&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/s4m3D/dJMcaggjzcr/aNQeSeQJ3542EKBhBJLj01/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fs4m3D%2FdJMcaggjzcr%2FaNQeSeQJ3542EKBhBJLj01%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; alt=&quot;Settings 탭 OAuth Settings의 App Settings 아래 Consumer Key and Secret 단추가 강조되어 있다&quot; loading=&quot;lazy&quot; width=&quot;688&quot; height=&quot;298&quot; data-filename=&quot;06-키-시크릿-단추.png&quot; data-origin-width=&quot;1376&quot; data-origin-height=&quot;596&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Key와 Secret을 여는 단추&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;div class=&quot;say warn&quot;&gt;&lt;span class=&quot;badge i-alert&quot; aria-hidden=&quot;true&quot;&gt;&lt;/span&gt;
&lt;div&gt;&lt;b&gt;주의&lt;/b&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Consumer Secret은 브라우저 코드나 공개 저장소에 두지 않습니다. 이 값이 있으면 누구나 연동 사용자로 토큰을 받을 수 있습니다.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;hr data-ke-style=&quot;style5&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;API 호출&lt;/h2&gt;
&lt;p style=&quot;font-size: 20px !important; font-weight: bold; line-height: 1.6 !important; color: var(--ink); margin-bottom: 16px !important;&quot; data-ke-size=&quot;size20&quot;&gt;토큰은 My Domain 주소로 받고, 세션과 메시지는 api.salesforce.com으로 보냅니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;fig-01.png&quot; data-origin-width=&quot;960&quot; data-origin-height=&quot;1388&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/yqKHZ/dJMcag1zwpu/yJxKH2Q0zVWgwhcX9T7yyk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/yqKHZ/dJMcag1zwpu/yJxKH2Q0zVWgwhcX9T7yyk/img.png&quot; data-alt=&quot;호출 순서와 주소&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/yqKHZ/dJMcag1zwpu/yJxKH2Q0zVWgwhcX9T7yyk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FyqKHZ%2FdJMcag1zwpu%2FyJxKH2Q0zVWgwhcX9T7yyk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; alt=&quot;토큰은 My Domain, 세션 시작&amp;middot;메시지&amp;middot;종료는 api.salesforce.com으로 보내고 세션 본문의 endpoint에는 My Domain을 넣는 네 단계 호출 순서 그림&quot; loading=&quot;lazy&quot; width=&quot;480&quot; height=&quot;694&quot; data-filename=&quot;fig-01.png&quot; data-origin-width=&quot;960&quot; data-origin-height=&quot;1388&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;호출 순서와 주소&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;font-size: 18px !important; font-weight: bold; line-height: 1.5 !important; color: var(--ink); margin-bottom: 10px !important;&quot; data-ke-size=&quot;size18&quot;&gt;1. My Domain 주소를 확인합니다&lt;/p&gt;
&lt;p style=&quot;margin-bottom: 16px !important;&quot; data-ke-size=&quot;size16&quot;&gt;Setup의 &lt;b&gt;My Domain&lt;/b&gt;에서 &lt;b&gt;Current My Domain URL&lt;/b&gt;을 확인합니다. 이 주소는 my.salesforce.com으로 끝납니다. 브라우저 주소창에 보이는 lightning.force.com 주소가 아닙니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;07-마이도메인.png&quot; data-origin-width=&quot;1336&quot; data-origin-height=&quot;336&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bTrUkx/dJMcafIC6mR/cfh10TH0u0yZhNro9LUPT1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bTrUkx/dJMcafIC6mR/cfh10TH0u0yZhNro9LUPT1/img.png&quot; data-alt=&quot;Current My Domain URL&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bTrUkx/dJMcafIC6mR/cfh10TH0u0yZhNro9LUPT1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbTrUkx%2FdJMcafIC6mR%2Fcfh10TH0u0yZhNro9LUPT1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; alt=&quot;My Domain Details의 Current My Domain URL 행이 강조되어 있다&quot; loading=&quot;lazy&quot; width=&quot;660&quot; height=&quot;166&quot; data-filename=&quot;07-마이도메인.png&quot; data-origin-width=&quot;1336&quot; data-origin-height=&quot;336&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Current My Domain URL&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;font-size: 18px !important; font-weight: bold; line-height: 1.5 !important; color: var(--ink); margin-bottom: 10px !important;&quot; data-ke-size=&quot;size18&quot;&gt;2. 변수를 정하고 토큰을 받습니다&lt;/p&gt;
&lt;p style=&quot;margin-bottom: 16px !important;&quot; data-ke-size=&quot;size16&quot;&gt;명령마다 같은 값을 다시 쓰지 않도록, 아래 변수에 자기 org의 값을 넣어 둡니다.&lt;/p&gt;
&lt;pre id=&quot;code_2&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;DOMAIN=&amp;lt;이름&amp;gt;.my.salesforce.com
KEY=&amp;lt;Consumer Key&amp;gt;
SECRET=&amp;lt;Consumer Secret&amp;gt;
AGENT_ID=&amp;lt;0Xx로 시작하는 ID&amp;gt;
API=https://api.salesforce.com
API+=/einstein/ai-agent/v1
CT=&quot;Content-Type: application/json&quot;&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_3&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;URL=&quot;https://$DOMAIN&quot;
URL+=&quot;/services/oauth2/token&quot;
curl -s -X POST &quot;$URL&quot; \
  -d grant_type=client_credentials \
  -d client_id=&quot;$KEY&quot; \
  -d client_secret=&quot;$SECRET&quot;&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;margin-bottom: 16px !important;&quot; data-ke-size=&quot;size16&quot;&gt;응답의 access_token 값을 TOKEN에 넣습니다. scope에 sfap_api chatbot_api api가 보이면 앱 설정이 맞은 것입니다. 이번 응답의 expires_in은 7200초(약 2시간)였습니다.&lt;/p&gt;
&lt;pre id=&quot;code_4&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;TOKEN=&amp;lt;응답의 access_token&amp;gt;
AUTH=&quot;Authorization: Bearer $TOKEN&quot;&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;font-size: 18px !important; font-weight: bold; line-height: 1.5 !important; color: var(--ink); margin-bottom: 10px !important;&quot; data-ke-size=&quot;size18&quot;&gt;3. 세션을 엽니다&lt;/p&gt;
&lt;p style=&quot;margin-bottom: 16px !important;&quot; data-ke-size=&quot;size16&quot;&gt;세션을 여는 요청 본문은 아래 내용을 start.json으로 저장해 보냅니다. externalSessionKey에는 UUID 생성기로 만든 아무 값이나 넣고, endpoint에는 My Domain 주소를 넣습니다.&lt;/p&gt;
&lt;pre id=&quot;code_5&quot; class=&quot;json&quot; data-ke-language=&quot;json&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;{
  &quot;externalSessionKey&quot;: &quot;&amp;lt;UUID&amp;gt;&quot;,
  &quot;instanceConfig&quot;: {
    &quot;endpoint&quot;: &quot;https://&amp;lt;My Domain&amp;gt;&quot;
  },
  &quot;streamingCapabilities&quot;: {
    &quot;chunkTypes&quot;: [&quot;Text&quot;]
  },
  &quot;bypassUser&quot;: true
}&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_6&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;curl -s -X POST \
  &quot;$API/agents/$AGENT_ID/sessions&quot; \
  -H &quot;$AUTH&quot; -H &quot;$CT&quot; \
  --data-binary @start.json&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;margin-bottom: 16px !important;&quot; data-ke-size=&quot;size16&quot;&gt;응답의 sessionId를 SID에 넣습니다. 응답에는 에이전트의 첫인사 메시지도 함께 옵니다.&lt;/p&gt;
&lt;pre id=&quot;code_7&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;SID=&amp;lt;응답의 sessionId&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;font-size: 18px !important; font-weight: bold; line-height: 1.5 !important; color: var(--ink); margin-bottom: 10px !important;&quot; data-ke-size=&quot;size18&quot;&gt;4. 메시지를 보냅니다&lt;/p&gt;
&lt;p style=&quot;margin-bottom: 16px !important;&quot; data-ke-size=&quot;size16&quot;&gt;메시지 요청 본문은 아래 내용을 msg.json으로 저장합니다. sequenceId는 세션 안에서 메시지마다 1씩 올립니다.&lt;/p&gt;
&lt;pre id=&quot;code_8&quot; class=&quot;json&quot; data-ke-language=&quot;json&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;{
  &quot;message&quot;: {
    &quot;sequenceId&quot;: 1,
    &quot;type&quot;: &quot;Text&quot;,
    &quot;text&quot;: &quot;주말 반 수강 신청은 어떻게 하나요?&quot;
  }
}&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_9&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;curl -s -X POST \
  &quot;$API/sessions/$SID/messages&quot; \
  -H &quot;$AUTH&quot; -H &quot;$CT&quot; \
  -H &quot;Accept: application/json&quot; \
  --data-binary @msg.json&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;margin-bottom: 16px !important;&quot; data-ke-size=&quot;size16&quot;&gt;이번에는 약 9초 뒤 type이 Inform인 응답으로 한국어 답이 왔습니다. 답은 정보를 찾지 못했다며 상담원 연결을 권했습니다. 답의 내용은 에이전트에 연결한 지식과 액션에 따라 달라지므로, 여기서는 Inform 응답이 온 것으로 연결을 확인합니다.&lt;/p&gt;
&lt;div data-ke-type=&quot;moreLess&quot; data-text-more=&quot;메시지 응답 요약 보기&quot; data-text-less=&quot;닫기&quot;&gt;&lt;a class=&quot;btn-toggle-moreless&quot;&gt;더보기&lt;/a&gt;
&lt;div class=&quot;moreless-content&quot;&gt;
&lt;pre id=&quot;code_10&quot; class=&quot;json&quot; data-ke-language=&quot;json&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;{
  &quot;messages&quot;: [{
    &quot;type&quot;: &quot;Inform&quot;,
    &quot;isContentSafe&quot;: true,
    &quot;message&quot;: &quot;현재 주말 반 수강
      신청 방법에 대한 정보를
      불러올 수 없습니다. &amp;hellip;
      상담원 연결을
      원하시나요?&quot;,
    &quot;citedReferences&quot;: []
  }]
}&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p style=&quot;font-size: 14px !important; line-height: 1.7 !important; color: var(--muted); margin-bottom: 16px !important;&quot; data-ke-size=&quot;size14&quot;&gt;세션 시작 응답의 _links에서 messages는 이 동기 주소이고, 스트리밍 주소는 messagesStream에 따로 있습니다. 스트리밍을 쓰면 Accept를 text/event-stream으로 바꿔 /messages/stream에 보냅니다.&lt;/p&gt;
&lt;p style=&quot;font-size: 18px !important; font-weight: bold; line-height: 1.5 !important; color: var(--ink); margin-bottom: 10px !important;&quot; data-ke-size=&quot;size18&quot;&gt;5. 세션을 닫습니다&lt;/p&gt;
&lt;pre id=&quot;code_11&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;END=&quot;x-session-end-reason&quot;
curl -s -X DELETE \
  &quot;$API/sessions/$SID&quot; \
  -H &quot;$AUTH&quot; -H &quot;$END: UserRequest&quot;&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;margin-bottom: 16px !important;&quot; data-ke-size=&quot;size16&quot;&gt;응답의 type이 SessionEnded이고 reason이 ClientRequest면 세션이 닫힌 것입니다. 요청 헤더의 UserRequest와 응답의 ClientRequest가 달라도 정상입니다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style5&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;오류 대처&lt;/h2&gt;
&lt;p style=&quot;font-size: 20px !important; font-weight: bold; line-height: 1.6 !important; color: var(--ink); margin-bottom: 16px !important;&quot; data-ke-size=&quot;size20&quot;&gt;주소나 Secret을 잘못 넣으면 302, 401, 400이 오므로, 어느 요청에서 어떤 코드가 왔는지로 고칠 곳을 찾습니다.&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;응답&lt;/th&gt;
&lt;th&gt;원인&lt;/th&gt;
&lt;th&gt;고칠 곳&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;토큰 요청의 302&lt;/td&gt;
&lt;td&gt;토큰 주소가 브라우저 주소&lt;/td&gt;
&lt;td&gt;My Domain 주소로 보냄&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;토큰 요청의 400&lt;/td&gt;
&lt;td&gt;Key나 Secret이 틀림&lt;/td&gt;
&lt;td&gt;앱의 Key와 Secret 다시 복사&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;세션 시작의 401&lt;/td&gt;
&lt;td&gt;endpoint가 브라우저 주소&lt;/td&gt;
&lt;td&gt;endpoint를 My Domain으로&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;메시지의 400&lt;/td&gt;
&lt;td&gt;한국어를 &lt;code&gt;--data&lt;/code&gt;로 직접 넣음&lt;/td&gt;
&lt;td&gt;UTF-8 파일과 &lt;code&gt;--data-binary&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;세션의 423&lt;/td&gt;
&lt;td&gt;요청을 동시에 둘 보냄&lt;/td&gt;
&lt;td&gt;응답을 받은 뒤 다음 요청&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;토큰 요청의 400:&lt;/b&gt; Secret이 틀리면 invalid_client(&quot;invalid client credentials&quot;)가 옵니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;302:&lt;/b&gt; 토큰 요청을 lightning.force.com 주소로 보내면 오류 본문 없이 다른 주소로 옮기라는 302만 옵니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;401:&lt;/b&gt; 세션 시작 요청의 endpoint에 브라우저 주소를 넣으면 INVALID_SESSION_ID가 옵니다. 문서는 이 경우를 500 EngineConfigLookupException으로 안내하지만 이번에는 401이었습니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;메시지의 400:&lt;/b&gt; Windows Git Bash에서 한국어 본문을 &lt;code&gt;--data '&amp;hellip;'&lt;/code&gt;로 넣으면 &quot;Invalid UTF-8 middle byte&quot;가 옵니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;423과 500:&lt;/b&gt; 문서에 따르면 한 세션에 요청이 겹치면 423이 오고, 응답이 120초를 넘기거나 Agent ID가 틀리면 500이 옵니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style5&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;권한 범위&lt;/h2&gt;
&lt;p style=&quot;font-size: 20px !important; font-weight: bold; line-height: 1.6 !important; color: var(--ink); margin-bottom: 16px !important;&quot; data-ke-size=&quot;size20&quot;&gt;bypassUser 값에 따라 에이전트 사용자나 연동 사용자의 권한으로 동작하므로, 외부에 열기 전에 그 사용자의 권한을 확인합니다.&lt;/p&gt;
&lt;p style=&quot;margin-bottom: 16px !important;&quot; data-ke-size=&quot;size16&quot;&gt;Agent API 문서에 따르면 bypassUser가 true면 에이전트 사용자로, false면 토큰을 받은 연동 사용자로 동작합니다. 이번에는 두 값 모두 세션이 열렸고, 같은 질문에 한국어로 답했습니다. 에이전트에 앱을 따로 연결하는 단계는 없었습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;fig-02.png&quot; data-origin-width=&quot;960&quot; data-origin-height=&quot;928&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bwdj3D/dJMcafIC6nb/tM0I0upVH0q44JjoOEsSy0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bwdj3D/dJMcafIC6nb/tM0I0upVH0q44JjoOEsSy0/img.png&quot; data-alt=&quot;bypassUser가 정하는 실행 사용자&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bwdj3D/dJMcafIC6nb/tM0I0upVH0q44JjoOEsSy0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbwdj3D%2FdJMcafIC6nb%2FtM0I0upVH0q44JjoOEsSy0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; alt=&quot;Run As 연동 사용자는 토큰을 받고, bypassUser가 true면 에이전트 사용자가, false면 Run As 사용자가 응답과 데이터 접근을 맡는다는 그림&quot; loading=&quot;lazy&quot; width=&quot;480&quot; height=&quot;464&quot; data-filename=&quot;fig-02.png&quot; data-origin-width=&quot;960&quot; data-origin-height=&quot;928&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;bypassUser가 정하는 실행 사용자&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;margin-bottom: 16px !important;&quot; data-ke-size=&quot;size16&quot;&gt;에이전트 사용자는 빌더의 &lt;b&gt;Agent Access&lt;/b&gt;에서 &lt;b&gt;Agent's User Record&lt;/b&gt;로 확인합니다. 에이전트에 레코드 조회 액션을 추가하면, 외부 방문자도 이 사용자가 볼 수 있는 데이터를 답으로 받을 수 있습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;10-에이전트-사용자.png&quot; data-origin-width=&quot;2104&quot; data-origin-height=&quot;816&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/pHu9K/dJMcaikYL8O/5YuIq6JZaYM2XzqEnJnos0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/pHu9K/dJMcaikYL8O/5YuIq6JZaYM2XzqEnJnos0/img.png&quot; data-alt=&quot;에이전트 사용자 레코드&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/pHu9K/dJMcaikYL8O/5YuIq6JZaYM2XzqEnJnos0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FpHu9K%2FdJMcaikYL8O%2F5YuIq6JZaYM2XzqEnJnos0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; alt=&quot;Agent's User Record 칸에 EinsteinServiceAgent User가 지정되어 있다&quot; loading=&quot;lazy&quot; width=&quot;720&quot; height=&quot;279&quot; data-filename=&quot;10-에이전트-사용자.png&quot; data-origin-width=&quot;2104&quot; data-origin-height=&quot;816&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;에이전트 사용자 레코드&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;div class=&quot;say warn&quot;&gt;&lt;span class=&quot;badge i-alert&quot; aria-hidden=&quot;true&quot;&gt;&lt;/span&gt;
&lt;div&gt;&lt;b&gt;주의&lt;/b&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;홈페이지 위젯처럼 누구나 호출하는 곳에 열 때는, 쓰는 bypassUser 값에 해당하는 사용자(true면 에이전트 사용자, false면 연동 사용자)의 권한 집합을 필요한 오브젝트만 읽도록 줄여 둡니다.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p style=&quot;font-size: 14px !important; line-height: 1.7 !important; color: var(--muted); margin-bottom: 16px !important;&quot; data-ke-size=&quot;size14&quot;&gt;위젯처럼 브라우저에서 부르는 구성은 Secret을 서버 함수에 두어야 하므로 별도 글에서 다룰 예정입니다.&lt;/p&gt;
&lt;div data-ke-type=&quot;moreLess&quot; data-text-more=&quot;그림으로 쉽게 보는 요약 보기&quot; data-text-less=&quot;닫기&quot;&gt;&lt;a class=&quot;btn-toggle-moreless&quot;&gt;더보기&lt;/a&gt;
&lt;div class=&quot;moreless-content&quot;&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;eli5-01.png&quot; data-origin-width=&quot;1440&quot; data-origin-height=&quot;4104&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ue0AC/dJMcag1zwqw/DoS4FwaB5LgaWtprOwMlxk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ue0AC/dJMcag1zwqw/DoS4FwaB5LgaWtprOwMlxk/img.png&quot; data-alt=&quot;그림으로 쉽게 보는 요약&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ue0AC/dJMcag1zwqw/DoS4FwaB5LgaWtprOwMlxk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fue0AC%2FdJMcag1zwqw%2FDoS4FwaB5LgaWtprOwMlxk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; alt=&quot;밖의 프로그램이 에이전트와 메시지를 주고받는 기능, 에이전트를 만들어 활성화하고 Agent ID를 조회하는 순서, External Client App과 연동 사용자 만들기, 토큰&amp;middot;세션 열기&amp;middot;메시지&amp;middot;세션 닫기 네 단계, 막혔을 때 보는 302&amp;middot;400&amp;middot;401&amp;middot;423 응답 코드, bypassUser 값에 따라 달라지는 사용자 권한을 차례로 그린 요약 그림&quot; loading=&quot;lazy&quot; width=&quot;720&quot; height=&quot;2052&quot; data-filename=&quot;eli5-01.png&quot; data-origin-width=&quot;1440&quot; data-origin-height=&quot;4104&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;그림으로 쉽게 보는 요약&lt;/figcaption&gt;
&lt;/figure&gt;

&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p style=&quot;margin-bottom: 16px !important;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;참고 문서&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;a href=&quot;https://developer.salesforce.com/docs/ai/agentforce/guide/agent-api-get-started.html&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Get Started with Agent API&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://developer.salesforce.com/docs/ai/agentforce/guide/agent-api-examples.html&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Agent API Examples&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://developer.salesforce.com/docs/ai/agentforce/guide/agent-api-agent-id.html&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Get the Agent ID&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://developer.salesforce.com/docs/ai/agentforce/guide/agent-api-lifecycle.html&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Agent API Session Lifecycle&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://developer.salesforce.com/docs/ai/agentforce/guide/agent-api-considerations.html&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Agent API Considerations&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://developer.salesforce.com/docs/ai/agentforce/guide/agent-api-troubleshooting.html&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Agent API Troubleshooting&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>Salesforce/Agentforce</category>
      <category>Agent API</category>
      <category>Agentforce</category>
      <category>External Client App</category>
      <author>Luka.dev</author>
      <guid isPermaLink="true">https://jt98.tistory.com/40</guid>
      <comments>https://jt98.tistory.com/40#entry40comment</comments>
      <pubDate>Mon, 19 Oct 2026 13:49:22 +0900</pubDate>
    </item>
    <item>
      <title>Marketing Cloud Next | Exit Event로 링크 클릭한 수신자의 후속 이메일 발송 중단</title>
      <link>https://jt98.tistory.com/39</link>
      <description>&lt;div class=&quot;greeting&quot;&gt;
&lt;p style=&quot;line-height: 1.8 !important; margin: 0 0 0px !important;&quot; data-ke-size=&quot;size16&quot;&gt;안녕하세요, 루카입니다. 오늘은 연속 메일에서 첫 메일의 링크를 누른 사람에게는 두 번째 메일이 가지 않게 해 보겠습니다.&lt;/p&gt;
&lt;/div&gt;
&lt;hr data-ke-style=&quot;style5&quot; /&gt;
&lt;div class=&quot;lead-box&quot; style=&quot;background: color-mix(in srgb, var(--brand) 7%, transparent); border-top: 4px solid var(--brand); border-radius: 10px; padding: 18px 24px 16px; margin: 8px 0 28px;&quot;&gt;
&lt;p style=&quot;font-size: 20px !important; font-weight: bold; line-height: 1.55 !important; color: var(--ink); margin: 0 0 8px !important;&quot; data-ke-size=&quot;size16&quot;&gt;Exit Event는 받는 사람이 링크를 누르는 등 정한 행동을 하면, 그 사람을 Flow에서 내보내는 이탈 규칙의 한 종류입니다.&lt;/p&gt;
&lt;p style=&quot;font-size: 16px !important; line-height: 1.7 !important; margin: 0 0 4px !important;&quot; data-ke-size=&quot;size16&quot;&gt;이탈 규칙이 없으면 Flow에 들어온 사람은 마지막 메일까지 받게 되므로, 이미 신청 단추를 누른 사람에게도 신청을 권하는 메일이 나갑니다.&lt;/p&gt;
&lt;/div&gt;
&lt;p style=&quot;margin-bottom: 16px !important;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;준비할 것&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;이메일:&lt;/b&gt; 링크가 든 첫 메일과 두 번째 메일이 게시되어 있어야 합니다. 만드는 법은 &lt;a href=&quot;https://jt98.tistory.com/17&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;008 Email Builder&lt;/a&gt;에서 다뤘습니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;릴리스:&lt;/b&gt; 행동(이벤트)으로 내보내는 이탈 규칙은 Summer '26 릴리스에서 추가되었습니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;받는 사람:&lt;/b&gt; 두 사람을 담은 Actionable List(연락처를 골라 담아 두는 목록)와 두 사람의 수신 동의가 필요합니다. 목록은 &lt;a href=&quot;https://jt98.tistory.com/21&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;012 캠페인 만들기&lt;/a&gt;, 동의는 &lt;a href=&quot;https://jt98.tistory.com/16&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;007 Consent Imports&lt;/a&gt;를 참고합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p style=&quot;margin-bottom: 16px !important;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;완료 확인:&lt;/b&gt; 발송 기록에서 링크를 누른 사람은 첫 메일 SENT 한 행, 누르지 않은 사람은 SENT 두 행이면 끝입니다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;연속 메일 준비&lt;/h2&gt;
&lt;p style=&quot;font-size: 20px !important; font-weight: bold; line-height: 1.6 !important; color: var(--ink); margin-bottom: 16px !important;&quot; data-ke-size=&quot;size20&quot;&gt;목록에 두 사람을 담고, List로 시작하는 Flow에 메일, 대기, 메일을 넣습니다.&lt;/p&gt;
&lt;p style=&quot;font-size: 18px !important; font-weight: bold; line-height: 1.5 !important; color: var(--ink); margin-bottom: 10px !important;&quot; data-ke-size=&quot;size18&quot;&gt;1. 목록에 두 사람을 담습니다&lt;/p&gt;
&lt;p style=&quot;margin-bottom: 16px !important;&quot; data-ke-size=&quot;size16&quot;&gt;한 사람은 링크를 누르고 다른 사람은 누르지 않아 결과를 비교하므로, 받는 사람이 두 명 필요합니다. 이번에는 &lt;b&gt;LUKA_032_수강생목록&lt;/b&gt;에 수강생01과 수강생02를 담았습니다.&lt;/p&gt;
&lt;p style=&quot;font-size: 18px !important; font-weight: bold; line-height: 1.5 !important; color: var(--ink); margin-bottom: 10px !important;&quot; data-ke-size=&quot;size18&quot;&gt;2. 메일, 대기, 메일을 넣습니다&lt;/p&gt;
&lt;p style=&quot;margin-bottom: 16px !important;&quot; data-ke-size=&quot;size16&quot;&gt;캠페인에서 &lt;b&gt;Build Your Own&lt;/b&gt;의 &lt;b&gt;List&lt;/b&gt;로 Flow를 만들고, 첫 메일(체험 수업 안내), &lt;b&gt;Wait&lt;/b&gt;, 두 번째 메일(신청 마감 알림)을 차례로 넣습니다. 순서는 &lt;a href=&quot;https://jt98.tistory.com/32&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;022&lt;/a&gt;와 같습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;01-연속-메일-흐름.png&quot; data-origin-width=&quot;2936&quot; data-origin-height=&quot;1516&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/uHG3j/dJMcabTCjET/8dPnxRc9gdKc9RRUUgOlLK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/uHG3j/dJMcabTCjET/8dPnxRc9gdKc9RRUUgOlLK/img.png&quot; data-alt=&quot;메일, 대기, 메일 순서의 Flow&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/uHG3j/dJMcabTCjET/8dPnxRc9gdKc9RRUUgOlLK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FuHG3j%2FdJMcabTCjET%2F8dPnxRc9gdKc9RRUUgOlLK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; alt=&quot;캠페인 화면의 Flow 요약에 Start의 LUKA_032_수강생목록, Send Email Message, Wait for 1 hour, Send Email Message가 차례로 있고 Wait 구역이 강조되어 있다&quot; loading=&quot;lazy&quot; width=&quot;720&quot; height=&quot;372&quot; data-filename=&quot;01-연속-메일-흐름.png&quot; data-origin-width=&quot;2936&quot; data-origin-height=&quot;1516&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;메일, 대기, 메일 순서의 Flow&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;font-size: 14px !important; line-height: 1.7 !important; color: var(--muted); margin-bottom: 16px !important;&quot; data-ke-size=&quot;size14&quot;&gt;이번에는 결과를 빨리 보려고 대기를 1시간으로 두고, &lt;b&gt;Resume at a specific time of day&lt;/b&gt;는 체크하지 않았습니다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style5&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;이탈 규칙 넣기&lt;/h2&gt;
&lt;p style=&quot;font-size: 20px !important; font-weight: bold; line-height: 1.6 !important; color: var(--ink); margin-bottom: 16px !important;&quot; data-ke-size=&quot;size20&quot;&gt;Flow Builder를 열어 시작 요소에 &quot;첫 메일의 링크를 누르면 내보낸다&quot;는 이탈 규칙을 넣습니다.&lt;/p&gt;
&lt;p style=&quot;font-size: 18px !important; font-weight: bold; line-height: 1.5 !important; color: var(--ink); margin-bottom: 10px !important;&quot; data-ke-size=&quot;size18&quot;&gt;1. Flow Builder에서 시작 요소를 엽니다&lt;/p&gt;
&lt;p style=&quot;margin-bottom: 16px !important;&quot; data-ke-size=&quot;size16&quot;&gt;이탈 규칙(Exit Rules)은 캠페인 화면의 Flow 요약에는 없습니다. 요약 오른쪽 위의 &lt;b&gt;Open Flow&lt;/b&gt;를 눌러 Flow Builder를 열면, 시작 요소에 &lt;b&gt;Exit Rules: 0&lt;/b&gt;과 &lt;b&gt;Edit&lt;/b&gt;가 보입니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;02-이탈-규칙-여는-곳.png&quot; data-origin-width=&quot;1416&quot; data-origin-height=&quot;896&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/s8qFY/dJMcacyeNay/NMNdKLDHvvlF4CqmMTXtxk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/s8qFY/dJMcacyeNay/NMNdKLDHvvlF4CqmMTXtxk/img.png&quot; data-alt=&quot;시작 요소의 Exit Rules&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/s8qFY/dJMcacyeNay/NMNdKLDHvvlF4CqmMTXtxk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fs8qFY%2FdJMcacyeNay%2FNMNdKLDHvvlF4CqmMTXtxk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; alt=&quot;Flow Builder의 List Flow 시작 요소에 List Name LUKA_032_수강생목록과 Exit Rules 0이 있고 Exit Rules 옆 Edit가 강조되어 있다&quot; loading=&quot;lazy&quot; width=&quot;708&quot; height=&quot;448&quot; data-filename=&quot;02-이탈-규칙-여는-곳.png&quot; data-origin-width=&quot;1416&quot; data-origin-height=&quot;896&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;시작 요소의 Exit Rules&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;font-size: 18px !important; font-weight: bold; line-height: 1.5 !important; color: var(--ink); margin-bottom: 10px !important;&quot; data-ke-size=&quot;size18&quot;&gt;2. Add Exit Event를 누릅니다&lt;/p&gt;
&lt;p style=&quot;margin-bottom: 16px !important;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Edit&lt;/b&gt;를 누르면 오른쪽에 &lt;b&gt;Exit Rules&lt;/b&gt; 창이 열립니다. 창에는 행동으로 내보내는 &lt;b&gt;Exit Events&lt;/b&gt;와 값으로 내보내는 &lt;b&gt;Exit Conditions&lt;/b&gt; 두 구역이 있습니다. &lt;b&gt;Exit Events&lt;/b&gt; 구역의 &lt;b&gt;Add Exit Event&lt;/b&gt;를 누릅니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;03-이탈-규칙-창.png&quot; data-origin-width=&quot;1976&quot; data-origin-height=&quot;816&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/sNnTD/dJMcacyeNaB/hlQ4n7yKR6nuhT0iNdrdYK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/sNnTD/dJMcacyeNaB/hlQ4n7yKR6nuhT0iNdrdYK/img.png&quot; data-alt=&quot;Exit Events와 Exit Conditions&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/sNnTD/dJMcacyeNaB/hlQ4n7yKR6nuhT0iNdrdYK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FsNnTD%2FdJMcacyeNaB%2FhlQ4n7yKR6nuhT0iNdrdYK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; alt=&quot;Exit Rules 창에 Exit Events 구역의 Add Exit Event와 Exit Conditions 구역의 Add Exit Condition이 있고 Add Exit Event가 강조되어 있다&quot; loading=&quot;lazy&quot; width=&quot;720&quot; height=&quot;297&quot; data-filename=&quot;03-이탈-규칙-창.png&quot; data-origin-width=&quot;1976&quot; data-origin-height=&quot;816&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Exit Events와 Exit Conditions&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;font-size: 14px !important; line-height: 1.7 !important; color: var(--muted); margin-bottom: 16px !important;&quot; data-ke-size=&quot;size14&quot;&gt;도움말은 이탈 규칙을 데이터 값으로 거르는 조건으로만 설명합니다. 이벤트로 내보내는 방법은 Summer '26 릴리스 노트에 있고, 그 글은 지원하는 Flow에 List로 시작하는 Flow를 적지 않았지만 이번 Flow에서도 넣을 수 있었습니다.&lt;/p&gt;
&lt;p style=&quot;font-size: 18px !important; font-weight: bold; line-height: 1.5 !important; color: var(--ink); margin-bottom: 10px !important;&quot; data-ke-size=&quot;size18&quot;&gt;3. Email Link Click을 고릅니다&lt;/p&gt;
&lt;p style=&quot;margin-bottom: 16px !important;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Event&lt;/b&gt; 칸에 Email을 입력하고, &lt;b&gt;Standard Automation Events&lt;/b&gt; 목록에서 &lt;b&gt;Email Link Click&lt;/b&gt;을 고릅니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;04-이벤트-목록.png&quot; data-origin-width=&quot;1976&quot; data-origin-height=&quot;1536&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cROTIk/dJMcacyeNaG/At0KW7mhYelJvhHebBVa80/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cROTIk/dJMcacyeNaG/At0KW7mhYelJvhHebBVa80/img.png&quot; data-alt=&quot;Event 목록의 Email Link Click&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cROTIk/dJMcacyeNaG/At0KW7mhYelJvhHebBVa80/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcROTIk%2FdJMcacyeNaG%2FAt0KW7mhYelJvhHebBVa80%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; alt=&quot;Exit Event 1의 Event 칸에 Email을 입력하자 Standard Automation Events 목록이 열리고 Email Link Click이 강조되어 있다&quot; loading=&quot;lazy&quot; width=&quot;720&quot; height=&quot;560&quot; data-filename=&quot;04-이벤트-목록.png&quot; data-origin-width=&quot;1976&quot; data-origin-height=&quot;1536&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Event 목록의 Email Link Click&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;font-size: 18px !important; font-weight: bold; line-height: 1.5 !important; color: var(--ink); margin-bottom: 10px !important;&quot; data-ke-size=&quot;size18&quot;&gt;4. 첫 메일을 지정하고 저장합니다&lt;/p&gt;
&lt;p style=&quot;margin-bottom: 16px !important;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Email Message&lt;/b&gt; 칸과 &lt;b&gt;Link&lt;/b&gt; 칸이 더해집니다. &lt;b&gt;Email Message&lt;/b&gt;에서 첫 메일을, &lt;b&gt;Link&lt;/b&gt;에서 &lt;b&gt;Any Link&lt;/b&gt;를 고르고, &lt;b&gt;Label&lt;/b&gt;에 규칙 이름을 넣습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;05-이벤트-칸-채움.png&quot; data-origin-width=&quot;1344&quot; data-origin-height=&quot;1256&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bln6X4/dJMcacyeNaK/Z7Fzax7gitqBIaB6lOfu6k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bln6X4/dJMcacyeNaK/Z7Fzax7gitqBIaB6lOfu6k/img.png&quot; data-alt=&quot;첫 메일과 Any Link&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bln6X4/dJMcacyeNaK/Z7Fzax7gitqBIaB6lOfu6k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbln6X4%2FdJMcacyeNaK%2FZ7Fzax7gitqBIaB6lOfu6k%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; alt=&quot;Apply Link Click 규칙의 Event가 Email Link Click이고 Email Message에 LUKA_032_체험안내, Link에 Any Link가 들어간 칸이 강조되어 있다&quot; loading=&quot;lazy&quot; width=&quot;672&quot; height=&quot;628&quot; data-filename=&quot;05-이벤트-칸-채움.png&quot; data-origin-width=&quot;1344&quot; data-origin-height=&quot;1256&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;첫 메일과 Any Link&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;div class=&quot;say warn&quot;&gt;&lt;span class=&quot;badge i-alert&quot; aria-hidden=&quot;true&quot;&gt;&lt;/span&gt;
&lt;div&gt;&lt;b&gt;주의&lt;/b&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Link 목록에는 Any Link 하나만 있었습니다. 그래서 신청 단추가 아닌 링크(꼬리말의 수신 거부 링크 등)를 눌러도 빠지는 것으로 보입니다. 링크 클릭은 실제 신청과 같지 않으므로, 신청 여부가 레코드 값으로 남는다면 &lt;b&gt;Exit Conditions&lt;/b&gt;로 거르는 방법을 함께 검토합니다.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p style=&quot;margin-bottom: 16px !important;&quot; data-ke-size=&quot;size16&quot;&gt;Flow를 저장하면 활성화할 수 없다는 오류 창이 열리지만, 규칙은 저장됩니다. 오류 문구는 &quot;Frequency: You set the flow trigger type to List, so you must also set the frequency&quot;입니다.&lt;/p&gt;
&lt;p style=&quot;margin-bottom: 16px !important;&quot; data-ke-size=&quot;size16&quot;&gt;이 오류는 Flow의 발송 일정이 비어 있어서 생깁니다. 캠페인 화면의 &lt;b&gt;Send Now&lt;/b&gt;로 활성화하면 일정이 Once로 정해집니다.&lt;/p&gt;
&lt;p style=&quot;margin-bottom: 16px !important;&quot; data-ke-size=&quot;size16&quot;&gt;저장한 뒤 시작 요소를 보면 &lt;b&gt;Exit Rules: 1&lt;/b&gt;로 바뀌어 있습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;05b-저장-뒤-시작-카드.png&quot; data-origin-width=&quot;1416&quot; data-origin-height=&quot;896&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bEf1jB/dJMcajxsghf/3Ae2s8dxdtXEfpHE1gCD8k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bEf1jB/dJMcajxsghf/3Ae2s8dxdtXEfpHE1gCD8k/img.png&quot; data-alt=&quot;규칙이 하나 들어간 시작 요소&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bEf1jB/dJMcajxsghf/3Ae2s8dxdtXEfpHE1gCD8k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbEf1jB%2FdJMcajxsghf%2F3Ae2s8dxdtXEfpHE1gCD8k%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; alt=&quot;시작 요소의 Exit Rules가 1로 바뀐 부분이 강조되어 있다&quot; loading=&quot;lazy&quot; width=&quot;708&quot; height=&quot;448&quot; data-filename=&quot;05b-저장-뒤-시작-카드.png&quot; data-origin-width=&quot;1416&quot; data-origin-height=&quot;896&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;규칙이 하나 들어간 시작 요소&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr data-ke-style=&quot;style5&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;발송과 클릭&lt;/h2&gt;
&lt;p style=&quot;font-size: 20px !important; font-weight: bold; line-height: 1.6 !important; color: var(--ink); margin-bottom: 16px !important;&quot; data-ke-size=&quot;size20&quot;&gt;Send Now로 활성화한 뒤, 대기가 끝나기 전에 한 사람만 첫 메일의 링크를 누릅니다.&lt;/p&gt;
&lt;div class=&quot;say warn&quot;&gt;&lt;span class=&quot;badge i-alert&quot; aria-hidden=&quot;true&quot;&gt;&lt;/span&gt;
&lt;div&gt;&lt;b&gt;주의&lt;/b&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이탈 규칙은 활성화하기 전에 넣습니다. 이미 활성화한 Flow는 Pause와 새 버전으로 고쳐야 하며, 절차는 도움말 Pause and Edit a Marketing Flow에 있습니다.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p style=&quot;font-size: 18px !important; font-weight: bold; line-height: 1.5 !important; color: var(--ink); margin-bottom: 10px !important;&quot; data-ke-size=&quot;size18&quot;&gt;1. Send Now로 활성화합니다&lt;/p&gt;
&lt;p style=&quot;margin-bottom: 16px !important;&quot; data-ke-size=&quot;size16&quot;&gt;캠페인 화면으로 돌아가 &lt;b&gt;Schedule&lt;/b&gt; 옆 ▼에서 &lt;b&gt;Send Now&lt;/b&gt;를 고르고, &lt;b&gt;Send now?&lt;/b&gt; 창에서 &lt;b&gt;Activate&lt;/b&gt;를 누릅니다. 순서는 &lt;a href=&quot;https://jt98.tistory.com/32&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;022&lt;/a&gt;와 같습니다.&lt;/p&gt;
&lt;p style=&quot;margin-bottom: 16px !important;&quot; data-ke-size=&quot;size16&quot;&gt;활성화한 뒤 Flow Builder에서 Exit Rules를 다시 열면 단추가 &lt;b&gt;View&lt;/b&gt;로 바뀌고, 읽기 전용 안내가 보입니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;09-활성화-뒤-읽기-전용.png&quot; data-origin-width=&quot;1356&quot; data-origin-height=&quot;1336&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bdKm79/dJMcajxsghz/rzct9HdZ5WyHmtAMZ7Lqqk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bdKm79/dJMcajxsghz/rzct9HdZ5WyHmtAMZ7Lqqk/img.png&quot; data-alt=&quot;활성화한 뒤의 Exit Rules&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bdKm79/dJMcajxsghz/rzct9HdZ5WyHmtAMZ7Lqqk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbdKm79%2FdJMcajxsghz%2Frzct9HdZ5WyHmtAMZ7Lqqk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; alt=&quot;활성화한 Flow의 Exit Rules 창 맨 위에 Flows that have already run or that are scheduled to run are read-only. To make changes, edit as a new version. 안내가 강조되어 있다&quot; loading=&quot;lazy&quot; width=&quot;678&quot; height=&quot;668&quot; data-filename=&quot;09-활성화-뒤-읽기-전용.png&quot; data-origin-width=&quot;1356&quot; data-origin-height=&quot;1336&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;활성화한 뒤의 Exit Rules&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;font-size: 18px !important; font-weight: bold; line-height: 1.5 !important; color: var(--ink); margin-bottom: 10px !important;&quot; data-ke-size=&quot;size18&quot;&gt;2. 한 사람만 링크를 누릅니다&lt;/p&gt;
&lt;p style=&quot;margin-bottom: 16px !important;&quot; data-ke-size=&quot;size16&quot;&gt;수강생01이 받은 첫 메일에서 &lt;b&gt;신청하기&lt;/b&gt; 단추를 누릅니다. 수강생02의 메일은 열지 않습니다.&lt;/p&gt;
&lt;p style=&quot;margin-bottom: 16px !important;&quot; data-ke-size=&quot;size16&quot;&gt;누른 기록은 Data Cloud의 Query Editor에서 Email Engagement DMO(발송&amp;middot;열람&amp;middot;클릭 기록이 쌓이는 데이터 모델)를 조회해 확인합니다. 수강생01의 CLICK 행이 더해졌습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;06-클릭-기록.png&quot; data-origin-width=&quot;2116&quot; data-origin-height=&quot;1340&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/AOGRg/dJMcacyeNaX/7fqIzkhnNVCpMLdNSd92H1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/AOGRg/dJMcacyeNaX/7fqIzkhnNVCpMLdNSd92H1/img.png&quot; data-alt=&quot;수강생01의 클릭 기록&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/AOGRg/dJMcacyeNaX/7fqIzkhnNVCpMLdNSd92H1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FAOGRg%2FdJMcacyeNaX%2F7fqIzkhnNVCpMLdNSd92H1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; alt=&quot;Query Editor 결과에 두 사람의 SEND_STATUS SENT와 MESSAGE_PROCESSING_TIME 행이 있고 맨 아래 수강생01의 CLICK 행이 강조되어 있다&quot; loading=&quot;lazy&quot; width=&quot;720&quot; height=&quot;456&quot; data-filename=&quot;06-클릭-기록.png&quot; data-origin-width=&quot;2116&quot; data-origin-height=&quot;1340&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;수강생01의 클릭 기록&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;font-size: 14px !important; line-height: 1.7 !important; color: var(--muted); margin-bottom: 16px !important;&quot; data-ke-size=&quot;size14&quot;&gt;이번 시험에서 CLICK 행은 누르고 약 3분 반 뒤부터 조회되었습니다. 조회 쿼리는 아래 결과 확인 절의 접기에 있습니다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style5&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;결과 확인&lt;/h2&gt;
&lt;p style=&quot;font-size: 20px !important; font-weight: bold; line-height: 1.6 !important; color: var(--ink); margin-bottom: 16px !important;&quot; data-ke-size=&quot;size20&quot;&gt;이번 시험에서 링크를 누른 사람은 Flow에서 빠져 두 번째 메일을 받지 않았고, 누르지 않은 사람만 받았습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;fig-01.png&quot; data-origin-width=&quot;960&quot; data-origin-height=&quot;970&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bnTG3s/dJMcacyeNba/RS8i6AKgKw0RPVuafkmMLK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bnTG3s/dJMcacyeNba/RS8i6AKgKw0RPVuafkmMLK/img.png&quot; data-alt=&quot;누른 사람과 누르지 않은 사람&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bnTG3s/dJMcacyeNba/RS8i6AKgKw0RPVuafkmMLK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbnTG3s%2FdJMcacyeNba%2FRS8i6AKgKw0RPVuafkmMLK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; alt=&quot;수강생01은 첫 메일을 받고 대기 중에 링크를 눌러 두 번째 메일을 받지 않고 빠졌으며, 수강생02는 누르지 않아 두 번째 메일을 받았다는 비교 그림&quot; loading=&quot;lazy&quot; width=&quot;480&quot; height=&quot;485&quot; data-filename=&quot;fig-01.png&quot; data-origin-width=&quot;960&quot; data-origin-height=&quot;970&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;누른 사람과 누르지 않은 사람&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;font-size: 18px !important; font-weight: bold; line-height: 1.5 !important; color: var(--ink); margin-bottom: 10px !important;&quot; data-ke-size=&quot;size18&quot;&gt;1. Flow Builder에서 요소별 실행 수를 봅니다&lt;/p&gt;
&lt;p style=&quot;margin-bottom: 16px !important;&quot; data-ke-size=&quot;size16&quot;&gt;대기가 끝난 뒤 Flow Builder를 열면 요소마다 &lt;b&gt;Total Runs&lt;/b&gt;가 보입니다. 첫 메일과 대기는 2, 두 번째 메일은 1입니다. 대기 요소의 이름은 기본값 Wait 1 Day로 남아 있지만, 실제 대기는 1시간입니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;07-요소별-실행-수.png&quot; data-origin-width=&quot;1416&quot; data-origin-height=&quot;1456&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bvTx0C/dJMcabTCjHC/sjltQrKKKpuMeE3zCIyqD0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bvTx0C/dJMcabTCjHC/sjltQrKKKpuMeE3zCIyqD0/img.png&quot; data-alt=&quot;① 첫 메일 2 ② 대기 2 ③ 두 번째 메일 1&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bvTx0C/dJMcabTCjHC/sjltQrKKKpuMeE3zCIyqD0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbvTx0C%2FdJMcabTCjHC%2FsjltQrKKKpuMeE3zCIyqD0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; alt=&quot;Flow Builder 캔버스에서 첫 Send Email Message Action의 Total Runs 2, Wait 1 Day의 Total Runs 2, 두 번째 Send Email Message Action의 Total Runs 1이 번호와 함께 강조되어 있다&quot; loading=&quot;lazy&quot; width=&quot;708&quot; height=&quot;728&quot; data-filename=&quot;07-요소별-실행-수.png&quot; data-origin-width=&quot;1416&quot; data-origin-height=&quot;1456&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;① 첫 메일 2 ② 대기 2 ③ 두 번째 메일 1&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;margin-bottom: 16px !important;&quot; data-ke-size=&quot;size16&quot;&gt;이 화면에서는 두 번째 메일의 실행 수가 하나 적은 것만 보이고, 누가 빠졌는지는 구별되지 않습니다. 사람별로는 아래 발송 기록으로 확인합니다.&lt;/p&gt;
&lt;p style=&quot;font-size: 18px !important; font-weight: bold; line-height: 1.5 !important; color: var(--ink); margin-bottom: 10px !important;&quot; data-ke-size=&quot;size18&quot;&gt;2. 발송 기록으로 누가 받았는지 확인합니다&lt;/p&gt;
&lt;p style=&quot;margin-bottom: 16px !important;&quot; data-ke-size=&quot;size16&quot;&gt;Query Editor에서 SEND_STATUS 행만 다시 조회합니다. 수강생01은 첫 메일 한 행, 수강생02는 첫 메일과 두 번째 메일 두 행입니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;08-발송-기록-완료-확인.png&quot; data-origin-width=&quot;2172&quot; data-origin-height=&quot;1256&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b3Jbte/dJMcajxsgii/yd3YeHcZeKdKrjJoU3fELK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b3Jbte/dJMcajxsgii/yd3YeHcZeKdKrjJoU3fELK/img.png&quot; data-alt=&quot;① 수강생01 한 통 ② 수강생02 두 통&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b3Jbte/dJMcajxsgii/yd3YeHcZeKdKrjJoU3fELK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb3Jbte%2FdJMcajxsgii%2Fyd3YeHcZeKdKrjJoU3fELK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; alt=&quot;Query Editor 결과 세 행에서 수강생01의 M815 SENT 한 행과 수강생02의 M815, M494 SENT 두 행이 각각 번호와 함께 강조되어 있다&quot; loading=&quot;lazy&quot; width=&quot;720&quot; height=&quot;416&quot; data-filename=&quot;08-발송-기록-완료-확인.png&quot; data-origin-width=&quot;2172&quot; data-origin-height=&quot;1256&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;① 수강생01 한 통 ② 수강생02 두 통&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;margin-bottom: 16px !important;&quot; data-ke-size=&quot;size16&quot;&gt;수강생01은 대기가 끝나기 전에 빠졌습니다. Data Cloud의 Flow 요소 실행 기록(Flow Element Run)에는 링크를 누르고 약 5분 반 뒤에 수강생01의 대기 요소가 Stopped로 기록되었습니다.&lt;/p&gt;
&lt;p style=&quot;font-size: 14px !important; line-height: 1.7 !important; color: var(--muted); margin-bottom: 16px !important;&quot; data-ke-size=&quot;size14&quot;&gt;릴리스 노트는 이탈 규칙을 Flow가 시작할 때, 일시 중지 뒤 다시 이어질 때, 액션을 부를 때 평가한다고 적지만, 이번에는 대기가 끝나기 전에 빠졌습니다. 클릭이 반영되기까지 몇 분이 걸렸으므로, 대기가 끝나기 직전에 누른 사람도 빠지는지는 확인하지 않았습니다.&lt;/p&gt;
&lt;div data-ke-type=&quot;moreLess&quot; data-text-more=&quot;발송 기록 조회 쿼리 보기&quot; data-text-less=&quot;닫기&quot;&gt;&lt;a class=&quot;btn-toggle-moreless&quot;&gt;더보기&lt;/a&gt;
&lt;div class=&quot;moreless-content&quot;&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;사람마다, 메일마다 한 행이 나오고 시각은 한국 시간입니다.&lt;/li&gt;
&lt;li&gt;주소가 결과에 나오지 않도록 CASE로 이름을 붙였습니다.&lt;/li&gt;
&lt;li&gt;email_step은 메일 요소 이름의 끝부분입니다(M815가 첫 메일, M494가 두 번째 메일).&lt;/li&gt;
&lt;li&gt;위 화면의 쿼리는 주소 대신 별칭 일부로 거른 것이고, 결과는 아래 쿼리와 같습니다.&lt;/li&gt;
&lt;li&gt;시각은 UTC로 '2026-10-19 02:50:00'처럼 넣고, 클릭 기록까지 보려면 마지막 AND 조건(두 줄)을 지웁니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;SELECT
  CASE WHEN
    ssot__SendtimeEmailAddress__c
    = '&amp;lt;누를 사람 주소&amp;gt;'
  THEN '수강생01'
  ELSE '수강생02' END AS person,
  regexp_replace(
    ssot__FlowElementRunId__c,
    '^.*_', '') AS email_step,
  ssot__EngagementChannelActionId__c
    AS action,
  ssot__EmailRecipientSendStatus__c
    AS send_status,
  to_char(
    ssot__EngagementDateTm__c
    + INTERVAL '9' HOUR,
    'MM-DD HH24:MI:SS') AS at_kst
FROM ssot__EmailEngagement__dlm
WHERE
  ssot__SendtimeEmailAddress__c
  IN ('&amp;lt;누를 사람 주소&amp;gt;',
      '&amp;lt;누르지 않을 사람 주소&amp;gt;')
AND ssot__EngagementDateTm__c
  &amp;gt; TIMESTAMP '&amp;lt;활성화 직전 UTC 시각&amp;gt;'
AND ssot__EngagementChannelActionId__c
  = 'SEND_STATUS'
ORDER BY ssot__EngagementDateTm__c&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div data-ke-type=&quot;moreLess&quot; data-text-more=&quot;그림으로 쉽게 보는 요약 보기&quot; data-text-less=&quot;닫기&quot;&gt;&lt;a class=&quot;btn-toggle-moreless&quot;&gt;더보기&lt;/a&gt;
&lt;div class=&quot;moreless-content&quot;&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;eli5-01.png&quot; data-origin-width=&quot;1440&quot; data-origin-height=&quot;3948&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/GtXJm/dJMcabTCjIk/VUKV5SuyW2zpU795n02qGk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/GtXJm/dJMcabTCjIk/VUKV5SuyW2zpU795n02qGk/img.png&quot; data-alt=&quot;그림으로 쉽게 보는 요약&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/GtXJm/dJMcabTCjIk/VUKV5SuyW2zpU795n02qGk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FGtXJm%2FdJMcabTCjIk%2FVUKV5SuyW2zpU795n02qGk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; alt=&quot;이탈 규칙이 없을 때와 있을 때의 두 번째 메일, 수강생01과 수강생02의 시험 결과와 Total Runs, 규칙을 넣는 네 단계, Any Link 주의할 점을 차례로 그린 그림&quot; loading=&quot;lazy&quot; width=&quot;720&quot; height=&quot;1974&quot; data-filename=&quot;eli5-01.png&quot; data-origin-width=&quot;1440&quot; data-origin-height=&quot;3948&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;그림으로 쉽게 보는 요약&lt;/figcaption&gt;
&lt;/figure&gt;

&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p style=&quot;margin-bottom: 16px !important;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;참고 문서&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;a href=&quot;https://help.salesforce.com/s/articleView?id=mktg.mktg_flow_elements_add_move.htm&amp;amp;type=5&amp;amp;language=en_US&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Add Structure and Logic to a Marketing Flow&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://help.salesforce.com/s/articleView?id=release-notes.rn_automate_flow_marketing_cloud_exit_rules_events.htm&amp;amp;release=262&amp;amp;type=5&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Add Exit Rules That Use Events (Summer '26 Release Notes)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://help.salesforce.com/s/articleView?id=mktg.mktg_flow_pause.htm&amp;amp;type=5&amp;amp;language=en_US&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Pause and Edit a Marketing Flow&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>Salesforce/Marketing Cloud</category>
      <category>Exit Rules</category>
      <category>flow</category>
      <category>Marketing Cloud Next</category>
      <category>mca</category>
      <category>이메일</category>
      <author>Luka.dev</author>
      <guid isPermaLink="true">https://jt98.tistory.com/39</guid>
      <comments>https://jt98.tistory.com/39#entry39comment</comments>
      <pubDate>Mon, 19 Oct 2026 13:37:28 +0900</pubDate>
    </item>
    <item>
      <title>Agentforce | Retriever로 규정 문서를 프롬프트 응답의 근거로 활용하는법</title>
      <link>https://jt98.tistory.com/38</link>
      <description>&lt;div class=&quot;greeting&quot;&gt;
&lt;p style=&quot;line-height: 1.8 !important; margin: 0 0 0px !important;&quot; data-ke-size=&quot;size16&quot;&gt;안녕하세요, 루카입니다. 오늘은 수강 안내 문서를 Data Library에 올리고, 프롬프트 템플릿이 그 문서를 근거로 문의에 답하게 해 보겠습니다.&lt;/p&gt;
&lt;/div&gt;
&lt;hr data-ke-style=&quot;style5&quot; /&gt;
&lt;div class=&quot;lead-box&quot; style=&quot;background: color-mix(in srgb, var(--brand) 7%, transparent); border-top: 4px solid var(--brand); border-radius: 10px; padding: 18px 24px 16px; margin: 8px 0 28px;&quot;&gt;
&lt;p style=&quot;font-size: 20px !important; font-weight: bold; line-height: 1.55 !important; color: var(--ink); margin: 0 0 8px !important;&quot; data-ke-size=&quot;size16&quot;&gt;Retriever는 Data 360에 올려 둔 문서에서 질문과 관련된 부분을 찾아 프롬프트에 넣는 기능입니다.&lt;/p&gt;
&lt;p style=&quot;font-size: 16px !important; line-height: 1.7 !important; margin: 0 0 4px !important;&quot; data-ke-size=&quot;size16&quot;&gt;모델은 학원의 반 변경 규정을 모르므로, 문의에 정확히 답하게 하려면 규정 문서의 해당 부분을 프롬프트에 함께 넣어야 합니다.&lt;/p&gt;
&lt;/div&gt;
&lt;p style=&quot;margin-bottom: 16px !important;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;준비할 것&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;Data 360:&lt;/b&gt; Data Cloud의 새 이름인 Data 360이 켜진 org가 필요합니다. Data Library는 문서를 처리할 때와 검색할 때마다 Data 360 크레딧을 씁니다(&lt;a href=&quot;https://jt98.tistory.com/26&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Agentforce 준비와 과금 글&lt;/a&gt;).&lt;/li&gt;
&lt;li&gt;&lt;b&gt;권한:&lt;/b&gt; Data Library를 만들려면 Data Cloud Admin과 System Administrator 권한이 필요합니다. 템플릿을 만들려면 Prompt Template Manager 권한 집합이나 Customize Application 권한이 필요합니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;실행 권한:&lt;/b&gt; 도움말은 Retriever를 실행하는 사용자에게 Data Cloud User 권한 집합이 필요하고, 그 권한 집합에 기본 데이터 공간(default)이 추가되어 있어야 한다고 안내합니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;규정 문서:&lt;/b&gt; 텍스트, HTML, PDF 파일을 준비합니다. Library 하나에 1,000개까지 올릴 수 있고, 이 글에서는 반 변경, 지점 이동, 환불, 교재 배송 규정을 적은 가상 수강 안내 텍스트 파일 하나를 씁니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;시험 데이터와 앞 단계:&lt;/b&gt; Description이 있는 문의(Case)를 한 건 준비합니다. Flex 템플릿과 미리보기는 &lt;a href=&quot;https://jt98.tistory.com/33&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Flex 템플릿을 Flow에서 쓰는 글&lt;/a&gt;에서 다뤘습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p style=&quot;margin-bottom: 16px !important;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;완료 확인:&lt;/b&gt; 미리보기 응답이 문서의 반 변경 규정으로 답하고, Resolved Prompt에 그 규정이 든 문서 조각이 보이면 끝입니다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;문서 올리기&lt;/h2&gt;
&lt;p style=&quot;font-size: 20px !important; font-weight: bold; line-height: 1.6 !important; color: var(--ink); margin-bottom: 16px !important;&quot; data-ke-size=&quot;size20&quot;&gt;파일을 올려 Data Library를 만들면, 문서를 찾는 데 쓰는 검색 인덱스와 Retriever가 자동으로 생깁니다.&lt;/p&gt;
&lt;p style=&quot;font-size: 18px !important; font-weight: bold; line-height: 1.5 !important; color: var(--ink); margin-bottom: 10px !important;&quot; data-ke-size=&quot;size18&quot;&gt;1. Upload Files를 고릅니다&lt;/p&gt;
&lt;p style=&quot;margin-bottom: 16px !important;&quot; data-ke-size=&quot;size16&quot;&gt;Setup의 Quick Find에서 &lt;b&gt;Agentforce Data Library&lt;/b&gt;를 엽니다. 오른쪽 위 &lt;b&gt;Add Data&lt;/b&gt;를 누르고 &lt;b&gt;Upload Files&lt;/b&gt;를 고릅니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;02-add-data-원천.png&quot; data-origin-width=&quot;2104&quot; data-origin-height=&quot;1856&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bWGcAb/dJMcafV9aWp/HpCJW51kDkIXfkhAFMZBN1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bWGcAb/dJMcafV9aWp/HpCJW51kDkIXfkhAFMZBN1/img.png&quot; data-alt=&quot;Add Data의 데이터 소스 선택지&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bWGcAb/dJMcafV9aWp/HpCJW51kDkIXfkhAFMZBN1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbWGcAb%2FdJMcafV9aWp%2FHpCJW51kDkIXfkhAFMZBN1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; alt=&quot;Agentforce Data Library 화면의 Add Data 메뉴에서 Upload Files가 강조되어 있다&quot; loading=&quot;lazy&quot; width=&quot;720&quot; height=&quot;635&quot; data-filename=&quot;02-add-data-원천.png&quot; data-origin-width=&quot;2104&quot; data-origin-height=&quot;1856&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Add Data의 데이터 소스 선택지&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;font-size: 18px !important; font-weight: bold; line-height: 1.5 !important; color: var(--ink); margin-bottom: 10px !important;&quot; data-ke-size=&quot;size18&quot;&gt;2. 이름과 API 이름을 씁니다&lt;/p&gt;
&lt;p style=&quot;margin-bottom: 16px !important;&quot; data-ke-size=&quot;size16&quot;&gt;같은 화면에 폼이 열립니다. &lt;b&gt;Name&lt;/b&gt;과 &lt;b&gt;Description&lt;/b&gt;을 채웁니다. Name에 한글이 있으면 &lt;b&gt;API Name&lt;/b&gt;이 자동으로 채워지지 않으므로 영문 이름을 직접 씁니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;01-new-library-입력.png&quot; data-origin-width=&quot;2104&quot; data-origin-height=&quot;1856&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/5WcPK/dJMcabM3wbe/Z3dMZFj4Hb2B4hoYRRipD0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/5WcPK/dJMcabM3wbe/Z3dMZFj4Hb2B4hoYRRipD0/img.png&quot; data-alt=&quot;Library의 이름과 설명&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/5WcPK/dJMcabM3wbe/Z3dMZFj4Hb2B4hoYRRipD0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F5WcPK%2FdJMcabM3wbe%2FZ3dMZFj4Hb2B4hoYRRipD0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; alt=&quot;폼의 Name, API Name, Description 세 칸이 강조되어 있다&quot; loading=&quot;lazy&quot; width=&quot;720&quot; height=&quot;635&quot; data-filename=&quot;01-new-library-입력.png&quot; data-origin-width=&quot;2104&quot; data-origin-height=&quot;1856&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Library의 이름과 설명&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;font-size: 18px !important; font-weight: bold; line-height: 1.5 !important; color: var(--ink); margin-bottom: 10px !important;&quot; data-ke-size=&quot;size18&quot;&gt;3. 파일을 추가하고 저장합니다&lt;/p&gt;
&lt;p style=&quot;margin-bottom: 16px !important;&quot; data-ke-size=&quot;size16&quot;&gt;폼 아래 &lt;b&gt;Intelligent Context&lt;/b&gt; 스위치는 기본으로 켜져 있습니다. 파일 속 표와 그림까지 읽어 내는 처리이고 크레딧을 더 쓰므로, 표와 그림이 없는 텍스트 파일이면 끕니다.&lt;/p&gt;
&lt;p style=&quot;margin-bottom: 16px !important;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Upload Files&lt;/b&gt;로 파일을 추가하고 &lt;b&gt;Save&lt;/b&gt;를 누릅니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;03-파일-올리기-intelligent-context-끔.png&quot; data-origin-width=&quot;2104&quot; data-origin-height=&quot;1856&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/xzTeV/dJMcafV9aWx/P86BUbafACev7KyBagsCg1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/xzTeV/dJMcafV9aWx/P86BUbafACev7KyBagsCg1/img.png&quot; data-alt=&quot;스위치를 끄고 추가한 파일&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/xzTeV/dJMcafV9aWx/P86BUbafACev7KyBagsCg1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FxzTeV%2FdJMcafV9aWx%2FP86BUbafACev7KyBagsCg1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; alt=&quot;Intelligent Context 스위치가 꺼져 있고 Files 표에 LUKA_030_class_guide.txt가 추가된 모습이 강조되어 있다&quot; loading=&quot;lazy&quot; width=&quot;720&quot; height=&quot;635&quot; data-filename=&quot;03-파일-올리기-intelligent-context-끔.png&quot; data-origin-width=&quot;2104&quot; data-origin-height=&quot;1856&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;스위치를 끄고 추가한 파일&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;div class=&quot;say warn&quot;&gt;&lt;span class=&quot;badge i-alert&quot; aria-hidden=&quot;true&quot;&gt;&lt;/span&gt;
&lt;div&gt;&lt;b&gt;주의&lt;/b&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;파일이 올라가는 동안 이 폼 화면을 떠나면 업로드가 실패합니다. 데이터 소스(이번에는 파일)와 Intelligent Context 설정은 나중에 바꿀 수 없으므로 저장 전에 정합니다.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p style=&quot;font-size: 18px !important; font-weight: bold; line-height: 1.5 !important; color: var(--ink); margin-bottom: 10px !important;&quot; data-ke-size=&quot;size18&quot;&gt;4. 상태가 Ready가 될 때까지 기다립니다&lt;/p&gt;
&lt;p style=&quot;margin-bottom: 16px !important;&quot; data-ke-size=&quot;size16&quot;&gt;저장하면 상세 화면의 &lt;b&gt;Status&lt;/b&gt; 구역에서 다섯 단계가 차례로 끝납니다. Data Lake Object와 Data Model Object를 만들어 연결하고, 검색 인덱스와 Retriever를 만든 뒤, 마지막에 파일 내용을 검색 인덱스에 넣습니다.&lt;/p&gt;
&lt;p style=&quot;margin-bottom: 16px !important;&quot; data-ke-size=&quot;size16&quot;&gt;도움말은 파일 수와 크기에 따라 몇 분에서 몇 시간이 걸린다고 안내합니다. 텍스트 파일 하나를 올린 이번 시험에서는 저장하고 6분 안에 &lt;b&gt;Ready&lt;/b&gt;가 되었습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;04-빌드-완료-ready.png&quot; data-origin-width=&quot;2104&quot; data-origin-height=&quot;1856&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/4X64c/dJMcabM3wbn/5Iutxb2wuzEZxe22XvkY41/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/4X64c/dJMcabM3wbn/5Iutxb2wuzEZxe22XvkY41/img.png&quot; data-alt=&quot;Ready가 된 Library&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/4X64c/dJMcabM3wbn/5Iutxb2wuzEZxe22XvkY41/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F4X64c%2FdJMcabM3wbn%2F5Iutxb2wuzEZxe22XvkY41%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; alt=&quot;상세 화면의 Status가 Ready이고 단계 다섯 개에 초록 체크가 있으며 Retriever 링크가 강조되어 있다&quot; loading=&quot;lazy&quot; width=&quot;720&quot; height=&quot;635&quot; data-filename=&quot;04-빌드-완료-ready.png&quot; data-origin-width=&quot;2104&quot; data-origin-height=&quot;1856&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Ready가 된 Library&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;font-size: 14px !important; line-height: 1.7 !important; color: var(--muted); margin-bottom: 16px !important;&quot; data-ke-size=&quot;size14&quot;&gt;Ready가 되기 전에는 Library를 쓸 수 없습니다. 기다리는 동안 다음 절의 템플릿을 먼저 만들어 두어도 됩니다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style5&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;템플릿에 넣기&lt;/h2&gt;
&lt;p style=&quot;font-size: 20px !important; font-weight: bold; line-height: 1.6 !important; color: var(--ink); margin-bottom: 16px !important;&quot; data-ke-size=&quot;size20&quot;&gt;Retriever의 Search Text에 문의 Description을 지정하면, 템플릿이 실행될 때마다 그 문의와 관련된 문서 조각이 프롬프트에 들어갑니다.&lt;/p&gt;
&lt;p style=&quot;font-size: 18px !important; font-weight: bold; line-height: 1.5 !important; color: var(--ink); margin-bottom: 10px !important;&quot; data-ke-size=&quot;size18&quot;&gt;1. 지시문을 쓴 Flex 템플릿을 만듭니다&lt;/p&gt;
&lt;p style=&quot;margin-bottom: 16px !important;&quot; data-ke-size=&quot;size16&quot;&gt;Prompt Builder에서 Flex 템플릿을 만들고 입력은 Case 하나로 둡니다. 지시문에는 문서를 넣을 자리(&quot;수강 안내:&quot; 아래 줄)를 비워 둡니다.&lt;/p&gt;
&lt;pre id=&quot;code_1&quot; class=&quot;plaintext&quot; data-ke-language=&quot;plaintext&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;당신은 온라인 학원의
상담 담당자입니다.
아래 문의에 보낼 답장 초안을
쓰세요.

문의 내용: (Description)

수강 안내:
(Retriever를 넣을 줄)

- 위 수강 안내에 있는 규정만
  근거로 답합니다.
- 수강 안내에 없는 내용은
  모른다고 씁니다.
- 세 문장 안으로, 한국어로
  씁니다.&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;margin-bottom: 16px !important;&quot; data-ke-size=&quot;size16&quot;&gt;(Description) 자리에는 &lt;b&gt;Insert Resource&lt;/b&gt;로 Case의 Description 병합 필드(Merge Field)를 넣습니다. 줄은 화면 폭에 맞춰 나눈 것이라 이어 써도 됩니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;05-지시문-retriever-없음.png&quot; data-origin-width=&quot;2104&quot; data-origin-height=&quot;1856&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bCxRSN/dJMcafV9aWB/ketuV8xkRurZ7zDHCXjmUk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bCxRSN/dJMcafV9aWB/ketuV8xkRurZ7zDHCXjmUk/img.png&quot; data-alt=&quot;Retriever를 넣기 전의 지시문&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bCxRSN/dJMcafV9aWB/ketuV8xkRurZ7zDHCXjmUk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbCxRSN%2FdJMcafV9aWB%2FketuV8xkRurZ7zDHCXjmUk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; alt=&quot;Prompt Builder 편집 화면의 지시문에 Input:Case.Description 병합 필드가 강조되어 있고 수강 안내 아래가 비어 있다&quot; loading=&quot;lazy&quot; width=&quot;720&quot; height=&quot;635&quot; data-filename=&quot;05-지시문-retriever-없음.png&quot; data-origin-width=&quot;2104&quot; data-origin-height=&quot;1856&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Retriever를 넣기 전의 지시문&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;font-size: 18px !important; font-weight: bold; line-height: 1.5 !important; color: var(--ink); margin-bottom: 10px !important;&quot; data-ke-size=&quot;size18&quot;&gt;2. Retriever 없이 미리 봅니다&lt;/p&gt;
&lt;p style=&quot;margin-bottom: 16px !important;&quot; data-ke-size=&quot;size16&quot;&gt;템플릿을 저장하고 &lt;b&gt;Preview Settings&lt;/b&gt;(톱니 옆 조절 막대 아이콘)에서 반 변경 문의를 고른 뒤 &lt;b&gt;Preview&lt;/b&gt;를 누릅니다. 수강 안내 자리가 비어 있으므로, 응답은 규정이 없어 답할 수 없다는 내용이었습니다. 첫 문장은 지시와 달리 영어로 나왔습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;06-근거-없는-응답.png&quot; data-origin-width=&quot;2936&quot; data-origin-height=&quot;1856&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bzpiQY/dJMcahGhPSi/vmTPvPnn6ZtA9rR9QnAgi1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bzpiQY/dJMcahGhPSi/vmTPvPnn6ZtA9rR9QnAgi1/img.png&quot; data-alt=&quot;Retriever 없이 받은 응답&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bzpiQY/dJMcahGhPSi/vmTPvPnn6ZtA9rR9QnAgi1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbzpiQY%2FdJMcahGhPSi%2FvmTPvPnn6ZtA9rR9QnAgi1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; alt=&quot;Generated Response에 수강 안내에 해당 규정이 없어 답변할 수 없다는 응답이 강조되어 있다&quot; loading=&quot;lazy&quot; width=&quot;720&quot; height=&quot;455&quot; data-filename=&quot;06-근거-없는-응답.png&quot; data-origin-width=&quot;2936&quot; data-origin-height=&quot;1856&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Retriever 없이 받은 응답&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;font-size: 18px !important; font-weight: bold; line-height: 1.5 !important; color: var(--ink); margin-bottom: 10px !important;&quot; data-ke-size=&quot;size18&quot;&gt;3. Retriever를 고릅니다&lt;/p&gt;
&lt;p style=&quot;margin-bottom: 16px !important;&quot; data-ke-size=&quot;size16&quot;&gt;&quot;수강 안내:&quot; 아래 빈 줄을 누르고 &lt;code&gt;@&lt;/code&gt;를 친 뒤 &lt;b&gt;Retrievers&lt;/b&gt;에서 &lt;b&gt;Configure Retrievers&lt;/b&gt;를 누릅니다. 왼쪽에 &lt;b&gt;Template Details&lt;/b&gt; 패널의 &lt;b&gt;Resources&lt;/b&gt; 탭이 열리고, 앞 절에서 만든 Library의 Retriever가 목록에 보입니다.&lt;/p&gt;
&lt;p style=&quot;margin-bottom: 16px !important;&quot; data-ke-size=&quot;size16&quot;&gt;이번 Retriever의 이름은 File_LUKA_030_Class_Guide였습니다. 목록 위 검색칸에 이름 일부를 넣으면 목록이 좁혀집니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;07-retrievers-목록.png&quot; data-origin-width=&quot;2936&quot; data-origin-height=&quot;1856&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cM0Aec/dJMcahGhPSn/Knr6CZLTEN23OAWFOUybAk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cM0Aec/dJMcahGhPSn/Knr6CZLTEN23OAWFOUybAk/img.png&quot; data-alt=&quot;Library의 Retriever&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cM0Aec/dJMcahGhPSn/Knr6CZLTEN23OAWFOUybAk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcM0Aec%2FdJMcahGhPSn%2FKnr6CZLTEN23OAWFOUybAk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; alt=&quot;Template Details 패널의 Retrievers 목록에서 File_LUKA_030_Class_Guide가 강조되어 있다&quot; loading=&quot;lazy&quot; width=&quot;720&quot; height=&quot;455&quot; data-filename=&quot;07-retrievers-목록.png&quot; data-origin-width=&quot;2936&quot; data-origin-height=&quot;1856&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Library의 Retriever&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;font-size: 18px !important; font-weight: bold; line-height: 1.5 !important; color: var(--ink); margin-bottom: 10px !important;&quot; data-ke-size=&quot;size18&quot;&gt;4. Search Text에 문의 Description을 지정합니다&lt;/p&gt;
&lt;p style=&quot;margin-bottom: 16px !important;&quot; data-ke-size=&quot;size16&quot;&gt;Retriever를 누르면 같은 패널에 설정 칸이 열립니다. &lt;b&gt;Search Parameters&lt;/b&gt;의 &lt;b&gt;Search Text&lt;/b&gt; 검색칸에서 &lt;b&gt;Case&lt;/b&gt;, &lt;b&gt;Description&lt;/b&gt;을 차례로 고릅니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;08-retriever-설정-패널.png&quot; data-origin-width=&quot;2936&quot; data-origin-height=&quot;1856&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/mLHCz/dJMcabM3wbs/SQTeWw89FWdtxBCwV7bO7K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/mLHCz/dJMcabM3wbs/SQTeWw89FWdtxBCwV7bO7K/img.png&quot; data-alt=&quot;Search Text와 Number of Results&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/mLHCz/dJMcabM3wbs/SQTeWw89FWdtxBCwV7bO7K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FmLHCz%2FdJMcabM3wbs%2FSQTeWw89FWdtxBCwV7bO7K%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; alt=&quot;Search Parameters의 Search Text에 Input:Case.Description이 들어가 있고 Number of Results 칸이 강조되어 있다&quot; loading=&quot;lazy&quot; width=&quot;720&quot; height=&quot;455&quot; data-filename=&quot;08-retriever-설정-패널.png&quot; data-origin-width=&quot;2936&quot; data-origin-height=&quot;1856&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Search Text와 Number of Results&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;margin-bottom: 16px !important;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Output Fields&lt;/b&gt;와 &lt;b&gt;Number of Results&lt;/b&gt;는 비워 둡니다. 비워 두면 Retriever에 정해진 값을 쓰고, Output Fields는 Retriever의 모든 필드가 프롬프트에 들어갑니다.&lt;/p&gt;
&lt;p style=&quot;font-size: 14px !important; line-height: 1.7 !important; color: var(--muted); margin-bottom: 16px !important;&quot; data-ke-size=&quot;size14&quot;&gt;도움말에 따르면 Search Text에는 템플릿 입력의 병합 필드, 글로벌 값, 직접 쓴 글을 넣을 수 있고 255자까지입니다. 관련 목록, Flow, Apex의 결과는 쓸 수 없다고 안내합니다.&lt;/p&gt;
&lt;p style=&quot;font-size: 18px !important; font-weight: bold; line-height: 1.5 !important; color: var(--ink); margin-bottom: 10px !important;&quot; data-ke-size=&quot;size18&quot;&gt;5. 편집기에 넣고 저장합니다&lt;/p&gt;
&lt;p style=&quot;margin-bottom: 16px !important;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Apply and Insert&lt;/b&gt;를 누르면 비워 둔 줄에 Retriever가 들어갑니다. 템플릿을 저장합니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;09-편집기의-retriever.png&quot; data-origin-width=&quot;2936&quot; data-origin-height=&quot;1856&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ccShNx/dJMcabM3wbx/LdnkdWmgq3OYXCKAX4iM6k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ccShNx/dJMcabM3wbx/LdnkdWmgq3OYXCKAX4iM6k/img.png&quot; data-alt=&quot;지시문에 들어간 Retriever&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ccShNx/dJMcabM3wbx/LdnkdWmgq3OYXCKAX4iM6k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FccShNx%2FdJMcabM3wbx%2FLdnkdWmgq3OYXCKAX4iM6k%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; alt=&quot;지시문의 수강 안내 아래에 Retrievers:File_LUKA_030_Class_Guide가 들어간 모습이 강조되어 있다&quot; loading=&quot;lazy&quot; width=&quot;720&quot; height=&quot;455&quot; data-filename=&quot;09-편집기의-retriever.png&quot; data-origin-width=&quot;2936&quot; data-origin-height=&quot;1856&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;지시문에 들어간 Retriever&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr data-ke-style=&quot;style5&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;근거 확인&lt;/h2&gt;
&lt;p style=&quot;font-size: 20px !important; font-weight: bold; line-height: 1.6 !important; color: var(--ink); margin-bottom: 16px !important;&quot; data-ke-size=&quot;size20&quot;&gt;Generate Response를 끄고 미리 보면, AI를 부르지 않고도 Resolved Prompt에서 Retriever가 찾아 온 문서 조각을 볼 수 있습니다.&lt;/p&gt;
&lt;p style=&quot;font-size: 18px !important; font-weight: bold; line-height: 1.5 !important; color: var(--ink); margin-bottom: 10px !important;&quot; data-ke-size=&quot;size18&quot;&gt;1. 응답을 만들지 않고 찾아 온 조각을 봅니다&lt;/p&gt;
&lt;p style=&quot;margin-bottom: 16px !important;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Preview Settings&lt;/b&gt;에서 &lt;b&gt;Generate Response&lt;/b&gt;를 끄고 &lt;b&gt;Preview&lt;/b&gt;를 누릅니다. &lt;b&gt;Resolved Prompt&lt;/b&gt;의 &quot;수강 안내:&quot; 아래에 검색 결과가 JSON으로 들어갑니다. 그 안의 Chunk 값이 Retriever가 찾아 온 문서 조각(chunk)입니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;10-찾아-온-문서-조각.png&quot; data-origin-width=&quot;2104&quot; data-origin-height=&quot;1856&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cqo6Qs/dJMcabM3wbA/KeQYK3YL84V1v1XyMoFOyK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cqo6Qs/dJMcabM3wbA/KeQYK3YL84V1v1XyMoFOyK/img.png&quot; data-alt=&quot;찾아 온 문서 조각&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cqo6Qs/dJMcabM3wbA/KeQYK3YL84V1v1XyMoFOyK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fcqo6Qs%2FdJMcabM3wbA%2FKeQYK3YL84V1v1XyMoFOyK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; alt=&quot;Resolved Prompt의 수강 안내 아래 검색 결과 JSON에서 반 변경 규정이 든 Chunk 값이 강조되어 있다&quot; loading=&quot;lazy&quot; width=&quot;720&quot; height=&quot;635&quot; data-filename=&quot;10-찾아-온-문서-조각.png&quot; data-origin-width=&quot;2104&quot; data-origin-height=&quot;1856&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;찾아 온 문서 조각&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;margin-bottom: 16px !important;&quot; data-ke-size=&quot;size16&quot;&gt;이번 문서(1.34 kB)는 전체가 조각 하나로 들어왔습니다. 도움말은 Number of Results를 &quot;지식 기사 조각 15개&quot;처럼 가져올 결과의 최대 수로 설명하므로, 긴 문서라면 여러 조각 가운데 관련된 것만 이 수만큼 들어옵니다.&lt;/p&gt;
&lt;p style=&quot;font-size: 18px !important; font-weight: bold; line-height: 1.5 !important; color: var(--ink); margin-bottom: 10px !important;&quot; data-ke-size=&quot;size18&quot;&gt;2. 응답을 받아 봅니다&lt;/p&gt;
&lt;p style=&quot;margin-bottom: 16px !important;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Generate Response&lt;/b&gt;를 다시 켜고 &lt;b&gt;Preview&lt;/b&gt;를 누릅니다. 이번 응답은 문서의 반 변경 규정으로 답했습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;11-근거로-답한-응답.png&quot; data-origin-width=&quot;2936&quot; data-origin-height=&quot;1856&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/4JFFr/dJMcafV9aWN/sEXppEgVAm5JuklkIP97I0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/4JFFr/dJMcafV9aWN/sEXppEgVAm5JuklkIP97I0/img.png&quot; data-alt=&quot;문서를 근거로 답한 응답&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/4JFFr/dJMcafV9aWN/sEXppEgVAm5JuklkIP97I0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F4JFFr%2FdJMcafV9aWN%2FsEXppEgVAm5JuklkIP97I0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; alt=&quot;Generated Response에 개강일로부터 14일 안에 한 번 무료로 반을 옮길 수 있고 지나면 다음 달 개강반으로만 옮길 수 있다는 응답이 강조되어 있다&quot; loading=&quot;lazy&quot; width=&quot;720&quot; height=&quot;455&quot; data-filename=&quot;11-근거로-답한-응답.png&quot; data-origin-width=&quot;2936&quot; data-origin-height=&quot;1856&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;문서를 근거로 답한 응답&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;margin-bottom: 16px !important;&quot; data-ke-size=&quot;size16&quot;&gt;다만 &quot;빈자리가 없으면 다음 달 개강반으로만 옮길 수 있다&quot;는 문서에 없는 조합입니다. 문서는 빈자리가 있을 때만 처리한다고만 적습니다. Retriever는 근거를 넣어 줄 뿐이므로, 답장 초안은 보내기 전에 사람이 문서와 대조합니다.&lt;/p&gt;
&lt;p style=&quot;margin-bottom: 16px !important;&quot; data-ke-size=&quot;size16&quot;&gt;같은 문의로 받은 두 응답을 비교하면 아래와 같습니다. Retriever 없이는 수강 안내에 규정이 없어 답할 수 없다고 했고, Retriever를 넣은 뒤에는 문서의 규정으로 답했습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;fig-01.png&quot; data-origin-width=&quot;960&quot; data-origin-height=&quot;1030&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bVP4U5/dJMb99VL8R5/O74RJHUmXEn1Blw8y5Vne1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bVP4U5/dJMb99VL8R5/O74RJHUmXEn1Blw8y5Vne1/img.png&quot; data-alt=&quot;Retriever를 넣기 전과 뒤의 응답&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bVP4U5/dJMb99VL8R5/O74RJHUmXEn1Blw8y5Vne1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbVP4U5%2FdJMb99VL8R5%2FO74RJHUmXEn1Blw8y5Vne1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; alt=&quot;Retriever가 없을 때는 수강 안내에 규정이 없어 답할 수 없다고 답했고, Retriever를 넣은 뒤에는 개강일로부터 14일 안 한 번 무료와 반 변경 신청 메뉴로 답했다는 비교 그림&quot; loading=&quot;lazy&quot; width=&quot;480&quot; height=&quot;515&quot; data-filename=&quot;fig-01.png&quot; data-origin-width=&quot;960&quot; data-origin-height=&quot;1030&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Retriever를 넣기 전과 뒤의 응답&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;div data-ke-type=&quot;moreLess&quot; data-text-more=&quot;그림으로 쉽게 보는 요약 보기&quot; data-text-less=&quot;닫기&quot;&gt;&lt;a class=&quot;btn-toggle-moreless&quot;&gt;더보기&lt;/a&gt;
&lt;div class=&quot;moreless-content&quot;&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;eli5-01.png&quot; data-origin-width=&quot;1440&quot; data-origin-height=&quot;4764&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/deBQsA/dJMcacZkroW/k3fwkOOO3huVXDXYf9zkkk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/deBQsA/dJMcacZkroW/k3fwkOOO3huVXDXYf9zkkk/img.png&quot; data-alt=&quot;그림으로 쉽게 보는 요약&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/deBQsA/dJMcacZkroW/k3fwkOOO3huVXDXYf9zkkk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdeBQsA%2FdJMcacZkroW%2Fk3fwkOOO3huVXDXYf9zkkk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; alt=&quot;모델은 규정 문서를 모른다, 문서를 올리면 Library와 Retriever가 생기고 Ready가 된다, 템플릿의 수강 안내 아래 빈 줄에 Retriever를 넣는다, 넣기 전에는 답하지 못하고 넣은 뒤에는 14일 안 한 번 무료로 답한다, Generate Response를 끄면 Resolved Prompt에서 문서 조각이 보인다, 보내기 전에 사람이 답장 초안과 문서를 대조한다는 여섯 장면 요약&quot; loading=&quot;lazy&quot; width=&quot;720&quot; height=&quot;2382&quot; data-filename=&quot;eli5-01.png&quot; data-origin-width=&quot;1440&quot; data-origin-height=&quot;4764&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;그림으로 쉽게 보는 요약&lt;/figcaption&gt;
&lt;/figure&gt;

&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p style=&quot;margin-bottom: 16px !important;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;참고 문서&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;a href=&quot;https://help.salesforce.com/s/articleView?id=ai.prompt_builder_ground_rag_about.htm&amp;amp;type=5&amp;amp;language=en_US&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;About Retrievers in Prompt Templates&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://help.salesforce.com/s/articleView?id=ai.prompt_builder_retriever_individual.htm&amp;amp;type=5&amp;amp;language=en_US&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Add an Individual Retriever to a Prompt Template&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://help.salesforce.com/s/articleView?id=ai.data_library_file_upload.htm&amp;amp;type=5&amp;amp;language=en_US&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Use Uploaded Files&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://help.salesforce.com/s/articleView?id=ai.generative_ai_rag_about.htm&amp;amp;type=5&amp;amp;language=en_US&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;About Retrieval Augmented Generation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://help.salesforce.com/s/articleView?id=ai.data_library_billing.htm&amp;amp;type=5&amp;amp;language=en_US&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Billing Considerations for Agentforce Data Library&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>Salesforce/Agentforce</category>
      <category>Agentforce</category>
      <category>Data Library</category>
      <category>Prompt Builder</category>
      <category>Rag</category>
      <category>retriever</category>
      <author>Luka.dev</author>
      <guid isPermaLink="true">https://jt98.tistory.com/38</guid>
      <comments>https://jt98.tistory.com/38#entry38comment</comments>
      <pubDate>Mon, 19 Oct 2026 10:18:26 +0900</pubDate>
    </item>
    <item>
      <title>Agentforce | Structured Outputs로 JSON 응답 형식을 지정하고 Flow에서 사용</title>
      <link>https://jt98.tistory.com/37</link>
      <description>&lt;div class=&quot;greeting&quot;&gt;
&lt;p style=&quot;line-height: 1.8 !important; margin: 0 0 0px !important;&quot; data-ke-size=&quot;size16&quot;&gt;안녕하세요, 루카입니다. 오늘은 프롬프트 템플릿의 응답을 JSON으로 받고, Flow에서 긴급도 값으로 분기해 보겠습니다.&lt;/p&gt;
&lt;/div&gt;
&lt;hr data-ke-style=&quot;style5&quot; /&gt;
&lt;div class=&quot;lead-box&quot; style=&quot;background: color-mix(in srgb, var(--brand) 7%, transparent); border-top: 4px solid var(--brand); border-radius: 10px; padding: 18px 24px 16px; margin: 8px 0 28px;&quot;&gt;
&lt;p style=&quot;font-size: 20px !important; font-weight: bold; line-height: 1.55 !important; color: var(--ink); margin: 0 0 8px !important;&quot; data-ke-size=&quot;size16&quot;&gt;Structured Outputs는 프롬프트 템플릿이 돌려줄 응답의 형식을 JSON이나 HTML로 정해 두는 기능입니다.&lt;/p&gt;
&lt;p style=&quot;font-size: 16px !important; line-height: 1.7 !important; margin: 0 0 4px !important;&quot; data-ke-size=&quot;size16&quot;&gt;지시문에 형식을 적어도 응답 형식은 호출마다 달라질 수 있으므로, Flow가 응답에서 값을 꺼내 쓰려면 형식을 템플릿 설정으로 정해 두는 편이 안전합니다.&lt;/p&gt;
&lt;/div&gt;
&lt;p style=&quot;margin-bottom: 16px !important;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;준비할 것&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;권한:&lt;/b&gt; 템플릿을 만들려면 Prompt Template Manager 권한 집합이나 Customize Application 권한이 필요합니다. Flow를 만들려면 Manage Flow 권한이 필요합니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;시험 데이터:&lt;/b&gt; 제목과 Description이 있는 문의(Case)를 한 건 준비합니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;앞 단계:&lt;/b&gt; Flex 템플릿과 Flow의 Prompt Template 액션은 &lt;a href=&quot;https://jt98.tistory.com/33&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;AF-06 글&lt;/a&gt;에서 다뤘습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p style=&quot;margin-bottom: 16px !important;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;완료 확인:&lt;/b&gt; Flow Debug 결과에서 긴급도(urgency) 값이 필드로 보이고, Decision이 그 값으로 경로를 고른 내역이 보이면 끝입니다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;형식 바꾸기&lt;/h2&gt;
&lt;p style=&quot;font-size: 20px !important; font-weight: bold; line-height: 1.6 !important; color: var(--ink); margin-bottom: 16px !important;&quot; data-ke-size=&quot;size20&quot;&gt;응답 형식을 JSON으로 바꾸면 응답을 JSON 하나로 받지만, 키 이름은 모델이 정합니다.&lt;/p&gt;
&lt;p style=&quot;font-size: 18px !important; font-weight: bold; line-height: 1.5 !important; color: var(--ink); margin-bottom: 10px !important;&quot; data-ke-size=&quot;size18&quot;&gt;1. 문의를 분류하는 Flex 템플릿을 만듭니다&lt;/p&gt;
&lt;p style=&quot;margin-bottom: 16px !important;&quot; data-ke-size=&quot;size16&quot;&gt;Prompt Builder에서 Flex 템플릿을 만들고 입력은 Case 하나로 둡니다. 지시문에는 받을 항목과 값 목록을 적고, 응답 형식은 적지 않습니다.&lt;/p&gt;
&lt;pre id=&quot;code_1&quot; class=&quot;plaintext&quot; data-ke-language=&quot;plaintext&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;당신은 온라인 학원의
상담 담당자입니다.
아래 문의를 읽고 분류하세요.

문의 제목: (Subject)
문의 내용: (Description)

- 분류는 반 변경, 교재&amp;middot;배송,
  결제&amp;middot;영수증, 환불, 기타
  가운데 하나입니다.
- 긴급도는 높음, 보통, 낮음
  가운데 하나입니다.
- 요약은 문의 내용을
  한 문장으로 씁니다.
- 다음 할 일은 상담 담당이
  할 일을 한 문장으로 씁니다.
- 한국어로 씁니다.&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;margin-bottom: 16px !important;&quot; data-ke-size=&quot;size16&quot;&gt;괄호 자리에는 &lt;b&gt;Insert Resource&lt;/b&gt;로 Case의 Subject와 Description 병합 필드를 넣습니다. 줄은 화면 폭에 맞춰 나눈 것이라 이어 써도 됩니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;01-새-템플릿.png&quot; data-origin-width=&quot;2936&quot; data-origin-height=&quot;1856&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/qAZTw/dJMcaaHk4jw/QBpWzC6DKQ4hoZ455nHRX0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/qAZTw/dJMcaaHk4jw/QBpWzC6DKQ4hoZ455nHRX0/img.png&quot; data-alt=&quot;지시문과 Case 병합 필드&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/qAZTw/dJMcaaHk4jw/QBpWzC6DKQ4hoZ455nHRX0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FqAZTw%2FdJMcaaHk4jw%2FQBpWzC6DKQ4hoZ455nHRX0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; alt=&quot;Prompt Builder 편집 화면의 지시문에 Input:Case.Subject와 Input:Case.Description 병합 필드가 강조되어 있다&quot; loading=&quot;lazy&quot; width=&quot;720&quot; height=&quot;455&quot; data-filename=&quot;01-새-템플릿.png&quot; data-origin-width=&quot;2936&quot; data-origin-height=&quot;1856&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;지시문과 Case 병합 필드&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;font-size: 18px !important; font-weight: bold; line-height: 1.5 !important; color: var(--ink); margin-bottom: 10px !important;&quot; data-ke-size=&quot;size18&quot;&gt;2. 기본 형식으로 미리 봅니다&lt;/p&gt;
&lt;p style=&quot;margin-bottom: 16px !important;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Preview Settings&lt;/b&gt;에서 문의를 고르고 &lt;b&gt;Generate Response&lt;/b&gt;를 켠 채 &lt;b&gt;Save &amp;amp; Preview&lt;/b&gt;를 누릅니다. 형식을 정하지 않은 기본(Default) 상태에서는 모델이 글머리표 목록으로 답했습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;02-Default-응답.png&quot; data-origin-width=&quot;2936&quot; data-origin-height=&quot;1856&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/LVjD7/dJMcaaHk4jz/s6NjJIqMbhDVrG3wdlSmbK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/LVjD7/dJMcaaHk4jz/s6NjJIqMbhDVrG3wdlSmbK/img.png&quot; data-alt=&quot;기본 형식의 응답&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/LVjD7/dJMcaaHk4jz/s6NjJIqMbhDVrG3wdlSmbK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FLVjD7%2FdJMcaaHk4jz%2Fs6NjJIqMbhDVrG3wdlSmbK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; alt=&quot;Generated Response에 분류, 긴급도, 요약, 다음 할 일이 글머리표 목록으로 나온 응답이 강조되어 있다&quot; loading=&quot;lazy&quot; width=&quot;720&quot; height=&quot;455&quot; data-filename=&quot;02-Default-응답.png&quot; data-origin-width=&quot;2936&quot; data-origin-height=&quot;1856&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;기본 형식의 응답&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;font-size: 18px !important; font-weight: bold; line-height: 1.5 !important; color: var(--ink); margin-bottom: 10px !important;&quot; data-ke-size=&quot;size18&quot;&gt;3. 응답 형식을 JSON으로 바꿉니다&lt;/p&gt;
&lt;p style=&quot;margin-bottom: 16px !important;&quot; data-ke-size=&quot;size16&quot;&gt;편집 화면의 톱니 아이콘을 누르면 왼쪽에 &lt;b&gt;Template Details&lt;/b&gt; 패널이 열립니다. &lt;b&gt;Format&lt;/b&gt; 구역의 &lt;b&gt;Response Format&lt;/b&gt;에서 &lt;b&gt;JSON&lt;/b&gt;을 고르고 저장합니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;03-응답-형식-JSON.png&quot; data-origin-width=&quot;2936&quot; data-origin-height=&quot;1856&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/djDAsB/dJMcad4V6kd/FG1ahIB4SpUhO3loXydOpK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/djDAsB/dJMcad4V6kd/FG1ahIB4SpUhO3loXydOpK/img.png&quot; data-alt=&quot;Response Format의 JSON&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/djDAsB/dJMcad4V6kd/FG1ahIB4SpUhO3loXydOpK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdjDAsB%2FdJMcad4V6kd%2FFG1ahIB4SpUhO3loXydOpK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; alt=&quot;Template Details 패널의 Format 구역에서 Response Format이 JSON으로 강조되어 있다&quot; loading=&quot;lazy&quot; width=&quot;720&quot; height=&quot;455&quot; data-filename=&quot;03-응답-형식-JSON.png&quot; data-origin-width=&quot;2936&quot; data-origin-height=&quot;1856&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Response Format의 JSON&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;margin-bottom: 16px !important;&quot; data-ke-size=&quot;size16&quot;&gt;JSON을 고르면 바로 아래에 &lt;b&gt;Response Structure (optional)&lt;/b&gt; 칸이 생깁니다. 지금은 비워 둡니다.&lt;/p&gt;
&lt;p style=&quot;font-size: 18px !important; font-weight: bold; line-height: 1.5 !important; color: var(--ink); margin-bottom: 10px !important;&quot; data-ke-size=&quot;size18&quot;&gt;4. JSON 형식으로 미리 봅니다&lt;/p&gt;
&lt;p style=&quot;margin-bottom: 16px !important;&quot; data-ke-size=&quot;size16&quot;&gt;같은 문의로 다시 &lt;b&gt;Save &amp;amp; Preview&lt;/b&gt;를 누르면, 이번에는 &quot;분류&quot;, &quot;긴급도&quot; 같은 한국어 키로 답했습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;04-JSON-응답.png&quot; data-origin-width=&quot;2936&quot; data-origin-height=&quot;1856&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/MdMTX/dJMcaaHk4jG/XQIhcDMMGmgP0tgaVXfGnK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/MdMTX/dJMcaaHk4jG/XQIhcDMMGmgP0tgaVXfGnK/img.png&quot; data-alt=&quot;Lightning Type 없이 받은 JSON&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/MdMTX/dJMcaaHk4jG/XQIhcDMMGmgP0tgaVXfGnK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FMdMTX%2FdJMcaaHk4jG%2FXQIhcDMMGmgP0tgaVXfGnK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; alt=&quot;Generated Response에 분류, 긴급도, 요약, 다음 할 일을 한국어 키로 쓴 JSON 응답이 강조되어 있다&quot; loading=&quot;lazy&quot; width=&quot;720&quot; height=&quot;455&quot; data-filename=&quot;04-JSON-응답.png&quot; data-origin-width=&quot;2936&quot; data-origin-height=&quot;1856&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Lightning Type 없이 받은 JSON&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr data-ke-style=&quot;style5&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;필드 정하기&lt;/h2&gt;
&lt;p style=&quot;font-size: 20px !important; font-weight: bold; line-height: 1.6 !important; color: var(--ink); margin-bottom: 16px !important;&quot; data-ke-size=&quot;size20&quot;&gt;Lightning Type으로 필드를 정해 두면 모델은 구조를 직접 정하지 않고 그 필드에 값을 채워 돌려줍니다.&lt;/p&gt;
&lt;p style=&quot;margin-bottom: 16px !important;&quot; data-ke-size=&quot;size16&quot;&gt;Lightning Type은 응답에 들어갈 필드(JSON의 키)의 이름, 데이터 유형, 필수 여부를 정한 스키마입니다.&lt;/p&gt;
&lt;p style=&quot;font-size: 18px !important; font-weight: bold; line-height: 1.5 !important; color: var(--ink); margin-bottom: 10px !important;&quot; data-ke-size=&quot;size18&quot;&gt;1. 새 Lightning Type을 만듭니다&lt;/p&gt;
&lt;p style=&quot;margin-bottom: 16px !important;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Response Structure&lt;/b&gt; 칸을 누르고 &lt;b&gt;New Lightning Type&lt;/b&gt;을 고릅니다. &lt;b&gt;Label&lt;/b&gt;, &lt;b&gt;API Name&lt;/b&gt;, &lt;b&gt;Description&lt;/b&gt;을 채우고 &lt;b&gt;Next&lt;/b&gt;를 누릅니다.&lt;/p&gt;
&lt;p style=&quot;margin-bottom: 16px !important;&quot; data-ke-size=&quot;size16&quot;&gt;API Name은 영문자와 숫자만 쓸 수 있습니다. 라벨에서 자동으로 채운 값에는 한글과 밑줄이 들어가 &lt;b&gt;Next&lt;/b&gt;가 눌리지 않으므로 직접 고쳐 씁니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;05-새-Lightning-Type.png&quot; data-origin-width=&quot;2072&quot; data-origin-height=&quot;876&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bE6y79/dJMcaikYLW2/BDyMlRxOaP8x8GzxpfdRL0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bE6y79/dJMcaikYLW2/BDyMlRxOaP8x8GzxpfdRL0/img.png&quot; data-alt=&quot;Lightning Type의 이름과 설명&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bE6y79/dJMcaikYLW2/BDyMlRxOaP8x8GzxpfdRL0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbE6y79%2FdJMcaikYLW2%2FBDyMlRxOaP8x8GzxpfdRL0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; alt=&quot;New Lightning Type 창에서 Label, API Name, Description 세 칸이 강조되어 있다&quot; loading=&quot;lazy&quot; width=&quot;720&quot; height=&quot;304&quot; data-filename=&quot;05-새-Lightning-Type.png&quot; data-origin-width=&quot;2072&quot; data-origin-height=&quot;876&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Lightning Type의 이름과 설명&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;font-size: 18px !important; font-weight: bold; line-height: 1.5 !important; color: var(--ink); margin-bottom: 10px !important;&quot; data-ke-size=&quot;size18&quot;&gt;2. 필드 넷을 정하고 저장합니다&lt;/p&gt;
&lt;p style=&quot;margin-bottom: 16px !important;&quot; data-ke-size=&quot;size16&quot;&gt;줄마다 &lt;b&gt;Field Name&lt;/b&gt;, &lt;b&gt;Description&lt;/b&gt;, &lt;b&gt;Data Type&lt;/b&gt;을 채우고, 반드시 받아야 하는 필드는 &lt;b&gt;Required&lt;/b&gt;를 켭니다. 필드를 더할 때는 &lt;b&gt;Add Row&lt;/b&gt;를 누릅니다. 이번에 만든 필드 넷은 모두 String이고, nextAction만 Required를 껐습니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;category:&lt;/b&gt; 분류, 앞의 다섯 값 가운데 하나&lt;/li&gt;
&lt;li&gt;&lt;b&gt;urgency:&lt;/b&gt; 긴급도, 높음&amp;middot;보통&amp;middot;낮음 가운데 하나&lt;/li&gt;
&lt;li&gt;&lt;b&gt;summary:&lt;/b&gt; 문의 내용 한 문장&lt;/li&gt;
&lt;li&gt;&lt;b&gt;nextAction:&lt;/b&gt; 상담 담당이 할 일 한 문장&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;06-필드-넷.png&quot; data-origin-width=&quot;2072&quot; data-origin-height=&quot;1278&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ck5loh/dJMcad4V6km/1ZwNUfgkpKnbTpBoIxT680/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ck5loh/dJMcad4V6km/1ZwNUfgkpKnbTpBoIxT680/img.png&quot; data-alt=&quot;필드 넷과 필수 여부&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ck5loh/dJMcad4V6km/1ZwNUfgkpKnbTpBoIxT680/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fck5loh%2FdJMcad4V6km%2F1ZwNUfgkpKnbTpBoIxT680%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; alt=&quot;필드 넷의 이름, 설명, 데이터 유형 String, Required 체크가 강조되어 있다&quot; loading=&quot;lazy&quot; width=&quot;720&quot; height=&quot;444&quot; data-filename=&quot;06-필드-넷.png&quot; data-origin-width=&quot;2072&quot; data-origin-height=&quot;1278&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;필드 넷과 필수 여부&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;div class=&quot;say warn&quot;&gt;&lt;span class=&quot;badge i-alert&quot; aria-hidden=&quot;true&quot;&gt;&lt;/span&gt;
&lt;div&gt;&lt;b&gt;주의&lt;/b&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;저장한 뒤에는 필드 이름과 데이터 유형을 바꿀 수 없고, Required를 끈 필드를 나중에 켤 수도 없습니다. 나중에 더하는 필드는 Required가 꺼진 채로 더해지므로, 반드시 받을 필드는 처음 만들 때 정합니다.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p style=&quot;margin-bottom: 16px !important;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Save&lt;/b&gt;를 누르면 Response Structure 칸에 방금 만든 Lightning Type이 골라집니다. 템플릿을 저장하고 다시 미리 보면, 이번에는 정해 둔 키 넷으로 응답했습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;07-JSON-Type-응답.png&quot; data-origin-width=&quot;2936&quot; data-origin-height=&quot;1856&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cVOgfh/dJMcaikYLXh/sM6UawksHKsbXfJAqnzw4k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cVOgfh/dJMcaikYLXh/sM6UawksHKsbXfJAqnzw4k/img.png&quot; data-alt=&quot;Lightning Type을 고른 뒤의 응답&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cVOgfh/dJMcaikYLXh/sM6UawksHKsbXfJAqnzw4k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcVOgfh%2FdJMcaikYLXh%2FsM6UawksHKsbXfJAqnzw4k%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; alt=&quot;Generated Response에 category, urgency, summary, nextAction 키의 JSON이 강조되어 있다&quot; loading=&quot;lazy&quot; width=&quot;720&quot; height=&quot;455&quot; data-filename=&quot;07-JSON-Type-응답.png&quot; data-origin-width=&quot;2936&quot; data-origin-height=&quot;1856&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Lightning Type을 고른 뒤의 응답&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;margin-bottom: 16px !important;&quot; data-ke-size=&quot;size16&quot;&gt;도움말은 Lightning Type을 고르면 모델이 구조를 정하지 않고 정해 둔 스키마에 값을 채운다고 안내합니다. 이번 미리보기와 뒤의 Debug에서 두 번 모두 키 넷이 같았고, summary 문장은 서로 달랐습니다.&lt;/p&gt;
&lt;p style=&quot;margin-bottom: 16px !important;&quot; data-ke-size=&quot;size16&quot;&gt;같은 문의로 받은 세 응답을 비교하면 아래와 같습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;fig-01.png&quot; data-origin-width=&quot;960&quot; data-origin-height=&quot;1216&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Bd0be/dJMcahsSKXS/Tcp7vRpRJQzJGTqySztQBK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Bd0be/dJMcahsSKXS/Tcp7vRpRJQzJGTqySztQBK/img.png&quot; data-alt=&quot;같은 문의의 형식별 응답&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Bd0be/dJMcahsSKXS/Tcp7vRpRJQzJGTqySztQBK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FBd0be%2FdJMcahsSKXS%2FTcp7vRpRJQzJGTqySztQBK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; alt=&quot;Default는 글머리표 목록, JSON은 모델이 정한 한국어 키, JSON과 Lightning Type을 함께 쓴 응답은 정해 둔 영어 키 넷으로 응답했다는 비교 그림&quot; loading=&quot;lazy&quot; width=&quot;480&quot; height=&quot;608&quot; data-filename=&quot;fig-01.png&quot; data-origin-width=&quot;960&quot; data-origin-height=&quot;1216&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;같은 문의의 형식별 응답&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr data-ke-style=&quot;style5&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;Flow에서 읽기&lt;/h2&gt;
&lt;p style=&quot;font-size: 20px !important; font-weight: bold; line-height: 1.6 !important; color: var(--ink); margin-bottom: 16px !important;&quot; data-ke-size=&quot;size20&quot;&gt;Lightning Type을 고른 템플릿을 Flow에서 부르면 액션 출력에 StructuredResponse가 생기고, 그 필드를 Decision 조건에 바로 씁니다.&lt;/p&gt;
&lt;p style=&quot;font-size: 18px !important; font-weight: bold; line-height: 1.5 !important; color: var(--ink); margin-bottom: 10px !important;&quot; data-ke-size=&quot;size18&quot;&gt;1. 템플릿을 활성화합니다&lt;/p&gt;
&lt;p style=&quot;margin-bottom: 16px !important;&quot; data-ke-size=&quot;size16&quot;&gt;활성화한 버전은 고칠 수 없으므로, 형식과 필드를 확인한 뒤 &lt;b&gt;Activate&lt;/b&gt;를 누릅니다. 나중에 고치려면 새 버전을 만듭니다(&lt;a href=&quot;https://jt98.tistory.com/30&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;AF-05 글&lt;/a&gt;). Flow에서 템플릿을 부르려면 활성 버전이 있어야 합니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;08-활성화.png&quot; data-origin-width=&quot;2936&quot; data-origin-height=&quot;1856&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dlVBLg/dJMcad4V6ks/hEBiMPT1V9iqSxqS4inAN0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dlVBLg/dJMcad4V6ks/hEBiMPT1V9iqSxqS4inAN0/img.png&quot; data-alt=&quot;활성화한 템플릿&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dlVBLg/dJMcad4V6ks/hEBiMPT1V9iqSxqS4inAN0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdlVBLg%2FdJMcad4V6ks%2FhEBiMPT1V9iqSxqS4inAN0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; alt=&quot;Prompt Builder 상단에 Version 1 (Active)가 강조되어 있다&quot; loading=&quot;lazy&quot; width=&quot;720&quot; height=&quot;455&quot; data-filename=&quot;08-활성화.png&quot; data-origin-width=&quot;2936&quot; data-origin-height=&quot;1856&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;활성화한 템플릿&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;font-size: 18px !important; font-weight: bold; line-height: 1.5 !important; color: var(--ink); margin-bottom: 10px !important;&quot; data-ke-size=&quot;size18&quot;&gt;2. Flow에서 템플릿을 부릅니다&lt;/p&gt;
&lt;p style=&quot;margin-bottom: 16px !important;&quot; data-ke-size=&quot;size16&quot;&gt;트리거 없는 Autolaunched Flow를 만들고, Case 레코드 변수를 하나 만들어 &lt;b&gt;Available for input&lt;/b&gt;을 켭니다. &lt;b&gt;Action&lt;/b&gt;에서 Prompt Template 범주의 템플릿을 고르고 Case 입력에 그 변수를 넘깁니다. 이 글의 액션 API 이름은 Classify_Case입니다.&lt;/p&gt;
&lt;p style=&quot;margin-bottom: 16px !important;&quot; data-ke-size=&quot;size16&quot;&gt;액션 설정 창의 &lt;b&gt;View Output Resources&lt;/b&gt;를 보면 &lt;b&gt;Prompt Response&lt;/b&gt;와 함께 &lt;b&gt;StructuredResponse&lt;/b&gt;가 있습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;09a-액션-출력-목록.png&quot; data-origin-width=&quot;2936&quot; data-origin-height=&quot;1856&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/DF85u/dJMcad4V6ku/setgbmgm3eBUXCxMTMFTm0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/DF85u/dJMcad4V6ku/setgbmgm3eBUXCxMTMFTm0/img.png&quot; data-alt=&quot;액션 출력의 StructuredResponse&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/DF85u/dJMcad4V6ku/setgbmgm3eBUXCxMTMFTm0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FDF85u%2FdJMcad4V6ku%2Fsetgbmgm3eBUXCxMTMFTm0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; alt=&quot;액션의 View Output Resources에 Prompt Generation ID, Prompt Response, StructuredResponse가 있고 StructuredResponse가 강조되어 있다&quot; loading=&quot;lazy&quot; width=&quot;720&quot; height=&quot;455&quot; data-filename=&quot;09a-액션-출력-목록.png&quot; data-origin-width=&quot;2936&quot; data-origin-height=&quot;1856&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;액션 출력의 StructuredResponse&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;margin-bottom: 16px !important;&quot; data-ke-size=&quot;size16&quot;&gt;Lightning Type이 없는 템플릿의 액션에는 StructuredResponse가 없었습니다. 도움말의 Flow 액션 문서에는 아직 StructuredResponse가 없으므로, 문서보다 이 출력 목록을 봅니다.&lt;/p&gt;
&lt;p style=&quot;font-size: 18px !important; font-weight: bold; line-height: 1.5 !important; color: var(--ink); margin-bottom: 10px !important;&quot; data-ke-size=&quot;size18&quot;&gt;3. urgency로 분기합니다&lt;/p&gt;
&lt;p style=&quot;margin-bottom: 16px !important;&quot; data-ke-size=&quot;size16&quot;&gt;액션 아래에 &lt;b&gt;Decision&lt;/b&gt;을 더하고 조건의 &lt;b&gt;Resource&lt;/b&gt;를 고릅니다. 액션 출력의 StructuredResponse를 펼치면 Lightning Type의 필드 넷이 보입니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;09-액션-출력-필드.png&quot; data-origin-width=&quot;2936&quot; data-origin-height=&quot;1856&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/eeK9LQ/dJMcad4V6ky/AosdsAKVVkDKsCICHFrw5k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/eeK9LQ/dJMcad4V6ky/AosdsAKVVkDKsCICHFrw5k/img.png&quot; data-alt=&quot;StructuredResponse의 필드&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/eeK9LQ/dJMcad4V6ky/AosdsAKVVkDKsCICHFrw5k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FeeK9LQ%2FdJMcad4V6ky%2FAosdsAKVVkDKsCICHFrw5k%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; alt=&quot;리소스 고르기에서 StructuredResponse 아래 Properties의 category, nextAction, summary, urgency가 강조되어 있다&quot; loading=&quot;lazy&quot; width=&quot;720&quot; height=&quot;455&quot; data-filename=&quot;09-액션-출력-필드.png&quot; data-origin-width=&quot;2936&quot; data-origin-height=&quot;1856&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;StructuredResponse의 필드&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;margin-bottom: 16px !important;&quot; data-ke-size=&quot;size16&quot;&gt;결과(Outcome) 이름은 &quot;긴급도 높음&quot;으로 하고, 조건은 urgency &lt;b&gt;Equals&lt;/b&gt; 높음으로 둡니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;10-Decision-조건.png&quot; data-origin-width=&quot;2936&quot; data-origin-height=&quot;1856&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bMX2UT/dJMcad4V6kz/GdypMBkWM9EHNARHYhDh9K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bMX2UT/dJMcad4V6kz/GdypMBkWM9EHNARHYhDh9K/img.png&quot; data-alt=&quot;urgency 조건&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bMX2UT/dJMcad4V6kz/GdypMBkWM9EHNARHYhDh9K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbMX2UT%2FdJMcad4V6kz%2FGdypMBkWM9EHNARHYhDh9K%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; alt=&quot;Decision의 긴급도 높음 결과에 StructuredResponse의 urgency가 높음과 같다는 조건이 강조되어 있다&quot; loading=&quot;lazy&quot; width=&quot;720&quot; height=&quot;455&quot; data-filename=&quot;10-Decision-조건.png&quot; data-origin-width=&quot;2936&quot; data-origin-height=&quot;1856&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;urgency 조건&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;div class=&quot;say warn&quot;&gt;&lt;span class=&quot;badge i-alert&quot; aria-hidden=&quot;true&quot;&gt;&lt;/span&gt;
&lt;div&gt;&lt;b&gt;주의&lt;/b&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Lightning Type의 Data Type에는 값 목록을 정하는 유형이 없어, 높음&amp;middot;보통&amp;middot;낮음은 지시문과 필드 설명으로만 부탁합니다. 이 Flow의 기본 경로에는 보통&amp;middot;낮음과 함께 모델이 돌려준 다른 값도 들어갑니다. 정해진 값 밖의 응답을 따로 다루려면 보통과 낮음 결과도 만들고, 남는 기본 경로를 &quot;판정하지 못함&quot;으로 둡니다.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p style=&quot;font-size: 18px !important; font-weight: bold; line-height: 1.5 !important; color: var(--ink); margin-bottom: 10px !important;&quot; data-ke-size=&quot;size18&quot;&gt;4. Debug로 확인합니다&lt;/p&gt;
&lt;p style=&quot;margin-bottom: 16px !important;&quot; data-ke-size=&quot;size16&quot;&gt;Flow를 저장하고 &lt;b&gt;Debug&lt;/b&gt;를 누른 뒤 입력 변수에 문의를 골라 실행합니다. 액션 내역의 &lt;b&gt;structuredResponse&lt;/b&gt;에 필드별 값이 보입니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;11-Debug-출력.png&quot; data-origin-width=&quot;2936&quot; data-origin-height=&quot;1856&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bXmjy8/dJMcadcJd3u/nWstkRsmmLCxR5DIuskY2K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bXmjy8/dJMcadcJd3u/nWstkRsmmLCxR5DIuskY2K/img.png&quot; data-alt=&quot;Debug의 structuredResponse&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bXmjy8/dJMcadcJd3u/nWstkRsmmLCxR5DIuskY2K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbXmjy8%2FdJMcadcJd3u%2FnWstkRsmmLCxR5DIuskY2K%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; alt=&quot;Debug 내역의 structuredResponse에 urgency 보통 줄이 강조되어 있다&quot; loading=&quot;lazy&quot; width=&quot;720&quot; height=&quot;455&quot; data-filename=&quot;11-Debug-출력.png&quot; data-origin-width=&quot;2936&quot; data-origin-height=&quot;1856&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Debug의 structuredResponse&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;margin-bottom: 16px !important;&quot; data-ke-size=&quot;size16&quot;&gt;이 문의의 urgency는 &quot;보통&quot;이라, Decision은 긴급도 높음이 아닌 기본 경로를 골랐습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;11c-Decision-결과-글.png&quot; data-origin-width=&quot;2936&quot; data-origin-height=&quot;1856&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bjC3ur/dJMcadcJd3B/Zk7obQzD3FhEsZbjKkkTyk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bjC3ur/dJMcadcJd3B/Zk7obQzD3FhEsZbjKkkTyk/img.png&quot; data-alt=&quot;Decision이 고른 경로&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bjC3ur/dJMcadcJd3B/Zk7obQzD3FhEsZbjKkkTyk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbjC3ur%2FdJMcadcJd3B%2FZk7obQzD3FhEsZbjKkkTyk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; alt=&quot;Decision 내역에 The default outcome was executed 문구가 강조되어 있다&quot; loading=&quot;lazy&quot; width=&quot;720&quot; height=&quot;455&quot; data-filename=&quot;11c-Decision-결과-글.png&quot; data-origin-width=&quot;2936&quot; data-origin-height=&quot;1856&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Decision이 고른 경로&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;font-size: 14px !important; line-height: 1.7 !important; color: var(--muted); margin-bottom: 16px !important;&quot; data-ke-size=&quot;size14&quot;&gt;Debug 내역에는 urgency_set 같은 항목이 함께 보이지만, Flow에서 고를 수 있는 것은 필드 넷입니다.&lt;/p&gt;
&lt;div data-ke-type=&quot;moreLess&quot; data-text-more=&quot;그림으로 쉽게 보는 요약 보기&quot; data-text-less=&quot;닫기&quot;&gt;&lt;a class=&quot;btn-toggle-moreless&quot;&gt;더보기&lt;/a&gt;
&lt;div class=&quot;moreless-content&quot;&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;eli5-01.png&quot; data-origin-width=&quot;1440&quot; data-origin-height=&quot;4494&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bG3dNC/dJMcahsSKX8/Skn3mjyk0v2R02u923dNHK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bG3dNC/dJMcahsSKX8/Skn3mjyk0v2R02u923dNHK/img.png&quot; data-alt=&quot;그림으로 쉽게 보는 요약&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bG3dNC/dJMcahsSKX8/Skn3mjyk0v2R02u923dNHK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbG3dNC%2FdJMcahsSKX8%2FSkn3mjyk0v2R02u923dNHK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; alt=&quot;응답 형식을 정하지 않으면 모양이 제각각이고, JSON으로 바꿔도 키는 모델이 정하며, Lightning Type으로 칸 넷을 정하면 Flow가 StructuredResponse의 urgency를 읽어 Decision이 분기하는 네 장면 요약&quot; loading=&quot;lazy&quot; width=&quot;720&quot; height=&quot;2247&quot; data-filename=&quot;eli5-01.png&quot; data-origin-width=&quot;1440&quot; data-origin-height=&quot;4494&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;그림으로 쉽게 보는 요약&lt;/figcaption&gt;
&lt;/figure&gt;

&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p style=&quot;margin-bottom: 16px !important;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;참고 문서&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;a href=&quot;https://help.salesforce.com/s/articleView?id=ai.prompt_builder_use_structured_outputs_responses.htm&amp;amp;type=5&amp;amp;language=en_US&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Use Structured Outputs to Format Model Responses&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://help.salesforce.com/s/articleView?id=ai.prompt_builder_configure_response.htm&amp;amp;type=5&amp;amp;language=en_US&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Configure the Generated Response Format&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://help.salesforce.com/s/articleView?id=ai.prompt_builder_create_object_based_lt.htm&amp;amp;type=5&amp;amp;language=en_US&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Create an Object-Based Lightning Type&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://help.salesforce.com/s/articleView?id=ai.prompt_builder_activate_deactivate_templates.htm&amp;amp;type=5&amp;amp;language=en_US&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Activate and Deactivate Prompt Templates&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://help.salesforce.com/s/articleView?id=platform.flow_ref_elements_actions_generate_prompt_response.htm&amp;amp;type=5&amp;amp;language=en_US&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Flow Core Action: Prompt Template Actions&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://help.salesforce.com/s/articleView?id=ai.prompt_builder_manage_object_types.htm&amp;amp;type=5&amp;amp;language=en_US&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Manage Changes to Object-Based Types&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>Salesforce/Agentforce</category>
      <category>Agentforce</category>
      <category>flow</category>
      <category>Lightning Type</category>
      <category>Prompt Builder</category>
      <category>Structured Outputs</category>
      <author>Luka.dev</author>
      <guid isPermaLink="true">https://jt98.tistory.com/37</guid>
      <comments>https://jt98.tistory.com/37#entry37comment</comments>
      <pubDate>Fri, 16 Oct 2026 15:51:06 +0900</pubDate>
    </item>
    <item>
      <title>Agentforce | Flow 병합 필드로 열린 문의 데이터를 프롬프트에 반영하는법</title>
      <link>https://jt98.tistory.com/36</link>
      <description>&lt;div class=&quot;greeting&quot;&gt;
&lt;p style=&quot;line-height: 1.8 !important; margin: 0 0 0px !important;&quot; data-ke-size=&quot;size16&quot;&gt;안녕하세요, 루카입니다. 오늘은 Flow로 연락처의 열린 문의만 골라, 문의 내용과 함께 프롬프트 템플릿에 넣어 보겠습니다.&lt;/p&gt;
&lt;/div&gt;
&lt;hr data-ke-style=&quot;style5&quot; /&gt;
&lt;div class=&quot;lead-box&quot; style=&quot;background: color-mix(in srgb, var(--brand) 7%, transparent); border-top: 4px solid var(--brand); border-radius: 10px; padding: 18px 24px 16px; margin: 8px 0 28px;&quot;&gt;
&lt;p style=&quot;font-size: 20px !important; font-weight: bold; line-height: 1.55 !important; color: var(--ink); margin: 0 0 8px !important;&quot; data-ke-size=&quot;size16&quot;&gt;Template-Triggered Prompt Flow는 프롬프트 템플릿이 실행될 때마다 함께 실행되어, Flow가 만든 지시문을 템플릿에 넣어 주는 Flow입니다.&lt;/p&gt;
&lt;p style=&quot;font-size: 16px !important; line-height: 1.7 !important; margin: 0 0 4px !important;&quot; data-ke-size=&quot;size16&quot;&gt;관련 목록 병합 필드에는 닫힌 문의도 들어가고 페이지 레이아웃에 있는 열만 담기므로, 열린 문의의 내용(Description)까지 넣으려면 Flow로 직접 골라야 합니다.&lt;/p&gt;
&lt;/div&gt;
&lt;p style=&quot;margin-bottom: 16px !important;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;준비할 것&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;템플릿과 요약 필드:&lt;/b&gt; 연락처의 요약 필드에 붙여 쓰는 Field Generation 템플릿이 있어야 합니다. 이 글은 &lt;a href=&quot;https://jt98.tistory.com/29&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;AF-04 글&lt;/a&gt;에서 만든 템플릿의 새 버전을 만듭니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;권한:&lt;/b&gt; Flow를 만들려면 Manage Flow 권한이, 템플릿을 고치려면 Prompt Template Manager 권한 집합(또는 Customize Application 권한)이 필요합니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;시험 데이터:&lt;/b&gt; 열린 문의와 닫힌 문의가 함께 연결된 연락처를 하나 준비합니다. 열린 문의의 Description에는 제목에 없는 내용을 적어 둡니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p style=&quot;margin-bottom: 16px !important;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;완료 확인:&lt;/b&gt; 연락처 화면에서 받은 요약 초안에 열린 문의의 Description 내용이 들어 있고 닫힌 문의가 없으면 끝입니다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;Flow 만들기&lt;/h2&gt;
&lt;p style=&quot;font-size: 20px !important; font-weight: bold; line-height: 1.6 !important; color: var(--ink); margin-bottom: 16px !important;&quot; data-ke-size=&quot;size20&quot;&gt;Flow는 템플릿이 넘긴 연락처로 열린 문의를 조회하고, Add Prompt Instructions 요소로 문의마다 상태&amp;middot;제목&amp;middot;내용을 한 줄씩 씁니다.&lt;/p&gt;
&lt;p style=&quot;font-size: 18px !important; font-weight: bold; line-height: 1.5 !important; color: var(--ink); margin-bottom: 10px !important;&quot; data-ke-size=&quot;size18&quot;&gt;1. Template-Triggered Prompt Flow를 만듭니다&lt;/p&gt;
&lt;p style=&quot;margin-bottom: 16px !important;&quot; data-ke-size=&quot;size16&quot;&gt;Setup의 &lt;b&gt;Flows&lt;/b&gt;에서 &lt;b&gt;New Flow&lt;/b&gt;를 누르고, &lt;b&gt;Autolaunched&lt;/b&gt; 범주에서 &lt;b&gt;Template-Triggered Prompt Flow&lt;/b&gt; 카드를 고른 뒤 &lt;b&gt;Create&lt;/b&gt;를 누릅니다. 템플릿에 넣을 수 있는 Flow는 이 유형뿐입니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;01-flow-유형.png&quot; data-origin-width=&quot;2936&quot; data-origin-height=&quot;1856&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/brPsT0/dJMcahfnC1i/ZZuJyUsS25qFVdMZ8HJOo1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/brPsT0/dJMcahfnC1i/ZZuJyUsS25qFVdMZ8HJOo1/img.png&quot; data-alt=&quot;Template-Triggered Prompt Flow 카드&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/brPsT0/dJMcahfnC1i/ZZuJyUsS25qFVdMZ8HJOo1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbrPsT0%2FdJMcahfnC1i%2FZZuJyUsS25qFVdMZ8HJOo1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; alt=&quot;New Flow 창에서 Template-Triggered Prompt Flow 카드가 강조되어 있다&quot; loading=&quot;lazy&quot; width=&quot;720&quot; height=&quot;455&quot; data-filename=&quot;01-flow-유형.png&quot; data-origin-width=&quot;2936&quot; data-origin-height=&quot;1856&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Template-Triggered Prompt Flow 카드&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;font-size: 18px !important; font-weight: bold; line-height: 1.5 !important; color: var(--ink); margin-bottom: 10px !important;&quot; data-ke-size=&quot;size18&quot;&gt;2. Start에서 템플릿 유형과 오브젝트를 고릅니다&lt;/p&gt;
&lt;p style=&quot;margin-bottom: 16px !important;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Select Input Type&lt;/b&gt;에서 &lt;b&gt;Automatic Inputs&lt;/b&gt;를 고르고, &lt;b&gt;Prompt Template Type&lt;/b&gt;은 &lt;b&gt;Field Generation Template Capability&lt;/b&gt;, &lt;b&gt;Object&lt;/b&gt;는 Contact를 고릅니다. 목록에 같은 이름이 두 줄 있으면 Object 칸이 나타나는 첫 줄을 고릅니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;02-start-설정.png&quot; data-origin-width=&quot;2936&quot; data-origin-height=&quot;1856&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dJs236/dJMcaiekN1h/9jQmFScTHUhqtqcFFTgLeK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dJs236/dJMcaiekN1h/9jQmFScTHUhqtqcFFTgLeK/img.png&quot; data-alt=&quot;Start의 입력 유형, 템플릿 유형, 오브젝트&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dJs236/dJMcaiekN1h/9jQmFScTHUhqtqcFFTgLeK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdJs236%2FdJMcaiekN1h%2F9jQmFScTHUhqtqcFFTgLeK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; alt=&quot;Start 창에서 Automatic Inputs, Field Generation Template Capability, Object Contact가 번호로 강조되어 있다&quot; loading=&quot;lazy&quot; width=&quot;720&quot; height=&quot;455&quot; data-filename=&quot;02-start-설정.png&quot; data-origin-width=&quot;2936&quot; data-origin-height=&quot;1856&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Start의 입력 유형, 템플릿 유형, 오브젝트&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;margin-bottom: 16px !important;&quot; data-ke-size=&quot;size16&quot;&gt;Object가 템플릿의 오브젝트와 같아야 이 Flow를 템플릿에 넣을 수 있습니다. 이렇게 고르면 템플릿이 넘긴 연락처를 Flow 안에서 &lt;b&gt;Prompt Template Input&lt;/b&gt;으로 읽습니다.&lt;/p&gt;
&lt;div class=&quot;say warn&quot;&gt;&lt;span class=&quot;badge i-alert&quot; aria-hidden=&quot;true&quot;&gt;&lt;/span&gt;
&lt;div&gt;&lt;b&gt;주의&lt;/b&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;샌드박스에서 만들어 다른 org로 배포할 계획이면 Automatic Inputs 대신 Manual Inputs로 만듭니다. 도움말은 Automatic Inputs Flow를 참조하는 템플릿은 배포에 실패한다고 안내합니다.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p style=&quot;font-size: 18px !important; font-weight: bold; line-height: 1.5 !important; color: var(--ink); margin-bottom: 10px !important;&quot; data-ke-size=&quot;size18&quot;&gt;3. 연락처의 열린 문의를 조회합니다&lt;/p&gt;
&lt;p style=&quot;margin-bottom: 16px !important;&quot; data-ke-size=&quot;size16&quot;&gt;Start 아래에 &lt;b&gt;Get Records&lt;/b&gt;를 더하고 Object는 Case를 고릅니다. 이 글에서는 라벨을 &quot;열린 문의 조회&quot;, API 이름을 Get_Open_Cases로 했습니다. 조건은 두 줄입니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;Contact ID&lt;/b&gt; Equals &lt;b&gt;Prompt Template Input &amp;gt; Contact &amp;gt; Contact ID&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Closed&lt;/b&gt; Equals &lt;b&gt;False&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p style=&quot;margin-bottom: 16px !important;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;How Many Records to Store&lt;/b&gt;는 &lt;b&gt;All records&lt;/b&gt;를 고릅니다. &lt;b&gt;How to Store Record Data&lt;/b&gt;를 &lt;b&gt;Automatically store all fields&lt;/b&gt;로 두면 Description도 함께 저장됩니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;03-열린-문의-조회.png&quot; data-origin-width=&quot;2936&quot; data-origin-height=&quot;1856&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bphWED/dJMcahfnC1m/KUVuvVbpFXkkBbT4g1gW7K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bphWED/dJMcahfnC1m/KUVuvVbpFXkkBbT4g1gW7K/img.png&quot; data-alt=&quot;열린 문의 조회 조건&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bphWED/dJMcahfnC1m/KUVuvVbpFXkkBbT4g1gW7K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbphWED%2FdJMcahfnC1m%2FKUVuvVbpFXkkBbT4g1gW7K%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; alt=&quot;Get Records의 조건 두 줄과 All records가 번호로 강조되어 있다&quot; loading=&quot;lazy&quot; width=&quot;720&quot; height=&quot;455&quot; data-filename=&quot;03-열린-문의-조회.png&quot; data-origin-width=&quot;2936&quot; data-origin-height=&quot;1856&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;열린 문의 조회 조건&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;margin-bottom: 16px !important;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Closed&lt;/b&gt;는 문의가 닫혔는지 나타내는 표준 필드라, 닫힌 상태의 이름을 몰라도 거를 수 있습니다.&lt;/p&gt;
&lt;p style=&quot;font-size: 18px !important; font-weight: bold; line-height: 1.5 !important; color: var(--ink); margin-bottom: 10px !important;&quot; data-ke-size=&quot;size18&quot;&gt;4. 문의마다 지시문을 한 줄씩 씁니다&lt;/p&gt;
&lt;p style=&quot;margin-bottom: 16px !important;&quot; data-ke-size=&quot;size16&quot;&gt;Get Records 아래에 &lt;b&gt;Decision&lt;/b&gt;을 더합니다. Yes 결과(Outcome)에는 Get Records로 조회한 문의 목록이 &lt;b&gt;Is Null&lt;/b&gt; False라는 조건을 둡니다. 기본 결과(Default Outcome)의 이름은 No로 바꿉니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;No 경로:&lt;/b&gt; &lt;b&gt;Add Prompt Instructions&lt;/b&gt; 요소를 더하고 &lt;b&gt;Prompt Instructions&lt;/b&gt; 칸에 &quot;열린 문의가 없습니다.&quot;를 씁니다. 열린 문의가 없어도 병합 필드가 비지 않게 합니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Yes 경로:&lt;/b&gt; 조회한 문의 목록을 도는 &lt;b&gt;Loop&lt;/b&gt;를 더하고, &lt;b&gt;For Each&lt;/b&gt; 경로에 Add Prompt Instructions 요소를 하나 더 둡니다. 이 글의 Loop는 라벨 &quot;문의마다&quot;, API 이름 Each_Case입니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p style=&quot;margin-bottom: 16px !important;&quot; data-ke-size=&quot;size16&quot;&gt;Loop 안의 요소에는 &lt;b&gt;Resource Picker&lt;/b&gt;로 현재 문의의 필드를 넣어 아래 한 줄을 씁니다. Each_Case 자리에는 직접 지은 Loop의 API 이름이 들어갑니다. 화면 폭에 맞춰 줄을 나눴고, 실제로는 한 줄입니다.&lt;/p&gt;
&lt;pre id=&quot;code_1&quot; class=&quot;plaintext&quot; data-ke-language=&quot;plaintext&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;- {!Each_Case.Status}:
{!Each_Case.Subject} /
{!Each_Case.Description}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;04-지시문-쓰기.png&quot; data-origin-width=&quot;2936&quot; data-origin-height=&quot;1856&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b3q9Td/dJMcahfnC1p/kz6gpQKAYz8Yfc8ovXT7DK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b3q9Td/dJMcahfnC1p/kz6gpQKAYz8Yfc8ovXT7DK/img.png&quot; data-alt=&quot;Loop 안의 지시문&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b3q9Td/dJMcahfnC1p/kz6gpQKAYz8Yfc8ovXT7DK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb3q9Td%2FdJMcahfnC1p%2Fkz6gpQKAYz8Yfc8ovXT7DK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; alt=&quot;Add Prompt Instructions 창의 Prompt Instructions 칸에 상태, 제목, 내용 병합 필드가 든 지시문이 강조되어 있다&quot; loading=&quot;lazy&quot; width=&quot;720&quot; height=&quot;455&quot; data-filename=&quot;04-지시문-쓰기.png&quot; data-origin-width=&quot;2936&quot; data-origin-height=&quot;1856&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Loop 안의 지시문&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;margin-bottom: 16px !important;&quot; data-ke-size=&quot;size16&quot;&gt;Loop가 돌 때마다 이 요소가 실행되어 앞의 글 뒤에 한 줄씩 이어 붙습니다. Flow가 끝나면 모인 글이 템플릿으로 넘어갑니다. 이번 미리보기에서는 문의 사이에 줄바꿈이 저절로 들어가, 줄바꿈을 따로 넣지 않았습니다.&lt;/p&gt;
&lt;p style=&quot;font-size: 18px !important; font-weight: bold; line-height: 1.5 !important; color: var(--ink); margin-bottom: 10px !important;&quot; data-ke-size=&quot;size18&quot;&gt;5. Debug로 확인하고 활성화합니다&lt;/p&gt;
&lt;p style=&quot;margin-bottom: 16px !important;&quot; data-ke-size=&quot;size16&quot;&gt;저장한 뒤 &lt;b&gt;Debug&lt;/b&gt;를 누르고 &lt;b&gt;RelatedEntity&lt;/b&gt; 칸에서 연락처를 골라 실행합니다. 결과의 &lt;b&gt;$Output.Prompt&lt;/b&gt;에 열린 문의 두 건이 차례로 쌓였는지 봅니다. Debug 화면에서는 두 건이 한 문단으로 이어져 보입니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;05b-debug-출력.png&quot; data-origin-width=&quot;2936&quot; data-origin-height=&quot;1856&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/rtSXp/dJMcahfnC1r/JmYt6lSF6bNC1xBCIaU7gk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/rtSXp/dJMcahfnC1r/JmYt6lSF6bNC1xBCIaU7gk/img.png&quot; data-alt=&quot;Debug 결과의 지시문&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/rtSXp/dJMcahfnC1r/JmYt6lSF6bNC1xBCIaU7gk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FrtSXp%2FdJMcahfnC1r%2FJmYt6lSF6bNC1xBCIaU7gk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; alt=&quot;Debug 패널에서 Output.Prompt의 결과에 열린 문의 두 건의 상태, 제목, 내용이 강조되어 있다&quot; loading=&quot;lazy&quot; width=&quot;720&quot; height=&quot;455&quot; data-filename=&quot;05b-debug-출력.png&quot; data-origin-width=&quot;2936&quot; data-origin-height=&quot;1856&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Debug 결과의 지시문&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;margin-bottom: 16px !important;&quot; data-ke-size=&quot;size16&quot;&gt;Debug는 Flow만 실행하고 LLM은 부르지 않습니다. 내역에서는 Add Prompt Instructions 요소가 Assignment로 표시됩니다.&lt;/p&gt;
&lt;p style=&quot;margin-bottom: 16px !important;&quot; data-ke-size=&quot;size16&quot;&gt;Prompt Builder에는 활성 Flow만 보이므로, 확인이 끝나면 &lt;b&gt;Activate&lt;/b&gt;를 누릅니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;05-완성된-flow.png&quot; data-origin-width=&quot;2936&quot; data-origin-height=&quot;1856&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dDWCAN/dJMcahl98Kv/LZhKMUnUMZdh7EO3exlHLK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dDWCAN/dJMcahl98Kv/LZhKMUnUMZdh7EO3exlHLK/img.png&quot; data-alt=&quot;활성화한 Flow&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dDWCAN/dJMcahl98Kv/LZhKMUnUMZdh7EO3exlHLK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdDWCAN%2FdJMcahl98Kv%2FLZhKMUnUMZdh7EO3exlHLK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; alt=&quot;완성된 Flow 캔버스에 Get Records, Decision, Loop, Add Prompt Instructions 둘이 있고 Active 표시가 강조되어 있다&quot; loading=&quot;lazy&quot; width=&quot;720&quot; height=&quot;455&quot; data-filename=&quot;05-완성된-flow.png&quot; data-origin-width=&quot;2936&quot; data-origin-height=&quot;1856&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;활성화한 Flow&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr data-ke-style=&quot;style5&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;템플릿에 넣기&lt;/h2&gt;
&lt;p style=&quot;font-size: 20px !important; font-weight: bold; line-height: 1.6 !important; color: var(--ink); margin-bottom: 16px !important;&quot; data-ke-size=&quot;size20&quot;&gt;쓰던 템플릿은 새 버전을 만들어, 관련 목록 병합 필드를 지우고 그 자리에 Flow 병합 필드를 넣습니다.&lt;/p&gt;
&lt;p style=&quot;font-size: 18px !important; font-weight: bold; line-height: 1.5 !important; color: var(--ink); margin-bottom: 10px !important;&quot; data-ke-size=&quot;size18&quot;&gt;1. 새 버전을 만듭니다&lt;/p&gt;
&lt;p style=&quot;margin-bottom: 16px !important;&quot; data-ke-size=&quot;size16&quot;&gt;활성 버전은 고칠 수 없으므로 새 버전에서 고칩니다(&lt;a href=&quot;https://jt98.tistory.com/30&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;AF-05 글&lt;/a&gt;). Prompt Builder에서 템플릿을 열고 &lt;b&gt;Save As&lt;/b&gt; 메뉴의 &lt;b&gt;Save as a New Version&lt;/b&gt;을 누릅니다. 누르는 즉시 새 버전(이 글에서는 버전 3)이 저장되고 편집 화면도 그 버전으로 바뀝니다.&lt;/p&gt;
&lt;p style=&quot;font-size: 18px !important; font-weight: bold; line-height: 1.5 !important; color: var(--ink); margin-bottom: 10px !important;&quot; data-ke-size=&quot;size18&quot;&gt;2. 관련 목록 병합 필드를 Flow로 바꿉니다&lt;/p&gt;
&lt;p style=&quot;margin-bottom: 16px !important;&quot; data-ke-size=&quot;size16&quot;&gt;템플릿 지시문에서 &lt;b&gt;Related List:Contact.Cases&lt;/b&gt; 병합 필드를 지웁니다. 그 자리에서 &lt;b&gt;Insert Resource&lt;/b&gt;를 누르거나 @를 친 뒤, &lt;b&gt;Flows&lt;/b&gt;에서 방금 활성화한 Flow를 고릅니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;06-flows-목록.png&quot; data-origin-width=&quot;2936&quot; data-origin-height=&quot;1856&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/p75S0/dJMcabF0Ubi/KVia5U02htI1B3mLX4WIL1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/p75S0/dJMcabF0Ubi/KVia5U02htI1B3mLX4WIL1/img.png&quot; data-alt=&quot;Flows 목록의 새 Flow&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/p75S0/dJMcabF0Ubi/KVia5U02htI1B3mLX4WIL1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fp75S0%2FdJMcabF0Ubi%2FKVia5U02htI1B3mLX4WIL1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; alt=&quot;지시문의 @ 메뉴에서 Flows 아래 LUKA_028 열린 문의 가져오기가 강조되어 있다&quot; loading=&quot;lazy&quot; width=&quot;720&quot; height=&quot;455&quot; data-filename=&quot;06-flows-목록.png&quot; data-origin-width=&quot;2936&quot; data-origin-height=&quot;1856&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Flows 목록의 새 Flow&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;font-size: 18px !important; font-weight: bold; line-height: 1.5 !important; color: var(--ink); margin-bottom: 10px !important;&quot; data-ke-size=&quot;size18&quot;&gt;3. 지시문을 고치고 저장합니다&lt;/p&gt;
&lt;p style=&quot;margin-bottom: 16px !important;&quot; data-ke-size=&quot;size16&quot;&gt;Flow가 닫힌 문의를 이미 걸렀으므로 &quot;상태가 Closed 인 문의는 빼고 씁니다.&quot; 줄을 지웁니다. '- 상태: 제목' 형식으로 한 줄씩 쓰라던 줄은 내용 한 문장을 더하도록 바꾸고 &lt;b&gt;Save&lt;/b&gt;를 누릅니다.&lt;/p&gt;
&lt;pre id=&quot;code_2&quot; class=&quot;plaintext&quot; data-ke-language=&quot;plaintext&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;당신은 온라인 학원의
상담 담당자입니다.
아래 수강생의 문의 목록을
읽고, 아직 닫히지 않은
문의를 한 문단으로
요약하세요.

문의 목록: (Flow)

지시:
- 한국어로 300자 이내로
  씁니다.
- 문의마다 '- 상태: 제목'
  한 줄을 쓰고, 다음 줄에
  문의 내용을 한 문장으로
  줄여 씁니다.
- 제목 앞의 LUKA_ 는
  쓰지 않습니다.
- 목록에 없는 내용은
  지어내지 않습니다.&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;margin-bottom: 16px !important;&quot; data-ke-size=&quot;size16&quot;&gt;화면 폭에 맞춰 줄을 나눴습니다. LUKA_ 줄은 시험 데이터의 제목 앞 글자를 빼려고 넣은 줄입니다.&lt;/p&gt;
&lt;p style=&quot;margin-bottom: 16px !important;&quot; data-ke-size=&quot;size16&quot;&gt;&quot;(Flow)&quot; 자리에는 Flows:LUKA_028 열린 문의 가져오기 병합 필드가 들어갑니다. 버전 3은 저장만 했으므로 아직 비활성입니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;07-버전3-지시문.png&quot; data-origin-width=&quot;2936&quot; data-origin-height=&quot;1856&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/csAktY/dJMcahfnC1y/a36R43o92heBwKaQphdhaK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/csAktY/dJMcahfnC1y/a36R43o92heBwKaQphdhaK/img.png&quot; data-alt=&quot;버전 3의 지시문&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/csAktY/dJMcahfnC1y/a36R43o92heBwKaQphdhaK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcsAktY%2FdJMcahfnC1y%2Fa36R43o92heBwKaQphdhaK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; alt=&quot;버전 3 편집 화면의 지시문에 Flow 병합 필드가 있고, 버전 목록에서 Version 2가 Active, Version 3이 선택되어 있다&quot; loading=&quot;lazy&quot; width=&quot;720&quot; height=&quot;455&quot; data-filename=&quot;07-버전3-지시문.png&quot; data-origin-width=&quot;2936&quot; data-origin-height=&quot;1856&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;버전 3의 지시문&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;div class=&quot;say warn&quot;&gt;&lt;span class=&quot;badge i-alert&quot; aria-hidden=&quot;true&quot;&gt;&lt;/span&gt;
&lt;div&gt;&lt;b&gt;주의&lt;/b&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;템플릿이 참조하는 Flow의 입력(예: Start의 입력 유형과 오브젝트)을 바꾸지 않습니다. 도움말은 입력을 바꾸면 템플릿이 동작하지 않고 새 버전도 저장할 수 없다고 안내합니다.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;hr data-ke-style=&quot;style5&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;미리보기 비교&lt;/h2&gt;
&lt;p style=&quot;font-size: 20px !important; font-weight: bold; line-height: 1.6 !important; color: var(--ink); margin-bottom: 16px !important;&quot; data-ke-size=&quot;size20&quot;&gt;미리보기의 Resolved Prompt에는 Flow가 쓴 글이 그대로 들어가므로, 열린 문의만 내용과 함께 있는지 여기서 확인합니다.&lt;/p&gt;
&lt;p style=&quot;margin-bottom: 16px !important;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Preview Settings&lt;/b&gt;에서 &lt;b&gt;Resolved Prompt&lt;/b&gt;를 체크하고 &lt;b&gt;Generate Response&lt;/b&gt;를 끈 뒤, 연락처를 골라 &lt;b&gt;Preview&lt;/b&gt;를 누릅니다. Generate Response를 끄면 LLM을 부르지 않고 템플릿에 들어간 글만 보여 줍니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;08-resolved-prompt.png&quot; data-origin-width=&quot;2936&quot; data-origin-height=&quot;1856&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/eD32VE/dJMcahGhPCw/60DkHLlNhcGv7aD7DdyPsK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/eD32VE/dJMcahGhPCw/60DkHLlNhcGv7aD7DdyPsK/img.png&quot; data-alt=&quot;버전 3의 Resolved Prompt&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/eD32VE/dJMcahGhPCw/60DkHLlNhcGv7aD7DdyPsK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FeD32VE%2FdJMcahGhPCw%2F60DkHLlNhcGv7aD7DdyPsK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; alt=&quot;Resolved Prompt의 문의 목록 자리에 New와 Working 문의 두 건이 상태, 제목, 내용과 함께 들어간 부분이 강조되어 있다&quot; loading=&quot;lazy&quot; width=&quot;720&quot; height=&quot;455&quot; data-filename=&quot;08-resolved-prompt.png&quot; data-origin-width=&quot;2936&quot; data-origin-height=&quot;1856&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;버전 3의 Resolved Prompt&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;margin-bottom: 16px !important;&quot; data-ke-size=&quot;size16&quot;&gt;같은 연락처를 버전 2(관련 목록)로 미리 본 결과와 견주면 아래와 같습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;fig-01.png&quot; data-origin-width=&quot;960&quot; data-origin-height=&quot;960&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/whECZ/dJMcaf2GSB2/5uUOGM3sbKca0P7VHct2Kk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/whECZ/dJMcaf2GSB2/5uUOGM3sbKca0P7VHct2Kk/img.png&quot; data-alt=&quot;관련 목록과 Flow의 비교&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/whECZ/dJMcaf2GSB2/5uUOGM3sbKca0P7VHct2Kk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FwhECZ%2FdJMcaf2GSB2%2F5uUOGM3sbKca0P7VHct2Kk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; alt=&quot;버전 2는 문의 네 건이 JSON으로 들어가 닫힌 문의가 섞이고 Description이 없으며, 버전 3은 열린 문의 두 건만 상태, 제목, Description과 함께 들어간다는 비교 그림&quot; loading=&quot;lazy&quot; width=&quot;480&quot; height=&quot;480&quot; data-filename=&quot;fig-01.png&quot; data-origin-width=&quot;960&quot; data-origin-height=&quot;960&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;관련 목록과 Flow의 비교&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;font-size: 14px !important; line-height: 1.7 !important; color: var(--muted); margin-bottom: 16px !important;&quot; data-ke-size=&quot;size14&quot;&gt;관련 목록 병합 필드는 레코드를 거르지 않으므로, 페이지 레이아웃에 열을 더해도 닫힌 문의는 함께 들어갑니다. 이번 org의 Contact Layout에서는 Cases 관련 목록의 열 후보에 Description이 없었습니다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style5&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;활성화와 확인&lt;/h2&gt;
&lt;p style=&quot;font-size: 20px !important; font-weight: bold; line-height: 1.6 !important; color: var(--ink); margin-bottom: 16px !important;&quot; data-ke-size=&quot;size20&quot;&gt;버전 3을 활성화하면 페이지 설정을 바꾸지 않아도, 연락처 화면에서 받은 초안의 근거로 문의 내용이 들어갑니다.&lt;/p&gt;
&lt;p style=&quot;font-size: 18px !important; font-weight: bold; line-height: 1.5 !important; color: var(--ink); margin-bottom: 10px !important;&quot; data-ke-size=&quot;size18&quot;&gt;1. 버전 3을 활성화합니다&lt;/p&gt;
&lt;p style=&quot;margin-bottom: 16px !important;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Activate&lt;/b&gt;를 누르면 버전 3이 활성이 되고 버전 2는 비활성이 됩니다. 첫 클릭에 &quot;Select a model.&quot; 오류가 나면 한 번 더 누릅니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;09-버전3-활성화.png&quot; data-origin-width=&quot;2936&quot; data-origin-height=&quot;1856&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bMPLdh/dJMcahfnC1N/XRqRuwLsKsMcwskIP2Wjv1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bMPLdh/dJMcahfnC1N/XRqRuwLsKsMcwskIP2Wjv1/img.png&quot; data-alt=&quot;활성화한 버전 3&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bMPLdh/dJMcahfnC1N/XRqRuwLsKsMcwskIP2Wjv1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbMPLdh%2FdJMcahfnC1N%2FXRqRuwLsKsMcwskIP2Wjv1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; alt=&quot;Prompt Builder 머리에 Version 3 (Active)가 강조되어 있다&quot; loading=&quot;lazy&quot; width=&quot;720&quot; height=&quot;455&quot; data-filename=&quot;09-버전3-활성화.png&quot; data-origin-width=&quot;2936&quot; data-origin-height=&quot;1856&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;활성화한 버전 3&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;font-size: 18px !important; font-weight: bold; line-height: 1.5 !important; color: var(--ink); margin-bottom: 10px !important;&quot; data-ke-size=&quot;size18&quot;&gt;2. 연락처 화면에서 초안을 받습니다&lt;/p&gt;
&lt;p style=&quot;margin-bottom: 16px !important;&quot; data-ke-size=&quot;size16&quot;&gt;연락처 화면에서 요약 필드의 연필 아이콘을 누르고, 입력칸 오른쪽의 별 모양 아이콘을 누릅니다. 첫 클릭에 패널만 열리면 아이콘을 한 번 더 누릅니다. 초안이 나오면 &lt;b&gt;Use&lt;/b&gt;를 누른 뒤 &lt;b&gt;Save&lt;/b&gt;를 누릅니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;10-완료-확인-초안.png&quot; data-origin-width=&quot;2936&quot; data-origin-height=&quot;1856&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bcOG7e/dJMcahGhPCW/OgWXbsKjEQuba4XXvHT7x0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bcOG7e/dJMcahGhPCW/OgWXbsKjEQuba4XXvHT7x0/img.png&quot; data-alt=&quot;문의 내용이 들어간 초안&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bcOG7e/dJMcahGhPCW/OgWXbsKjEQuba4XXvHT7x0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbcOG7e%2FdJMcahGhPCW%2FOgWXbsKjEQuba4XXvHT7x0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; alt=&quot;Einstein 패널의 초안에 강남지점, 택배사 조회, 대전 물류센터 같은 문의 내용이 들어 있고 Use 단추가 번호로 강조되어 있다&quot; loading=&quot;lazy&quot; width=&quot;720&quot; height=&quot;455&quot; data-filename=&quot;10-완료-확인-초안.png&quot; data-origin-width=&quot;2936&quot; data-origin-height=&quot;1856&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;문의 내용이 들어간 초안&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;margin-bottom: 16px !important;&quot; data-ke-size=&quot;size16&quot;&gt;이번 초안에는 &quot;강남지점&quot;과 &quot;대전 물류센터에서 멈춰 있어&quot; 같은 Description의 내용이 들어갔습니다. 닫힌 문의는 없었습니다.&lt;/p&gt;
&lt;p style=&quot;font-size: 14px !important; line-height: 1.7 !important; color: var(--muted); margin-bottom: 16px !important;&quot; data-ke-size=&quot;size14&quot;&gt;이번 초안은 형식 줄의 '상태'를 New, Working 같은 값으로 바꾸지 않고 글자 그대로 썼습니다. 응답 형식을 고정하는 방법은 별도 글에서 다룰 예정입니다.&lt;/p&gt;
&lt;div data-ke-type=&quot;moreLess&quot; data-text-more=&quot;그림으로 쉽게 보는 요약 보기&quot; data-text-less=&quot;닫기&quot;&gt;&lt;a class=&quot;btn-toggle-moreless&quot;&gt;더보기&lt;/a&gt;
&lt;div class=&quot;moreless-content&quot;&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;eli5-01.png&quot; data-origin-width=&quot;1440&quot; data-origin-height=&quot;4964&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ckYp1U/dJMcaiFfNmW/XKUN97sf2gXWUKKFwfHGdK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ckYp1U/dJMcaiFfNmW/XKUN97sf2gXWUKKFwfHGdK/img.png&quot; data-alt=&quot;그림으로 쉽게 보는 요약&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ckYp1U/dJMcaiFfNmW/XKUN97sf2gXWUKKFwfHGdK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FckYp1U%2FdJMcaiFfNmW%2FXKUN97sf2gXWUKKFwfHGdK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; alt=&quot;관련 목록은 닫힌 문의까지 담고 내용이 빠지며, Flow가 열린 문의만 골라 한 줄씩 쓰고, 새 버전의 템플릿에서 관련 목록을 Flow로 바꾸면 미리보기에 열린 문의 2건이 내용과 함께 들어가고, 버전 3을 켜 연락처 초안에서 확인하는 다섯 장면 요약&quot; loading=&quot;lazy&quot; width=&quot;720&quot; height=&quot;2482&quot; data-filename=&quot;eli5-01.png&quot; data-origin-width=&quot;1440&quot; data-origin-height=&quot;4964&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;그림으로 쉽게 보는 요약&lt;/figcaption&gt;
&lt;/figure&gt;

&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p style=&quot;margin-bottom: 16px !important;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;참고 문서&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;a href=&quot;https://help.salesforce.com/s/articleView?id=ai.prompt_builder_ground_flows.htm&amp;amp;type=5&amp;amp;language=en_US&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Ground with Flow Merge Fields&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://help.salesforce.com/s/articleView?id=platform.flow_concepts_trigger_prompt_template_capability_example.htm&amp;amp;type=5&amp;amp;language=en_US&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Use Prompt Templates to Generate Record Summaries Example&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://help.salesforce.com/s/articleView?id=ai.prompt_builder_add_flow_without_data_cloud_field_gen.htm&amp;amp;type=5&amp;amp;language=en_US&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Add Flow Merge Fields Without Data Cloud Objects to a Field Generation Prompt Template&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://help.salesforce.com/s/articleView?id=ai.prompt_builder_add_flows_flex.htm&amp;amp;type=5&amp;amp;language=en_US&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Add Flow Merge Fields to a Flex Prompt Template&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://help.salesforce.com/s/articleView?id=platform.flow_ref_resources_global_variables.htm&amp;amp;type=5&amp;amp;language=en_US&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Global Variables Resource&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://help.salesforce.com/s/articleView?id=ai.prompt_builder_ground_related_list.htm&amp;amp;type=5&amp;amp;language=en_US&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Grounding with Related List Merge Fields&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://help.salesforce.com/s/articleView?id=ai.prompt_builder_considerations_deployment.htm&amp;amp;type=5&amp;amp;language=en_US&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Deployment Considerations for Prompt Templates&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>Salesforce/Agentforce</category>
      <category>Agentforce</category>
      <category>flow</category>
      <category>Prompt Builder</category>
      <category>Template-Triggered Prompt Flow</category>
      <category>프롬프트 템플릿</category>
      <author>Luka.dev</author>
      <guid isPermaLink="true">https://jt98.tistory.com/36</guid>
      <comments>https://jt98.tistory.com/36#entry36comment</comments>
      <pubDate>Fri, 16 Oct 2026 14:26:50 +0900</pubDate>
    </item>
  </channel>
</rss>