# 테스트 그룹 분배

A/B 테스트를 진행할 때, 테스트 그룹을 대상으로 사용자를 분배하고 각 테스트 그룹에 해당하는 로직을 작성해야 합니다. 이 때 사용자 분배를 핵클 SDK를 통해 진행할 수 있습니다.

## variation

{% hint style="info" %}
Node.js SDK를 사용하는 경우 동일한 사용자가 1분 이내에 연속으로 발생시킨 동일한 A/B 테스트 분배결과에 대한 노출 이벤트를 제거합니다.

1분 이내의 이벤트는 1회로 계산됩니다.
{% endhint %}

{% hint style="warning" %}
서버 SDK에서는 코호트 타겟팅을 지원하지 않습니다. 타겟팅에 코호트가 포함된 경우 클라이언트 SDK에서 테스트를 수행해주세요.
{% endhint %}

`variation()` 메소드에 **실험 키**와 **사용자 식별자**를 전달하면 사용자를 분배하고 결과를 전달받을 수 있습니다. 이후 테스트 그룹 별 로직을 구현합니다.

아래 예제 코드에서는 실험 키 42를 전달하고 있으며, 테스트 그룹은 A와 B 두 개가 존재합니다.

```javascript
hackleClient.onReady(function() {
  const user = { id: "ae2182e0" };
  // 실험 키가 42인 A/B 테스트에서 사용자에게 노출할 테스트 그룹을 결정합니다.
  // 결정하지 못하는 상황인 경우 테스트 그룹 A를 반환합니다.
  const variation = hackleClient.variation(42, user);
  
  if (variation === "A") {
    // 그룹 A 로직
  } else if (variation === "B") {
    // 그룹 B 로직
  }
});
```

## variationDetail

`variationDetail()` 메소드는 `variation()` 메소드와 동일하게 동작하고 추가로 특정 그룹으로 분배된 사유를 같이 제공합니다. 이 메소드는 분배가 잘 되고 있는지 살펴볼 때 유용하게 사용할 수 있습니다.\
파라미터로 실험 키를 전달해야 합니다. 아래 예제 코드의 경우 실험 키 42를 전달하고 있습니다.

```javascript
hackleClient.onReady(function() {
  const user = { id: "ae2182e0" };
  // 분배 결정 상세
  const decision = hackleClient.variationDetail(42, user);
  // 분배 그룹
  const variation = decision.variation;
  // 분배 결정 사유
  const reason = decision.reason;
});
```

분배 결정 사유는 **`SDK_NOT_READY`** 와 같은 형태로 받게 됩니다. 자세한 내용은 아래 표를 참고해주세요.

<table><thead><tr><th width="319.12109375">분배 사유</th><th width="305.35546875">설명</th><th>분배 결과</th></tr></thead><tbody><tr><td><code>SDK_NOT_READY</code></td><td><p>SDK 사용 준비가 되지 않았습니다.</p><p>(예: 잘못된 SDK 키로 초기화 시도)</p></td><td>A (기본 그룹)</td></tr><tr><td><code>EXPERIMENT_NOT_FOUND</code></td><td>전달한 실험 키에 대한 A/B 테스트를 찾을 수 없습니다. 실험 키가 잘못되었거나 해당 실험이 보관 상태일 수 있습니다.</td><td>A (기본 그룹)</td></tr><tr><td><code>NOT_IN_MUTUAL_EXCLUSION_EXPERIMENT</code></td><td>실험이 상호 배타적 설정에 포함되어 있지만<br>해당 상호 배타적 그룹에 할당되지 않은 경우</td><td>A (기본 그룹)</td></tr><tr><td><code>EXPERIMENT_DRAFT</code></td><td>A/B 테스트가 준비 상태입니다.</td><td>A (기본 그룹)</td></tr><tr><td><code>EXPERIMENT_PAUSED</code></td><td>A/B 테스트가 일시 정지 상태입니다.</td><td>A (기본 그룹)</td></tr><tr><td><code>EXPERIMENT_COMPLETED</code></td><td>A/B 테스트가 종료되었습니다.</td><td>종료 시 선택한승리 그룹</td></tr><tr><td><code>OVERRIDDEN</code></td><td>사용자가 수동할당에 의해<br>특정 그룹으로 결정되었습니다.</td><td>수동 할당한<br>그룹</td></tr><tr><td><code>NOT_IN_EXPERIMENT_TARGET</code></td><td>사용자가 A/B 테스트 타겟이 아닙니다.</td><td>A (기본 그룹)</td></tr><tr><td><code>TRAFFIC_NOT_ALLOCATED</code></td><td>A/B 테스트가 실행 중이지만<br>사용자가 테스트에 할당되지 않았습니다.</td><td>A (기본 그룹)</td></tr><tr><td><code>TRAFFIC_ALLOCATED</code></td><td>사용자가 A/B 테스트에 할당되었습니다.</td><td>할당된 그룹</td></tr><tr><td><code>VARIATION_DROPPED</code></td><td>원래 할당된 그룹이 테스트에서 제외되었습니다.</td><td>A (기본 그룹)</td></tr><tr><td><code>INVALID_INPUT</code></td><td>입력값이 유효하지 않습니다.</td><td>A (기본 그룹)</td></tr><tr><td><code>EXCEPTION</code></td><td>알 수 없는 오류가 발생했습니다.</td><td>A (기본 그룹)</td></tr></tbody></table>

## 파라미터

* `variationDetail()` 메소드를 통해 분배된 그룹의 파라미터 값도 같이 제공받을 수 있습니다.
* config 객체와 `get()` 메소드를 통해 A/B 테스트 화면에서 설정한 파라미터 설정 값을 받아 활용할 수 있으며 A/B 테스트의 파라미터 설정 화면에서 값을 변경할 경우, 변경된 값이 코드에 적용됩니다.

```javascript
hackleClient.onReady(function() {
  const user = { id: "ae2182e0" }
  
  // 분배 결정 상세
  const decision = hackleClient.variationDetail(42, user);
  
  //분배 결정 상세에서 get() 메소드를 통해 parameter 값 가져오기
  const parameterValue = decision.get("parameterKey", "defaultValue")

  // string 유형의 parameter값 예제
  const strValue = decision.get("parmeterKey", "defaultValue")
});
```

* `get()` 메소드의 parameterKey는 A/B 테스트의 파라미터 설정에서 설정한 키 정보이며 defaultValue는 분배 결정 실패 시, 또는 잘못된 파라미터 유형의 값을 넣었을 때 Return되는 값입니다.
* 설정한 정보를 제대로 받기 위해서는 defaultValue에 설정하신 파라미터 유형에 맞는 type의 값을 입력해야 합나다.
* JSON 타입은 문자열(String)형태로 받을 수 있으므로, JSON 타입의 경우 defaultValue를 문자열 타입으로 입력해야 합니다.
* SDK에서 제공되는 파라미터 유형은 string, number, boolean 이며 A/B 테스트 화면에서 설정한 JSON 타입은 문자열(String)형태로 받을 수 있습니다. JSON 타입의 default 값은 문자열 타입으로 입력해야 합니다.


---

# 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/nodejs/node-variation.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.
