SDK ์—ฐ๋™

๐Ÿ“˜

@hackler/hackle-sdk๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ๊ณ„์‹œ๋‹ค๋ฉด, @hackler/javascript-sdk๋กœ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ ํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.


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

npm install --save @hackler/javascript-sdk
yarn add @hackler/javascript-sdk

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