SDK ์ฐ๋
@hackler/hackle-sdk๋ฅผ ์ฌ์ฉํ๊ณ ๊ณ์๋ค๋ฉด,@hackler/javascript-sdk๋ก ๋ง์ด๊ทธ๋ ์ด์ ํด์ผํฉ๋๋ค.
1. SDK ์์กด์ฑ ์ถ๊ฐ
npm install --save @hackler/javascript-sdkyarn add @hackler/javascript-sdk2. SDK ์ด๊ธฐํ
hackleClient๋ SDK ๊ธฐ๋ฅ์ ์ฌ์ฉํ๊ธฐ ์ํ ๋ฉ์๋๋ค์ ์ ๊ณตํ๋ ํด๋์ค์
๋๋ค.
SDK ๋ฅผ ์ฌ์ฉํ๊ธฐ ์ํด์๋ hackleClient ์ด๊ธฐํ๊ฐ ํ์ํฉ๋๋ค.
์ธ์คํด์คํ
SDK ํค๋ฅผ ์ ๋ฌํ์ฌ hackleClient๋ฅผ ์ธ์คํด์คํ ํฉ๋๋ค.
hackleClient๋ ํ์ํ ์ ๋ณด๋ค์ ์ป๊ธฐ ์ํด ๋ฐฑ๊ทธ๋ผ์ด๋ ์์
์ผ๋ก ํตํด ์๋ฒ์ ์ฃผ๊ธฐ์ ์ผ๋ก ๋๊ธฐํํฉ๋๋ค.
- SDK ํค๋ ํตํด ์๋น์ค์ ๋์๋ณด๋ ์์ ์์นํ SDK ์ฐ๋ ์ ๋ณด์์ ํ์ธํ์ค ์ ์์ต๋๋ค.
const Hackle = require("@hackler/javascript-sdk");
// YOUR_SERVER_SDK_KEY ์๋ฆฌ์ SDK ํค๋ฅผ ๋ฃ์ต๋๋ค.
const hackleClient = Hackle.createInstance("YOUR_SERVER_SDK_KEY");๋๊ธฐํ ๋๊ธฐ
hackleClient.onReady(() => {
// SDK ready to use
http.createServer((req, res) => {
}).listen(3000)
});SDK๊ฐ ์ค๋น๋๊ธฐ ์ ์ฌ์ฉ์ ์์ฒญ์ด ๋ค์ด์ค๋ฉด ๋ฐ์ดํฐ๊ฐ ๋๋ฝ๋ ์ ์์ต๋๋ค.
๋ฐ๋๋ก ์ดํ๋ฆฌ์ผ์ด์ ์ด ๋ช ์์ ์ธ ์ข ๋ฃ ๊ณผ์ ์์ด ์ข ๋ฃ๋๋ฉด ์ด๋ฒคํธ๊ฐ ๋๋ฝ๋ ์ ์์ต๋๋ค
SDK ํค๋ ํตํด ๋์๋ณด๋ ์์์ ํ์ธํ ์ ์์ต๋๋ค.
SDK ์ฐ๋ ์ ๋ณด ์์ SDK ์ข
๋ฅ/ํ๊ฒฝ ๋ณ SDK ํค๋ฅผ ํ์ธ ํ Server SDK ํค๋ฅผ ๋ณต์ฌํ์ฌ ์ฌ์ฉํ์ธ์.
3. ์ฌ์ฉ์ ์ด๋ฒคํธ ์ ์ก
ํตํด SDK๋ ์ฌ์ฉ์ ์ด๋ฒคํธ๋ฅผ ํตํด๋ก ์ ์กํ๋ ๊ธฐ๋ฅ์ ์ ๊ณตํฉ๋๋ค.
์ฌ์ฉ์ ํ๋์ ๋ณํ๊ฐ ์ผ์ด๋๋ ์ง์ ๋ง๋ค ์ด ๊ธฐ๋ฅ์ ํ์ฉํ๋ฉด ์ฌ์ฉ์ ํ๋์ ๋ํ ์ ์๋ฏธํ ๋ฐ์ดํฐ๋ฅผ ์ป์ ์ ์์ผ๋ฉฐ, ๊ทธ๋ ๊ฒ ๋ชจ์ธ ๋ฐ์ดํฐ๋ฅผ ํตํด ์ฌ์ฉ์ ํ๋ ๋ถ์์ ํ ์ ์์ต๋๋ค.
track
track() ๋ฉ์๋์ ์ด๋ฒคํธ ํค์ ์ฌ์ฉ์ ์๋ณ์๋ฅผ ์ ๋ฌํ์ฌ ์ฌ์ฉ์ ์ด๋ฒคํธ๋ฅผ ์ ์กํ ์ ์์ต๋๋ค. ํ์ํ ๊ฒฝ์ฐ ์ฌ์ฉ์ ์ด๋ฒคํธ ์ ์ก ์ ์ซ์ ๊ฐ์ value์ ๋ฃ์ด ํจ๊ป ์ ์กํ ์ ์์ต๋๋ค.
value๋ number ํ์ ๋ง ๋ฃ์ ์ ์์ต๋๋ค.
์์
์ฌ์ฉ์๊ฐ ๊ตฌ๋งคํ๊ธฐ ๋ฒํผ์ ๋๋ ์ ๋ ์ด๋ฒคํธ๋ฅผ ์์งํ๊ธฐ ์ํด purchase ๋ผ๋ ์ด๋ฒคํธ ํค๋ฅผ ์ ์ํ๋ค๊ณ ๊ฐ์ ํฉ๋๋ค.
์ด ๋ ๊ตฌ๋งค ์์ฑ์ ๋ณด๋ฅผ ๊ฐ์ด ์์งํ๊ณ ์ถ์ ์ ์์ต๋๋ค. ์ด๋ฐ ๊ฒฝ์ฐ property์ ๊ตฌ๋งค ์์ฑ์ ๋ณด๋ฅผ ํจ๊ป ๋ฐ์ ์ ์์ต๋๋ค.
// "ae2182e0"๋ผ๋ ์๋ณ์๋ฅผ ๊ฐ์ง ์ฌ์ฉ์๊ฐ ๋ฐ์์ํจ "purchase"๋ผ๋ ์ด๋ฒคํธ๋ฅผ ์ ์ก
/* ์์ 1: ์ด๋ฒคํธ ํค๋ง ์ ์ก */
if (req.method === 'POST' && req.url === '/purchase') {
const user = { id: "ae2182e0" };
hackleClient.onReady(function() {
hackleClient.track({ key: "purchase" }, user)
});
// ๊ธฐ์กด ์ฝ๋
}
/* ์์ 2: ์ด๋ฒคํธ ํค์ ๊ตฌ๋งค ์์ฑ์ ๋ณด๋ฅผ ํจ๊ป ์ ์ก */
if (req.method === 'POST' && req.url === '/purchase') {
const event = {
key: "purchase",
properties: {
pay_method: "CARD",
discount_amount: 800,
is_discount: true
}
}
const user = { id: "ae2182e0" };
hackleClient.onReady(function() {
hackleClient.track(event, user)
});
// ๊ธฐ์กด ์ฝ๋
}์์ 1์์๋ ์ด๋ฒคํธ ํค๋ง ์ ์กํ๊ณ ์์ผ๋ฉฐ, ์์ 2์์๋ ๊ตฌ๋งค ์์ฑ์ ๋ณด๋ฅผ ํจ๊ป ์์งํ๊ธฐ ์ํด properties์ ๊ตฌ๋งค ์์ฑ์ ๋ณด๋ฅผ ๋ฃ์ ์ฌ๋ก๋ฅผ ๋ณด์ฌ์ฃผ๊ณ ์์ต๋๋ค.
์ฌ์ฉ์ ์ด๋ฒคํธ ์ ์ก ํ์ธํ๊ธฐ
SDK ์์ ์ ์กํ ์ฌ์ฉ์ ์ด๋ฒคํธ๊ฐ ์ ์์ ์ผ๋ก ์์ง๋๊ณ ์๋์ง ํ์ธํด๋ณด์ธ์.
ํตํด ๋์๋ณด๋ ์์ [์ผ์ชฝ ๋ฉ๋ด๋ฐ] - [์ด๋ฒคํธ ๊ด๋ฆฌ] ๋ฉ๋ด์์ SDK๋ก ์ ์กํ ์ด๋ฒคํธ๋ฅผ ์ฐพ์ ์ค์๊ฐ ์ด๋ฒคํธ ์์งํํฉ์ ํ์ธํด๋ณผ ์ ์์ต๋๋ค.
4. A/B ํ
์คํธ, ๊ธฐ๋ฅํ๋๊ทธ
A/B ํ
์คํธ
A/B ํ ์คํธ๋ฅผ ์งํํ ๋, ํ ์คํธ ๊ทธ๋ฃน์ ๋์์ผ๋ก ์ฌ์ฉ์๋ฅผ ๋ถ๋ฐฐํ๊ณ ๊ฐ ํ ์คํธ ๊ทธ๋ฃน์ ํด๋นํ๋ ๋ก์ง์ ์์ฑํด์ผ ํฉ๋๋ค. ์ด ๋ ์ฌ์ฉ์ ๋ถ๋ฐฐ๋ฅผ ํตํด SDK๋ฅผ ํตํด ์งํํ ์ ์์ต๋๋ค.
ํ ์คํธ ๊ทธ๋ฃนํ ์คํธ ๊ทธ๋ฃน์ ํ ์คํธ ๋์์ด ๋๋ ๊ธฐ์กด์(๋์กฐ๊ตฐ)๊ณผ ๊ฐ์ ์(์คํ๊ตฐ)์ ์๋ฏธํ๋ฉฐ, ๊ฐ์ ์์ 1๊ฐ ์ด์์ผ ์ ์์ต๋๋ค. ๋์๋ณด๋์์ ์ค์ ๊ฐ๋ฅํ๋ฉฐ, ํ ์คํธ ๊ทธ๋ฃน์ ๊ด๋ฆฌํ๋ ๋ฐฉ๋ฒ์ ๋ํด์๋ A/B ํ ์คํธ ์ค์ ๋ฌธ์๋ฅผ ์ฐธ๊ณ ํ์๊ธฐ ๋ฐ๋๋๋ค.
variation
variation() ๋ฉ์๋์ ์คํ ํค์ ์ฌ์ฉ์ ์๋ณ์๋ฅผ ์ ๋ฌํ๋ฉด ์ฌ์ฉ์๋ฅผ ๋ถ๋ฐฐํ๊ณ ๊ฒฐ๊ณผ๋ฅผ ์ ๋ฌ๋ฐ์ ์ ์์ต๋๋ค. ์ดํ ํ
์คํธ ๊ทธ๋ฃน ๋ณ ๋ก์ง์ ๊ตฌํํฉ๋๋ค.
์คํ ํค๋ ๊ฐ A/B ํ
์คํธ๋ณ๋ก ๊ฐ๊ฒ ๋๋ ๊ณ ์ ๋ฒํธ์ด๋ฉฐ, ํตํด ์๋น์ค ๋ด์ ๋์๋ณด๋์์ ํ์ธํ ์ ์์ต๋๋ค.
์๋ ์์ ์ฝ๋์์๋ ์คํ ํค 42๋ฅผ ์ ๋ฌํ๊ณ ์์ผ๋ฉฐ, ํ
์คํธ ๊ทธ๋ฃน์ A์ B ๋ ๊ฐ๊ฐ ์กด์ฌํฉ๋๋ค.
// ์คํ ํค๊ฐ 42์ธ A/B ํ
์คํธ์์
// "ae2182e0"๋ผ๋ ์๋ณ์๋ฅผ ๊ฐ์ง ์ฌ์ฉ์์๊ฒ ๋
ธ์ถํ ํ
์คํธ ๊ทธ๋ฃน์ ๊ฒฐ์ ํฉ๋๋ค.
// ๊ฒฐ์ ํ์ง ๋ชปํ๋ ์ํฉ์ธ ๊ฒฝ์ฐ ํ
์คํธ ๊ทธ๋ฃน A๋ฅผ ๋ฐํํฉ๋๋ค.
hackleClient.onReady(function() {
const user = { id: "ae2182e0" };
const variation = hackleClient.variation(42, user);
if (variation === "A") {
// ๊ทธ๋ฃน A ๋ก์ง
} else if (variation === "B") {
// ๊ทธ๋ฃน B ๋ก์ง
}
});๊ธฐ๋ฅํ๋๊ทธ
๊ธฐ๋ฅ ํ๋๊ทธ๋ SDK ๋ฒ์ 2.0.0 ์ด์์ธ ๊ฒฝ์ฐ ์ฌ์ฉ ๊ฐ๋ฅํฉ๋๋ค.๊ธฐ๋ฅ ํ๋๊ทธ๋ฅผ ์ฌ์ฉํ์๋ ๊ฒฝ์ฐ ์์กด์ฑ ์ถ๊ฐ ์ SDK ๋ฒ์ ์ 2.0.0 ์ด์์ผ๋ก ์ ์ฉํ์๊ธฐ ๋ฐ๋๋๋ค.
๊ธฐ๋ฅ ํ๋๊ทธ๋ ์ผ์ง(on) ์ํ์ ๊บผ์ง(off) ์ํ๊ฐ ์์ต๋๋ค. ๊ฐ ์ํ์ ๋ฐ๋ผ ๋ค๋ฅธ ๊ธฐ๋ฅ์ ์ค์ ํ๊ฒ ๋ฉ๋๋ค.
๊ธฐ๋ฅ ํ๋๊ทธ๋ฅผ ์ ์ฉํ ๊ธฐ๋ฅ์ ์ด๋ค ์ฌ์ฉ์๊ฐ ์ ๊ทผํ ๊ฒฝ์ฐ ์ผ์ง ํน์ ๊บผ์ง ์ํ๋ฅผ ๋ฐ์ ์ ์์ด์ผ ํฉ๋๋ค. ์ด ์ํ ๊ฒฐ์ ์ ํตํด SDK๋ฅผ ํตํด ์งํํ ์ ์์ต๋๋ค.
isFeatureOn
isFeatureOn() ๋ฉ์๋์ ๊ธฐ๋ฅ ํค๋ฅผ ์ ๋ฌํ๋ฉด ์ฌ์ฉ์์ ๋ํ ์ํ ๊ฒฐ๊ณผ๋ฅผ ์ ๋ฌ๋ฐ์ ์ ์์ต๋๋ค. ์ดํ ์ํ์ ๋ฐ๋ฅธ ๋ก์ง์ ๊ตฌํํฉ๋๋ค.
๊ธฐ๋ฅ ํค๋ ๊ฐ ๊ธฐ๋ฅ ํ๋๊ทธ๋ณ๋ก ๊ฐ๊ฒ ๋๋ ๊ณ ์ ๋ฒํธ์ด๋ฉฐ ํตํด ์๋น์ค ๋ด์ ๋์๋ณด๋์์ ํ์ธํ์ค ์ ์์ต๋๋ค.
์๋ ์์ ์ฝ๋์์๋ ๊ธฐ๋ฅ ํค 42๋ฅผ ์ ๋ฌํ๊ณ ์์ผ๋ฉฐ, ์ํ๋ฅผ ๋ฐ์ ์ฌ์ฉ์์ ์ฌ์ฉ์ ์๋ณ์๋ "ae03e1adf" ์
๋๋ค.
// SDK๊ฐ ์ค๋น๋ ์ดํ์ ์คํ์ด ๋์ด์ผํฉ๋๋ค. onReady๋ก ๊ฐ์ธ๋ ๊ฒ์ ์์ง ๋ง์ธ์.
hackleClient.onReady(function() {
// ๊ธฐ๋ฅ ํค๊ฐ 42์ธ ๊ธฐ๋ฅ ํ๋๊ทธ์์ ์ฌ์ฉ์์ ์ํ๋ฅผ ๊ฒฐ์ ํฉ๋๋ค.
// ๊ฒฐ์ ํ์ง ๋ชปํ๋ ์ํฉ์ธ ๊ฒฝ์ฐ false(๊บผ์ง ์ํ)๋ฅผ ๋ฐํํฉ๋๋ค.
const featureOn = hackleClient.isFeatureOn(42, "ae03e1adf");
// ์ํ ๋ณ ๋ก์ง
if (featureOn) {
// ON ๊ธฐ๋ฅ
} else {
// OFF ๊ธฐ๋ฅ
}
});๋ถ๋ฐฐ๊ฒฐ๊ณผ ํ์ธํ๊ธฐ
ํตํด ๋์๋ณด๋ ์์ [์ผ์ชฝ ๋ฉ๋ด๋ฐ] - ๋ ๊ธฐ๋ฅํ๋๊ทธ] ํ๋ฉด์์ ๋ ธ์ถ๋๋ ํ๋ฉด์์ ๋ ธ์ถ๋๋ A/Bํ ์คํธ ๋๋ ๊ธฐ๋ฅํ๋๊ทธ ๋ฆฌ์คํธ ์ค ์ฐ๋ํ ๋์์ ์ฐพ์ ์์ธ ํ์ด์ง๋ก ์ด๋ ํ ํ ํ๋ฉด ์ค๊ฐ์ [์ค์๊ฐ ๋ ธ์ถ ํํฉ] ํญ์ ํด๋ฆญํ๋ฉด SDK๋ก ์ฐ๋ ๋ ๋ถ๋ฐฐ ๊ฒฐ๊ณผ๋ฅผ ๋ณผ ์ ์์ต๋๋ค.
5. ์ข
๋ฃ
์๋ ๊ณผ์ ์์ด ์ดํ๋ฆฌ์ผ์ด์ ์ด ์ข ๋ฃ๋๋ฉด ์ด๋ฒคํธ๊ฐ ๋๋ฝ๋ ์ ์์ต๋๋ค
process.on('SIGINT', function() {
// kill signal
hackleClient.close();
});์ดํ๋ฆฌ์ผ์ด์
์ด ์ข
๋ฃ๋ ๋ close() ๋ฉ์๋๋ฅผ ํธ์ถํด์ผ ํฉ๋๋ค. ์ด ๊ณผ์ ์ ํตํด ์ฌ์ฉ ์ค์ธ ๋ฆฌ์์ค๋ฅผ ๋ฐ๋ฉํ๊ณ ๋จ์์๋ ์ด๋ฒคํธ๋ฅผ ์ ์กํฉ๋๋ค. ์ด ๊ณผ์ ์์ด ์ดํ๋ฆฌ์ผ์ด์
์ด ์ข
๋ฃ๋๋ฉด ์ด๋ฒคํธ๊ฐ ๋๋ฝ๋ ์ ์์ต๋๋ค.
Updated 7 days ago
