# Java/Kotlin

{% hint style="info" %}
Java/Kotlin SDK는 JDK 8 이상을 지원합니다.
{% endhint %}

## 의존성 추가

[![](https://img.shields.io/maven-central/v/io.hackle/hackle-server-sdk)](https://central.sonatype.com/artifact/io.hackle/hackle-server-sdk)

SDK 의존성을 추가합니다.

```groovy
repositories {
  mavenCentral()
}

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

## SDK 초기화

{% hint style="danger" %}
HackleClient는 반드시 싱글톤이어야 합니다.

`HackleClient`는 호출 쓰레드를 블록킹 하지 않고 바로 테스트 그룹을 분배하기 위해 내부적으로 상태를 관리합니다.\
이를 위해 추가적인 리소스를 사용합니다.

모든 요청에 대해 새로운 클라이언트를 인스턴스화 하지 않고 어플리케이션 생명주기 동안 싱글 인스턴스로 관리되어야 합니다.
{% endhint %}

`HackleClient`는 SDK 기능을 사용하기 위한 메소드들을 제공하는 클래스입니다.

SDK 를 사용하기 위해서는 `HackleClinet` 초기화가 필요합니다.

#### 인스턴스화

SDK 키를 전달하여 `HackleClient`를 인스턴스화 합니다.\
`HackleClient`는 필요한 정보들을 얻기 위해 백그라운드 작업으로 핵클 서버와 주기적으로 동기화합니다.

* SDK 키는 핵클 서비스의 대시보드 안에 위치한 [SDK 연동 정보](https://dashboard.hackle.io/config/sdk-setting)에서 확인하실 수 있습니다.

{% tabs %}
{% tab title="Kotlin" %}

```kotlin
import io.hackle.sdk.HackleClient
import io.hackle.sdk.HackleClients
  
// YOUR_SERVER_SDK_KEY 자리에 SDK 키를 넣습니다.
val hackleClient = Hackle.client(YOUR_SERVER_SDK_KEY)
```

{% endtab %}

{% tab title="Java" %}

```java
import io.hackle.sdk.HackleClient
import io.hackle.sdk.HackleClients

// YOUR_SERVER_SDK_KEY 자리에 SDK 키를 넣습니다.
HackleClient hackleClient = HackleClients.create(YOUR_SERVER_SDK_KEY);
```

{% endtab %}
{% endtabs %}

## 종료

어플리케이션이 종료될 때 `close()` 메소드를 호출해야 합니다. 이 과정을 통해 사용 중인 리소스를 반납하고 남아있는 이벤트를 전송합니다.

{% hint style="danger" %}
`close()` 호출 없이 어플리케이션이 종료되면 **이벤트가 누락될 수 있습니다.**
{% endhint %}

{% tabs %}
{% tab title="Kotlin" %}

```kotlin
import io.hackle.sdk.HackleClient  
  
hackleClient.close()
```

{% endtab %}

{% tab title="Java" %}

```java
import io.hackle.sdk.HackleClient  

hackleClient.close();
```

{% endtab %}
{% endtabs %}

#### 스프링 프레임워크를 사용하시는 경우

`HackleClient`를 빈(bean)으로 등록하는 것이 가장 좋은 방법입니다.\
어플리케이션 생명주기 동안 싱글 인스턴스로 관리가 되며 어플리케이션 종료 시 `close()`까지 자동으로 호출됩니다.

#### Hackle Client 를 wrapping 하여 사용하시는 경우

wrapping 클래스에 `AutoClosable` implementation 하시고 `close()` 시에 HackleClient 의 `close()`를 호출 하시는 방법을 권장드립니다.

{% tabs %}
{% tab title="Kotlin" %}

```kotlin
import io.hackle.sdk.HackleClient

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

{% endtab %}

{% tab title="Java" %}

```java
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();
    }
}
```

{% endtab %}
{% endtabs %}


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://docs.hackle.io/development-guide/java-kotlin.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
