JSON 페이로드를 통해 규칙 아티팩트 다운로드, 저장 및 업데이트

이 방법은 애플리케이션이 SDK 메서드를 사용하는 각 파일에서 SDK를 초기화해야 하는 방식으로 구성되어 있는 경우에 가장 적합합니다. 웹 애플리케이션이 SDK 초기화 중에 규칙 아티팩트의 JSON 페이로드를 사용하려면 먼저 JSON 페이로드가 다운로드되어 애플리케이션이 사용할 수 있도록 해야 합니다.

단계 요약

  1. SDK 설치
  2. SDK 초기화
  3. JSON 페이로드 저장 및 사용

1. SDK 설치

NPM
code language-javascript line-numbers
npm i @adobe/target-nodejs-sdk -P
MVN
code language-javascript line-numbers
<dependency>
    <groupId>com.adobe.target</groupId>
    <artifactId>java-sdk</artifactId>
    <version>1.0</version>
</dependency>

2. SDK 초기화

  1. 먼저 SDK를 가져옵니다. 서버 시작을 제어할 수 있는 동일한 파일로 가져옵니다.

    Node.js

    code language-javascript line-numbers
       const TargetClient = require("@adobe/target-nodejs-sdk");
    

    Java

    code language-javascript line-numbers
       import com.adobe.target.edge.client.ClientConfig;
    import com.adobe.target.edge.client.TargetClient;
    
  2. SDK를 구성하려면 create 메서드를 사용합니다.

    Node.js

    code language-javascript line-numbers
       const CONFIG = {
        client: "<your target client code>",
        organizationId: "your EC org id",
        decisioningMethod: "on-device",
        pollingInterval : 300000,
        events: {
            artifactDownloadSucceeded: onArtifactDownloadSucceeded,
            artifactDownloadFailed: onArtifactDownloadFailed
        }
    };
    
    const TargetClient = TargetClient.create(CONFIG);
    
    function onArtifactDownloadSucceeded(event) {
        //Adobe Target SDK has now downloaded the JSON Artifact/Payload
        console.log(event.artifactLocation) // Location from where the Artifact is downloaded.
        console.log(event.artifactPayload) // JSON Payload which we can store locally.
    }
    
    function onArtifactDownloadFailed(event) {
        //Adobe Target SDK has failed to download the JSON Artifact/Payload.
        console.log(event.artifactLocation) // Location from where the Artifact is downloaded.
        console.log(event.error.message) // Error message
    }
    

    Java

    code language-javascript line-numbers
       package com.adobe.target.edge.client.model.ondevice.OnDeviceDecisioningHandler;
    
    ClientConfig config = ClientConfig.builder()
        .client("<you target client code>")
        .organizationId("<your EC org id>")
        .onDeviceDecisioningHandler(
          new OnDeviceDecisioningHandler() {
            void onDeviceDecisioningReady() {
              // On-Device Decision is ready.
            }
            void artifactDownloadSucceeded(byte[] artifactData) {
              // Store artifactData to local disk.
              // ...
            }
          }
        )
        .build();
    TargetClient targetClient = TargetClient.create(config);
    
  3. 아래와 같이 Administration > Implementation(으)로 이동하여 Adobe Target에서 클라이언트와 organizationId을(를) 모두 검색할 수 있습니다.

    <!— image-client-code.png 삽입 —>
    대체 이미지

3. JSON 페이로드 저장 및 해제

JSON 페이로드를 저장하는 데 사용하는 메커니즘은 시스템 아키텍처에 따라 다릅니다. 로컬 파일, 데이터베이스 또는 Memcached와 같은 메모리 객체 캐싱 시스템을 사용할 수 있습니다. 사용하려면 애플리케이션에서 이 JSON을 읽을 수 있어야 합니다. 이 안내서에서는 로컬 파일을 저장소로 사용합니다.

Node.js
code language-javascript line-numbers
//... Code removed for brevity

function onArtifactDownloadSucceeded(event) {
    const jsonPath = 'src/config/target-rules.json'
    fs.writeFile(jsonPath, JSON.stringify(event.artifactPayload), 'utf8', (err) => {
        if (err) {
            throw err;
        };
        console.log(`The artifact from '${event.artifactLocation}' is now saved to '${jsonPath}'`);
    });
}


function onArtifactDownloadFailed(event) {
  console.log(`The local decisioning artifact failed to download from '${event.artifactLocation}' with the following error message: ${event.error.message}`);
}

//... Code removed for brevity
Java
code language-javascript line-numbers
MboxRequest mbox = new MboxRequest().name("homepage").index(0);
TargetDeliveryRequest request = TargetDeliveryRequest.builder()
    .context(new Context().channel(ChannelType.WEB))
    .execute(new ExecuteRequest().mboxes(Arrays.asList(mbox)))
    .build();
TargetDeliveryResponse response = targetClient.getOffers(request);
NOTE
JSON 페이로드를 통해 Adobe TargetSDK를 초기화하면 Adobe TargetSDK에서 규칙 아티팩트가 다운로드될 때까지 기다릴 필요가 없기 때문에 서버에서 온디바이스 의사 결정 활동을 통해 요청을 즉시 제공할 수 있습니다.

다음은 JSON 페이로드 초기화 기능을 보여 주는 예입니다.

Node.js
code language-javascript line-numbers
const express = require("express");
const cookieParser = require("cookie-parser");
const TargetClient = require("@adobe/target-nodejs-sdk");
const CONFIG = {
    client: "<your target client code>",
    organizationId: "your EC org id",
    decisioningMethod: "on-device",
    pollingInterval : 300000,
    events: {
        clientReady : startWebServer,
        artifactDownloadSucceeded : onArtifactDownloadSucceeded,
        artifactDownloadFailed : onArtifactDownloadFailed
    },
};

function onArtifactDownloadSucceeded(event) {
    const jsonPath = 'src/config/target-rules.json'
    fs.writeFile(jsonPath, JSON.stringify(event.artifactPayload), 'utf8', (err) => {
        if (err) {
            throw err;
        };
        console.log(`The artifact from '${event.artifactLocation}' is now saved to '${jsonPath}'`);
    });
}

function onArtifactDownloadFailed(event) {
  console.log(`The on-device decisioning artifact failed to download from '${event.artifactLocation}' with the following error message: ${event.error.message}`);
}

const app = express();
const targetClient = TargetClient.create(CONFIG);

app.use(cookieParser());

function saveCookie(res, cookie) {
  if (!cookie) {
    return;
  }

  res.cookie(cookie.name, cookie.value, {maxAge: cookie.maxAge * 1000});
}

const getResponseHeaders = () => ({
  "Content-Type": "text/html",
  "Expires": new Date().toUTCString()
});

function sendSuccessResponse(res, response) {
  res.set(getResponseHeaders());
  saveCookie(res, response.targetCookie);
  res.status(200).send(response);
}

function sendErrorResponse(res, error) {
  res.set(getResponseHeaders());
  res.status(500).send(error);
}

function startWebServer() {
    app.get('/*', async (req, res) => {
    const targetCookie = req.cookies[TargetClient.TargetCookieName];
    const request = {
        execute: {
        mboxes: [{
            address: { url: req.headers.host + req.originalUrl },
            name: "on-device-homepage-banner" // Ensure that you have a LIVE Activity running on this location
        }]
        }};

    try {
        const response = await targetClient.getOffers({ request, targetCookie });
        sendSuccessResponse(res, response);
    } catch (error) {
        console.error("Target:", error);
        sendErrorResponse(res, error);
    }
    });

    app.listen(3000, function () {
    console.log("Listening on port 3000 and watching!");
    });
}
Java
code language-javascript line-numbers
import com.adobe.target.edge.client.ClientConfig;
import com.adobe.target.edge.client.TargetClient;
import com.adobe.target.delivery.v1.model.ChannelType;
import com.adobe.target.delivery.v1.model.Context;
import com.adobe.target.delivery.v1.model.ExecuteRequest;
import com.adobe.target.delivery.v1.model.MboxRequest;
import com.adobe.target.edge.client.entities.TargetDeliveryRequest;
import com.adobe.target.edge.client.model.TargetDeliveryResponse;

@Controller
public class TargetController {

  private TargetClient targetClient;

  TargetController() {
    // You should instantiate TargetClient in a Bean and inject the instance into this class
    // but we show the code here for demonstration purpose.
    ClientConfig config = ClientConfig.builder()
        .client("<you target client code>")
        .organizationId("<your EC org id>")
        .onDeviceDecisioningHandler(
          new OnDeviceDecisioningHandler() {
            void onDeviceDecisioningReady() {
              // On-Device Decision is ready.
            }
            void artifactDownloadSucceeded(byte[] artifactData) {
              // Store artifactData to local disk.
              // ...
            }
          }
        )
        .build();
    targetClient = TargetClient.create(config);
  }

  @GetMapping("/")
  public String homePage() {
    MboxRequest mbox = new MboxRequest().name("homepage").index(0);
    TargetDeliveryRequest request = TargetDeliveryRequest.builder()
        .context(new Context().channel(ChannelType.WEB))
        .execute(new ExecuteRequest().mboxes(Arrays.asList(mbox)))
        .build();
    TargetDeliveryResponse response = targetClient.getOffers(request);
    // ...
  }
}
recommendation-more-help
6906415f-169c-422b-89d3-7118e147c4e3