SDK ์—ฐ๋™

๐Ÿ“˜

Java/Kotlin SDK๋Š” JDK 8 ์ด์ƒ์„ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค.


1. ์˜์กด์„ฑ ์ถ”๊ฐ€

SDK ์˜์กด์„ฑ์„ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

repositories {
  mavenCentral()
}

dependencies {
  implementation 'io.hackle:hackle-server-sdk:2.31.0'
}

2. SDK ์ดˆ๊ธฐํ™”

HackleClient๋Š” SDK ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•œ ๋ฉ”์†Œ๋“œ๋“ค์„ ์ œ๊ณตํ•˜๋Š” ํด๋ž˜์Šค์ž…๋‹ˆ๋‹ค.

SDK ๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” HackleClinet ์ดˆ๊ธฐํ™”๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

์ธ์Šคํ„ด์Šคํ™”

SDK ํ‚ค๋ฅผ ์ „๋‹ฌํ•˜์—ฌ HackleClient๋ฅผ ์ธ์Šคํ„ด์Šคํ™” ํ•ฉ๋‹ˆ๋‹ค.
HackleClient๋Š” ํ•„์š”ํ•œ ์ •๋ณด๋“ค์„ ์–ป๊ธฐ ์œ„ํ•ด ๋ฐฑ๊ทธ๋ผ์šด๋“œ ์ž‘์—…์œผ๋กœ ํ•ตํด ์„œ๋ฒ„์™€ ์ฃผ๊ธฐ์ ์œผ๋กœ ๋™๊ธฐํ™”ํ•ฉ๋‹ˆ๋‹ค.

  • SDK ํ‚ค๋Š” ํ•ตํด ์„œ๋น„์Šค์˜ ๋Œ€์‹œ๋ณด๋“œ ์•ˆ์— ์œ„์น˜ํ•œ SDK ์—ฐ๋™ ์ •๋ณด์—์„œ ํ™•์ธํ•˜์‹ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
โ—๏ธ

HackleClient๋Š” ๋ฐ˜๋“œ์‹œ ์‹ฑ๊ธ€ํ†ค์ด์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

HackleClient๋Š” ํ˜ธ์ถœ ์“ฐ๋ ˆ๋“œ๋ฅผ ๋ธ”๋กํ‚น ํ•˜์ง€ ์•Š๊ณ  ๋ฐ”๋กœ ํ…Œ์ŠคํŠธ ๊ทธ๋ฃน์„ ๋ถ„๋ฐฐํ•˜๊ธฐ ์œ„ํ•ด ๋‚ด๋ถ€์ ์œผ๋กœ ์ƒํƒœ๋ฅผ ๊ด€๋ฆฌํ•ฉ๋‹ˆ๋‹ค.
์ด๋ฅผ ์œ„ํ•ด ์ถ”๊ฐ€์ ์ธ ๋ฆฌ์†Œ์Šค๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

๋ชจ๋“  ์š”์ฒญ์— ๋Œ€ํ•ด ์ƒˆ๋กœ์šด ํด๋ผ์ด์–ธํŠธ๋ฅผ ์ธ์Šคํ„ด์Šคํ™” ํ•˜์ง€ ์•Š๊ณ  ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ƒ๋ช…์ฃผ๊ธฐ ๋™์•ˆ ์‹ฑ๊ธ€ ์ธ์Šคํ„ด์Šค๋กœ ๊ด€๋ฆฌ๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

import io.hackle.sdk.HackleClient
import io.hackle.sdk.HackleClients

// YOUR_SERVER_SDK_KEY ์ž๋ฆฌ์— SDK ํ‚ค๋ฅผ ๋„ฃ์Šต๋‹ˆ๋‹ค.
HackleClient hackleClient = HackleClients.create(YOUR_SERVER_SDK_KEY);
import io.hackle.sdk.HackleClient
import io.hackle.sdk.HackleClients
  
// YOUR_SERVER_SDK_KEY ์ž๋ฆฌ์— SDK ํ‚ค๋ฅผ ๋„ฃ์Šต๋‹ˆ๋‹ค.
val hackleClient = Hackle.client(YOUR_SERVER_SDK_KEY)


3. ์ด๋ฒคํŠธ ์ „์†ก

์‚ฌ์šฉ์ž๊ฐ€ ์ˆ˜ํ–‰ํ•˜๋Š” ํ–‰๋™์„ ์ด๋ฒคํŠธ๋กœ ์ „์†กํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ „์†ก๋œ ์ด๋ฒคํŠธ๋Š” A/B ํ…Œ์ŠคํŠธ ๋ถ„์„, ๋ฐ์ดํ„ฐ ๋ถ„์„ ๋“ฑ์— ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.
์˜ˆ๋ฅผ๋“ค์–ด, ์‚ฌ์šฉ์ž๊ฐ€ ๊ตฌ๋งค๋ผ๋Š” ํ–‰๋™์„ ํ–ˆ๋‹ค๋ฉด ์•„๋ž˜์™€ ๊ฐ™์ด ์ด๋ฒคํŠธ๋ฅผ ์ „์†กํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

import io.hackle.sdk.HackleClient;
import io.hackle.sdk.common.Event;
import io.hackle.sdk.common.User;

// 'ae2182e0'๋ผ๋Š” ๋””๋ฐ”์ด์Šค ์‹๋ณ„์ž ๊ฐ€์ง„ ์‚ฌ์šฉ์ž๊ฐ€ ๋ฐœ์ƒ์‹œํ‚จ 'purchase'๋ผ๋Š” ์ด๋ฒคํŠธ๋ฅผ ์ „์†ก

User user = User.builder()
        .deviceId("ae2182e0")
        .build();

Event event = Event.builder("purchase")
        .property("pay_method", "CARD")
        .property("discount_amount", 800)
        .property("is_discount", true)
        .build();

hackleClient.track(event, user);
import io.hackle.sdk.HackleClient
import io.hackle.sdk.common.Event
import io.hackle.sdk.common.User

// 'ae2182e0'๋ผ๋Š” ๋””๋ฐ”์ด์Šค ์‹๋ณ„์ž ๊ฐ€์ง„ ์‚ฌ์šฉ์ž๊ฐ€ ๋ฐœ์ƒ์‹œํ‚จ 'purchase'๋ผ๋Š” ์ด๋ฒคํŠธ๋ฅผ ์ „์†ก

val user = User.builder()
    .deviceId("ae2182e0")
    .build()

val event = Event.builder("purchase")
    .property("pay_method", "CARD")
    .property("discount_amount", 800)
    .property("is_discount", true)
    .build()

hackleClient.track(event, user)

์‚ฌ์šฉ์ž ์ด๋ฒคํŠธ ์ „์†ก ํ™•์ธํ•˜๊ธฐ

SDK ์—์„œ ์ „์†กํ•œ ์‚ฌ์šฉ์ž ์ด๋ฒคํŠธ๊ฐ€ ์ •์ƒ์ ์œผ๋กœ ์ˆ˜์ง‘๋˜๊ณ  ์žˆ๋Š”์ง€ ํ™•์ธํ•ด๋ณด์„ธ์š”.
ํ•ตํด ๋Œ€์‹œ๋ณด๋“œ ์•ˆ์˜ [์™ผ์ชฝ ๋ฉ”๋‰ด๋ฐ”] - [์ด๋ฒคํŠธ ๊ด€๋ฆฌ] ๋ฉ”๋‰ด์—์„œ SDK๋กœ ์ „์†กํ•œ ์ด๋ฒคํŠธ๋ฅผ ์ฐพ์•„ ์‹ค์‹œ๊ฐ„ ์ด๋ฒคํŠธ ์ˆ˜์ง‘ํ˜„ํ™ฉ์„ ํ™•์ธํ•ด๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.


4. A/B ํ…Œ์ŠคํŠธ, ๊ธฐ๋Šฅํ”Œ๋ž˜๊ทธ

A/B ํ…Œ์ŠคํŠธ

A/B ํ…Œ์ŠคํŠธ๋ฅผ ์ง„ํ–‰ํ•  ๋•Œ, ํ…Œ์ŠคํŠธ ๊ทธ๋ฃน์„ ๋Œ€์ƒ์œผ๋กœ ์‚ฌ์šฉ์ž๋ฅผ ๋ถ„๋ฐฐํ•˜๊ณ  ๊ฐ ํ…Œ์ŠคํŠธ ๊ทธ๋ฃน์— ํ•ด๋‹นํ•˜๋Š” ๋กœ์ง์„ ์ž‘์„ฑํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ด ๋•Œ ์‚ฌ์šฉ์ž ๋ถ„๋ฐฐ๋ฅผ ํ•ตํด SDK๋ฅผ ํ†ตํ•ด ์ง„ํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๐Ÿ“˜

ํ…Œ์ŠคํŠธ ๊ทธ๋ฃน

ํ…Œ์ŠคํŠธ ๊ทธ๋ฃน์€ ํ…Œ์ŠคํŠธ ๋Œ€์ƒ์ด ๋˜๋Š” ๊ธฐ์กด์•ˆ(๋Œ€์กฐ๊ตฐ)๊ณผ ๊ฐœ์„ ์•ˆ(์‹คํ—˜๊ตฐ)์„ ์˜๋ฏธํ•˜๋ฉฐ, ๊ฐœ์„ ์•ˆ์€ 1๊ฐœ ์ด์ƒ์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋Œ€์‹œ๋ณด๋“œ์—์„œ ์„ค์ • ๊ฐ€๋Šฅํ•˜๋ฉฐ, ํ…Œ์ŠคํŠธ ๊ทธ๋ฃน์„ ๊ด€๋ฆฌํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด์„œ๋Š” A/B ํ…Œ์ŠคํŠธ ์„ค์ • ๋ฌธ์„œ๋ฅผ ์ฐธ๊ณ ํ•˜์‹œ๊ธฐ ๋ฐ”๋ž๋‹ˆ๋‹ค.

variation

variation() ๋ฉ”์†Œ๋“œ์— ์‹คํ—˜ ํ‚ค์™€ ์‚ฌ์šฉ์ž ์‹๋ณ„์ž๋ฅผ ์ „๋‹ฌํ•˜๋ฉด ์‚ฌ์šฉ์ž๋ฅผ ๋ถ„๋ฐฐํ•˜๊ณ  ๊ฒฐ๊ณผ๋ฅผ ์ „๋‹ฌ๋ฐ›์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ดํ›„ ํ…Œ์ŠคํŠธ ๊ทธ๋ฃน ๋ณ„ ๋กœ์ง์„ ๊ตฌํ˜„ํ•ฉ๋‹ˆ๋‹ค.
์‹คํ—˜ ํ‚ค๋Š” ๊ฐ A/B ํ…Œ์ŠคํŠธ๋ณ„๋กœ ๊ฐ–๊ฒŒ ๋˜๋Š” ๊ณ ์œ  ๋ฒˆํ˜ธ์ด๋ฉฐ, ํ•ตํด ์„œ๋น„์Šค ๋‚ด์˜ ๋Œ€์‹œ๋ณด๋“œ์—์„œ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
์•„๋ž˜ ์˜ˆ์ œ ์ฝ”๋“œ์—์„œ๋Š” ์‹คํ—˜ ํ‚ค 42๋ฅผ ์ „๋‹ฌํ•˜๊ณ  ์žˆ์œผ๋ฉฐ, ์‚ฌ์šฉ์ž ์‹๋ณ„์ž๋Š” "ae2182e0" ์ž…๋‹ˆ๋‹ค. ํ…Œ์ŠคํŠธ ๊ทธ๋ฃน์€ A์™€ B ๋‘ ๊ฐœ๊ฐ€ ์กด์žฌํ•ฉ๋‹ˆ๋‹ค.

import io.hackle.sdk.HackleClient;
import io.hackle.sdk.common.User;
import io.hackle.sdk.common.Variation;

// ์‹คํ—˜ ํ‚ค๊ฐ€ 42์ธ A/B ํ…Œ์ŠคํŠธ์—์„œ
// "ae2182e0"๋ผ๋Š” ๋””๋ฐ”์ด์Šค ์‹๋ณ„์ž๋ฅผ ๊ฐ€์ง„ ์‚ฌ์šฉ์ž์—๊ฒŒ ๋…ธ์ถœํ•  ํ…Œ์ŠคํŠธ ๊ทธ๋ฃน์„ ๊ฒฐ์ •ํ•ฉ๋‹ˆ๋‹ค.
// ๊ฒฐ์ •ํ•˜์ง€ ๋ชปํ•˜๋Š” ์ƒํ™ฉ์ธ ๊ฒฝ์šฐ ํ…Œ์ŠคํŠธ ๊ทธ๋ฃน A๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

User user = User.builder()
        .deviceId("ae2182e0")
        .build();

Variation variation = hackleClient.variation(42, user);

// ํ• ๋‹น๋ฐ›์€ ๊ทธ๋ฃน์— ๋Œ€ํ•œ ๋กœ์ง
if (variation == Variation.A) {
  // ๊ทธ๋ฃน A ๋กœ์ง
} else if (variation == Variation.B) {
  // ๊ทธ๋ฃน B ๋กœ์ง
}
import io.hackle.sdk.HackleClient  
import io.hackle.sdk.common.User
import io.hackle.sdk.common.Variation
  
// ์‹คํ—˜ ํ‚ค๊ฐ€ 42์ธ A/B ํ…Œ์ŠคํŠธ์—์„œ
// "ae2182e0"๋ผ๋Š” ์‹๋ณ„์ž๋ฅผ ๊ฐ€์ง„ ์‚ฌ์šฉ์ž์—๊ฒŒ ๋…ธ์ถœํ•  ํ…Œ์ŠคํŠธ ๊ทธ๋ฃน์„ ๊ฒฐ์ •ํ•ฉ๋‹ˆ๋‹ค.
// ๊ฒฐ์ •ํ•˜์ง€ ๋ชปํ•˜๋Š” ์ƒํ™ฉ์ธ ๊ฒฝ์šฐ ํ…Œ์ŠคํŠธ ๊ทธ๋ฃน A๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.
val user = User.builder()
        .deviceId("ae2182e0")
        .build()
val variation: Variation = hackleClient.variation(42, user)

// ํ• ๋‹น๋ฐ›์€ ๊ทธ๋ฃน์— ๋Œ€ํ•œ ๋กœ์ง
if (variation == Variation.A) {
  // ๊ทธ๋ฃน A ๋กœ์ง
} else if (variation == Variation.B) {
  // ๊ทธ๋ฃน B ๋กœ์ง
}

๊ธฐ๋Šฅํ”Œ๋ž˜๊ทธ

๐Ÿ“˜

๊ธฐ๋Šฅ ํ”Œ๋ž˜๊ทธ๋Š” SDK ๋ฒ„์ „ 2.0.0 ์ด์ƒ์ธ ๊ฒฝ์šฐ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

๊ธฐ๋Šฅ ํ”Œ๋ž˜๊ทธ๋ฅผ ์‚ฌ์šฉํ•˜์‹œ๋Š” ๊ฒฝ์šฐ ์˜์กด์„ฑ ์ถ”๊ฐ€ ์‹œ SDK ๋ฒ„์ „์„ 2.0.0 ์ด์ƒ์œผ๋กœ ์ ์šฉํ•˜์‹œ๊ธฐ ๋ฐ”๋ž๋‹ˆ๋‹ค.

๊ธฐ๋Šฅ ํ”Œ๋ž˜๊ทธ๋Š” ์ผœ์ง(on) ์ƒํƒœ์™€ ๊บผ์ง(off) ์ƒํƒœ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ฐ ์ƒํƒœ์— ๋”ฐ๋ผ ๋‹ค๋ฅธ ๊ธฐ๋Šฅ์„ ์„ค์ •ํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.
๊ธฐ๋Šฅ ํ”Œ๋ž˜๊ทธ๋ฅผ ์ ์šฉํ•œ ๊ธฐ๋Šฅ์— ์–ด๋–ค ์‚ฌ์šฉ์ž๊ฐ€ ์ ‘๊ทผํ•  ๊ฒฝ์šฐ ์ผœ์ง ํ˜น์€ ๊บผ์ง ์ƒํƒœ๋ฅผ ๋ฐ›์„ ์ˆ˜ ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ด ์ƒํƒœ ๊ฒฐ์ •์„ ํ•ตํด SDK๋ฅผ ํ†ตํ•ด ์ง„ํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

isFeatureOn

isFeatureOn() ๋ฉ”์†Œ๋“œ์— ๊ธฐ๋Šฅ ํ‚ค๋ฅผ ์ „๋‹ฌํ•˜๋ฉด ์‚ฌ์šฉ์ž์— ๋Œ€ํ•œ ์ƒํƒœ ๊ฒฐ๊ณผ๋ฅผ ์ „๋‹ฌ๋ฐ›์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ดํ›„ ์ƒํƒœ์— ๋”ฐ๋ฅธ ๋กœ์ง์„ ๊ตฌํ˜„ํ•ฉ๋‹ˆ๋‹ค.
๊ธฐ๋Šฅ ํ‚ค๋Š” ๊ฐ ๊ธฐ๋Šฅ ํ”Œ๋ž˜๊ทธ๋ณ„๋กœ ๊ฐ–๊ฒŒ ๋˜๋Š” ๊ณ ์œ  ๋ฒˆํ˜ธ์ด๋ฉฐ ํ•ตํด ์„œ๋น„์Šค ๋‚ด์˜ ๋Œ€์‹œ๋ณด๋“œ์—์„œ ํ™•์ธํ•˜์‹ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
์•„๋ž˜ ์˜ˆ์ œ ์ฝ”๋“œ์—์„œ๋Š” ๊ธฐ๋Šฅ ํ‚ค 42๋ฅผ ์ „๋‹ฌํ•˜๊ณ  ์žˆ์œผ๋ฉฐ, ์ƒํƒœ๋ฅผ ๋ฐ›์„ ์‚ฌ์šฉ์ž์˜ ์‚ฌ์šฉ์ž ์‹๋ณ„์ž๋Š” "ae03e1adf" ์ž…๋‹ˆ๋‹ค.

import io.hackle.sdk.HackleClient

// ๊ธฐ๋Šฅ ํ‚ค๊ฐ€ 42์ธ ๊ธฐ๋Šฅ ํ”Œ๋ž˜๊ทธ์—์„œ ์‚ฌ์šฉ์ž์˜ ์ƒํƒœ๋ฅผ ๊ฒฐ์ •ํ•ฉ๋‹ˆ๋‹ค.
// ๊ฒฐ์ •ํ•˜์ง€ ๋ชปํ•˜๋Š” ์ƒํ™ฉ์ธ ๊ฒฝ์šฐ false(๊บผ์ง ์ƒํƒœ)๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.
boolean isFeatureOn = hackleClient.isFeatureOn(42, "ae03e1adf");

if (isFeatureOn) {
    // ON ๊ธฐ๋Šฅ
} else {
    // OFF ๊ธฐ๋Šฅ
}
import io.hackle.sdk.HackleClient

// ๊ธฐ๋Šฅ ํ‚ค๊ฐ€ 42์ธ ๊ธฐ๋Šฅ ํ”Œ๋ž˜๊ทธ์—์„œ ์‚ฌ์šฉ์ž์˜ ์ƒํƒœ๋ฅผ ๊ฒฐ์ •ํ•ฉ๋‹ˆ๋‹ค.
// ๊ฒฐ์ •ํ•˜์ง€ ๋ชปํ•˜๋Š” ์ƒํ™ฉ์ธ ๊ฒฝ์šฐ false(๊บผ์ง ์ƒํƒœ)๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.
val isFeatureOn: Boolean = hackleClient.isFeatureOn(42, "ae03e1adf")

if (isFeatureOn) {
    // ON ๊ธฐ๋Šฅ
} else {
    // OFF ๊ธฐ๋Šฅ
}

๋ถ„๋ฐฐ๊ฒฐ๊ณผ ํ™•์ธํ•˜๊ธฐ

ํ•ตํด ๋Œ€์‹œ๋ณด๋“œ ์•ˆ์˜ [์™ผ์ชฝ ๋ฉ”๋‰ด๋ฐ”] - ๋Š” ๊ธฐ๋Šฅํ”Œ๋ž˜๊ทธ] ํ™”๋ฉด์—์„œ ๋…ธ์ถœ๋˜๋Š” ํ™”๋ฉด์—์„œ ๋…ธ์ถœ๋˜๋Š” A/Bํ…Œ์ŠคํŠธ ๋˜๋Š” ๊ธฐ๋Šฅํ”Œ๋ž˜๊ทธ ๋ฆฌ์ŠคํŠธ ์ค‘ ์—ฐ๋™ํ•œ ๋Œ€์ƒ์„ ์ฐพ์•„ ์ƒ์„ธ ํŽ˜์ด์ง€๋กœ ์ด๋™ ํ•œ ํ›„ ํ™”๋ฉด ์ค‘๊ฐ„์— [์‹ค์‹œ๊ฐ„ ๋…ธ์ถœ ํ˜„ํ™ฉ] ํƒญ์„ ํด๋ฆญํ•˜๋ฉด SDK๋กœ ์—ฐ๋™ ๋œ ๋ถ„๋ฐฐ ๊ฒฐ๊ณผ๋ฅผ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.


5. ์ข…๋ฃŒ

import io.hackle.sdk.HackleClient  

hackleClient.close();
import io.hackle.sdk.HackleClient  
  
hackleClient.close()

์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ์ข…๋ฃŒ๋  ๋•Œ close() ๋ฉ”์†Œ๋“œ๋ฅผ ํ˜ธ์ถœํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ด ๊ณผ์ •์„ ํ†ตํ•ด ์‚ฌ์šฉ ์ค‘์ธ ๋ฆฌ์†Œ์Šค๋ฅผ ๋ฐ˜๋‚ฉํ•˜๊ณ  ๋‚จ์•„์žˆ๋Š” ์ด๋ฒคํŠธ๋ฅผ ์ „์†กํ•ฉ๋‹ˆ๋‹ค. ์ด ๊ณผ์ • ์—†์ด ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ์ข…๋ฃŒ๋˜๋ฉด ์ด๋ฒคํŠธ๊ฐ€ ๋ˆ„๋ฝ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๐Ÿ‘

์Šคํ”„๋ง ํ”„๋ ˆ์ž„์›Œํฌ๋ฅผ ์‚ฌ์šฉ ์ค‘์ด๋ผ๋ฉด?

HackleClient๋ฅผ ๋นˆ(bean)์œผ๋กœ ๋“ฑ๋กํ•˜๋Š” ๊ฒƒ์ด ๊ฐ€์žฅ ์ข‹์€ ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค.
์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ƒ๋ช…์ฃผ๊ธฐ ๋™์•ˆ ์‹ฑ๊ธ€ ์ธ์Šคํ„ด์Šค๋กœ ๊ด€๋ฆฌ๊ฐ€ ๋˜๋ฉฐ ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ข…๋ฃŒ ์‹œ close()๊นŒ์ง€ ์ž๋™์œผ๋กœ ํ˜ธ์ถœ๋ฉ๋‹ˆ๋‹ค.

Hackle Client ๋ฅผ wrapping ํ•˜์—ฌ ์‚ฌ์šฉํ•˜์‹œ๋Š” ๊ฒฝ์šฐ

wrapping ํด๋ž˜์Šค์— AutoClosable implementation ํ•˜์‹œ๊ณ  close() ์‹œ์— HackleClient ์˜ close()๋ฅผ ํ˜ธ์ถœ ํ•˜์‹œ๋Š” ๋ฐฉ๋ฒ•์„ ๊ถŒ์žฅ๋“œ๋ฆฝ๋‹ˆ๋‹ค.

import io.hackle.sdk.HackleClient

public class CustomHackleClient implements AutoCloseable {

    private final HackleClient hackleClient;

    public CustomHackleClient(HackleClient hackleClient) {
        this.hackleClient = hackleClient;
    }

    @Override
    public void close() throws Exception {
        hackleClient.close();
    }
}
import io.hackle.sdk.HackleClient

class CustomHackleClient(private val hackleClient: HackleClient): AutoCloseable {
    
    override fun close() {
        hackleClient.close()
    }
}