테스트 그룹 분배
A/B 테스트를 진행할 때, 테스트 그룹을 대상으로 사용자를 분배하고 각 테스트 그룹에 해당하는 로직을 작성해야 합니다. 이 때 사용자 분배를 핵클 SDK를 통해 진행할 수 있습니다.
테스트 그룹
테스트 그룹은 테스트 대상이 되는 기존안(대조군)과 개선안(실험군)을 의미하며, 개선안은 1개 이상일 수 있습니다. 대시보드에서 설정 가능하며, 테스트 그룹을 관리하는 방법에 대해서는 A/B 테스트 설정 문서를 참고하시기 바랍니다.
variation
variation()
메소드에 실험 키를 전달하면 사용자를 분배하고 결과를 전달받을 수 있습니다. 이후 테스트 그룹 별 로직을 구현합니다.
아래 예제 코드에서는 실험 키 42를 전달하고 있으며, 테스트 그룹은 A와 B 두 개가 존재합니다.
// 실험 키가 42인 A/B 테스트에서 사용자에게 노출할 테스트 그룹을 결정합니다.
// 결정하지 못하는 상황인 경우 테스트 그룹 A를 반환합니다.
let variation = hackleApp.variation(experimentKey: 42)
// 할당받은 그룹에 대한 로직
if variation == "A" {
// 그룹 A 로직
} else if variation == "B" {
// 그룹 B 로직
}
// 실험 키가 42인 A/B 테스트에서 사용자에게 노출할 테스트 그룹을 결정합니다.
// 결정하지 못하는 상황인 경우 테스트 그룹 A를 반환합니다.
NSString *variation = [app variationWithExperimentKey:42 defaultVariation:@"A"];
// 할당받은 그룹에 대한 로직
if([variation isEqual:@"A"]) {
// 그룹 A 로직
} else if ([variation isEqual:@"B"]) {
// 그룹 B 로직
}
variationDetail
variationDetail()
메소드는 variation()
메소드와 동일하게 동작하고 추가로 특정 그룹으로 분배된 사유를 같이 제공합니다. 이 메소드는 분배가 잘 되고 있는지 살펴볼 때 유용하게 사용할 수 있습니다.
파라미터로 실험 키를 전달해야 합니다. 아래 예제 코드의 경우 실험 키 42를 전달하고 있습니다.
// 분배 결정 상세
let decision: Decision = hackleApp.variationDetail(experimentKey: 42)
// 분배 그룹
let variation: String = decision.variation
// 분배 결정 사유
let reason: String = decision.reason
// 분배 결정 상세
Decision *decision = [hackleApp variationDetailWithExperimentKey:@42 defaultVariation:@"A"];
// 분배 그룹
NSString *variation = [decision variation];
// 분배 결정 사유
NSString *reason = [decision reason];
분배 결정 사유는 SDK_NOT_READY
와 같은 형태로 받게 됩니다. 자세한 내용은 아래 표를 참고해주세요.
사유 | 설명 | 분배 결과 |
---|---|---|
SDK_NOT_READY | SDK 사용 준비가 되지 않았습니다. (예: 잘못된 SDK 키로 초기화 시도) | 기본 그룹(A) |
EXPERIMENT_NOT_FOUND | 전달한 실험 키에 대한 A/B 테스트를 찾을 수 없습니다. 실험 키가 잘못되었거나 해당 실험이 보관 상태일 수 있습니다. | 기본 그룹(A) |
NOT_IN_MUTUAL_EXCLUSION_EXPERIMENT | 실험이 상호 배타적 설정에 포함되어 있지만 해당 상호 배타적 그룹에 할당되지 않은 경우 | 기본 그룹(A) |
EXPERIMENT_DRAFT | A/B 테스트가 준비 상태입니다. | 기본 그룹(A) |
EXPERIMENT_PAUSED | A/B 테스트가 일시 정지 상태입니다. | 기본 그룹(A) |
EXPERIMENT_COMPLETED | A/B 테스트가 종료되었습니다. | 종료 시 선택한 승리 그룹 |
OVERRIDDEN | 사용자가 수동할당에 의해 특정 그룹으로 결정되었습니다. | 수동할당한 그룹 |
NOT_IN_EXPERIMENT_TARGET | 사용자가 A/B 테스트 대상이 아닙니다. | 기본 그룹(A) |
TRAFFIC_NOT_ALLOCATED | 사용자가 A/B 테스트 대상이지만 트래픽에 할당되지 않았습니다. | 기본 그룹(A) |
TRAFFIC_ALLOCATED | 사용자가 A/B 테스트에 할당되었습니다. | 할당된 그룹 |
VARIATION_DROPPED | 원래 할당된 그룹이 테스트에서 제외되었습니다. | 기본 그룹(A) |
EXCEPTION | 알 수 없는 오류가 발생했습니다. | 기본 그룹(A) |
파라미터
variationDetail()
메소드를 통해 분배된 그룹의 파라미터 값도 같이 제공받을 수 있습니다.variationDetail()
메소드를 통해 전달받은 Decision 인스턴스에는 전체 파라미터 설정 정보가 담긴ParameterConfig
객체가 존재합니다.- 핵클의 A/B 테스트 화면에서 설정한 파라미터 값이 key, value 형태로 존재하기 때문에, 설정한 파라미터 유형에 따라 아래 메소드를 사용하여 설정한 파라미터 값을 받아 활용할 수 있습니다.
파라미터 설정은 SDK 버전 2.9.0 이상인 경우 사용 가능합니다.
getString
- STRING, JSON 유형으로 설정된 parameter값을 반환합니다.
- 분배된 그룹의 설정된 값을 반환합니다.
let decision: Decision = hackleApp.variationDetail(experimentKey: 42)
let config: ParameterConfig = decision.config
let strValue: String = decision.getString(forKey: "parameter_key_string_type", defaultValue: "defaultValue")
let strValueInConfig: String = config.getString(forKey: "parameter_key_string_type", defaultValue: "defaultValue")
let jsonValue: String = decision.getString(forKey: "parameter_key_json_type", defaultValue: "defaultValue")
let jsonValueInConfig: String = config.getString(forKey: "parameter_key_json_type", defaultValue: "defaultValue")
Decision *decision = [hackleApp variationDetailWithExperimentKey:@42 defaultVariation:@"A"];
NSString *stringValue = [decision getStringForKey:@"parameter_key_string_type" defaultValue:@"defaultValue"];
NSString *jsonValue = [decision getStringForKey:@"parameter_key_json_type" defaultValue:@"defaultValue"];
getInt
- Number 유형으로 설정된 parameter 값을 Int 타입으로 반환합니다.
- 분배된 그룹의 설정된 값을 반환합니다.
let decision: Decision = hackleApp.variationDetail(experimentKey: 42)
let config: ParameterConfig = decision.config
let intValue: Int = decision.getInt(forKey: "parameter_key_number_type", defaultValue: 0)
let intValueInConfig: Int = config.getInt(forKey: "parameter_key_number_type", defaultValue: 0)
Decision *decision = [hackleApp variationDetailWithExperimentKey:@42 defaultVariation:@"A"];
int intValue = [decision getIntForKey:@"parameter_key_number_type" defaultValue:@0];
getDouble
- Number 유형으로 설정된 parameter 값을 Double 타입으로 반환합니다.
- 분배된 그룹의 설정된 값을 반환합니다.
let decision: Decision = hackleApp.variationDetail(experimentKey: 42)
let config: ParameterConfig = decision.config
let doubleValue: Double = decision.getDouble(forKey: "parameter_key_number_type", defaultValue: 0.0)
let doubleValueInConfig: Double = config.getDouble(forKey: "parameter_key_number_type", defaultValue: 0.0)
Decision *decision = [hackleApp variationDetailWithExperimentKey:@42 defaultVariation:@"A"];
double doubleValue = [decision getDoubleForKey:@"parameter_key_number_type" defaultValue:0.0];
getBool
- Bool 유형으로 설정된 parameter값을 반환합니다.
- 분배된 그룹의 설정된 값을 반환합니다.
let decision: Decision = hackleApp.variationDetail(experimentKey: 42)
let config: ParameterConfig = decision.config
let boolValue: Bool = decision.getBool(forKey: "parameter_key_boolean_type", defaultValue: false)
let boolValueInConfig: Bool = config.getBool(forKey: "parameter_key_boolean_type", defaultValue: false)
Decision *decision = [hackleApp variationDetailWithExperimentKey:@42 defaultVariation:@"A"];
bool boolValue = [decision getBoolForKey:@"parameter_key_boolean_type" defaultValue:false];
Updated 11 months ago