기능 플래그 결정

📘

기능 플래그는 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 기능
}

featureFlagDetail

featureFlagDetail() 메소드는 isFeatureOn() 메소드와 동일하게 동작하고 추가로 상태 결정에 대한 사유를 같이 제공합니다. 수동할당이 잘 되고 있는지 알아보거나 설정한 트래픽 할당 대비 결과 비중이 이상하다고 여길 때 유용하게 활용할 수 있습니다.

파라미터로 기능 키를 전달해야 합니다. 아래 예제 코드의 경우 기능 키 42를 전달하고 있습니다.

import io.hackle.sdk.HackleClient  
import io.hackle.sdk.common.decision.FeatureFlagDecision

FeatureFlagDecision decision = hackleClient.featureFlagDetail(42, "ae03e1adf");

// 기능 on/off 여부
boolean isFeatureOn = decision.isOn();

// 상태 결정 사유
DecisionReason reason = decision.getReason();
import io.hackle.sdk.HackleClient  
import io.hackle.sdk.common.decision.FeatureFlagDecision

val decision: FeatureFlagDecision = hackleClient.featureFlagDetail(42, "ae03e1adf")

// 기능 on/off 여부
val isFeatureOn: Boolean = decision.isOn()

// 상태 결정 사유
val reason: DecisionReason = decision.getReason()

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

사유설명분배 결과
SDK_NOT_READYSDK 사용 준비가 되지 않았습니다.
(예: 잘못된 SDK 키로 초기화 시도)
기본 상태(꺼짐/off)
FEATURE_FLAG_NOT_FOUND전달한 기능 키에 대한 기능 플래그를 찾을 수 없습니다.
기능 키가 잘못되었거나 해당 기능 플래그가 보관 상태일 수 있습니다.
기본 상태(꺼짐/off)
FEATURE_FLAG_INACTIVE기능 플래그가 꺼짐 상태입니다기본 상태(꺼짐/off)
INDIVIDUAL_TARGET_MATCH개별 타겟팅에 매치 되었습니다.개별 타겟팅으로 설정한 상태
TARGET_RULE_MATCH사용자 타겟팅에 매치 되었습니다.사용자 타겟팅으로 설정한 상태
DEFAULT_RULE개별 타겟팅, 사용자 타겟팅 중 어디에도 매치 되지 않았습니다.기본 룰로 설정한 상태
EXCEPTION알 수 없는 오류가 발생했습니다.기본 상태(꺼짐/off)

📘

노출 이벤트 중복 제거

Java/Kotlin SDK를 사용하는 경우 동일한 사용자가 1분 이내에 연속으로 발생시킨 동일한 기능플래그 분배결과에 대한 노출 이벤트를 제거합니다. 1분 이내의 이벤트는 1회로 계산됩니다.

기능 플래그 파라미터

  • featureFlagDetail() 메소드를 통해 상태 결정에 대한 파라미터 값도 같이 제공받을 수 있습니다.
  • featureFlagDetail() 메소드를 통해 전달받은 FeatureFlagDecision 인스턴스에는 전체 파라미터 설정 정보가 담긴 ParameterConfig 객체가 존재합니다.
  • 핵클의 기능 플래그 화면에서 설정한 파라미터 값이 key, value 형태로 존재하기 때문에, 설정한 파라미터 유형에 따라 아래 메소드를 사용하여 설정한 파라미터 값을 받아 활용할 수 있습니다.
  • 기능 플래그의 파라미터 설정화면에서 값을 유동적으로 변경할 수 있습니다.

📘

파라미터 설정은 SDK 버전 2.8.0 이상인 경우 사용 가능합니다.

getString

  • STRING, JSON 유형으로 설정된 parameter값을 반환합니다.
  • 상태 결정에 따라 False 또는 True에 설정된 값을 반환합니다.
import io.hackle.sdk.HackleClient  
import io.hackle.sdk.common.decision.FeatureFlagDecision
import io.hackle.sdk.common.ParameterConfig

FeatureFlagDecision decision = hackleClient.featureFlagDetail(42, “ae03e1adf”);
ParameterConfig config = decision.getConfig();
  
String strValue = decision.getString(“parameter_key_string_type”, “defaultValue”);
String strValueInConfig = config.getString(“parameter_key_string_type”, “defaultValue”);
  
String jsonValue = decision.getString(“parameter_key_json_type”, “defaultValue”);
String jsonValueInConfig = config.getString(“parameter_key_json_type”, “defaultValue”);
import io.hackle.sdk.HackleClient  
import io.hackle.sdk.common.decision.FeatureFlagDecision
import io.hackle.sdk.common.ParameterConfig
  
val decision: FeatureFlagDecision = hackleClient.featureFlagDetail(42, “ae03e1adf”)
val config: ParameterConfig = decision.config

val strValue: String = decision.getString(“parameter_key_string_type”, “defaultValue”)
val strValueInConfig: String = config.getString(“parameter_key_string_type”, “defaultValue”)

val jsonValue: String = decision.getString(“parameter_key_json_type”, “defaultValue”)
val jsonValueInConfig: String = config.getString(“parameter_key_json_type”, “defaultValue”)

getInt

  • Number 유형으로 설정된 parameter 값을 Int 타입으로 반환합니다.
  • 상태 결정에 따라 False 또는 True에 설정된 값을 반환합니다.
import io.hackle.sdk.HackleClient  
import io.hackle.sdk.common.decision.FeatureFlagDecision
import io.hackle.sdk.common.ParameterConfig  
  
FeatureFlagDecision decision = hackleClient.featureFlagDetail(42, “ae03e1adf”);
ParameterConfig config = decision.getConfig();
  
int intValue = decision.getInt(“parameter_key_number_type”, 0);
int intValueInConfig = config.getInt(“parameter_key_number_type”, 0);
import io.hackle.sdk.HackleClient  
import io.hackle.sdk.common.decision.FeatureFlagDecision
import io.hackle.sdk.common.ParameterConfig
  
val decision: FeatureFlagDecision = hackleClient.featureFlagDetail(42, “ae03e1adf”)
val config: ParameterConfig = decision.config
  
val intValue: Int = decision.getInt(“parameter_key_number_type”, 0)
val intValueInConfig: Int = config.getInt(“parameter_key_number_type”, 0)

getDouble

  • Number 유형으로 설정된 parameter 값을 Double 타입으로 반환합니다.
  • 상태 결정에 따라 False 또는 True에 설정된 값을 반환합니다.
import io.hackle.sdk.HackleClient  
import io.hackle.sdk.common.decision.FeatureFlagDecision
import io.hackle.sdk.common.ParameterConfig  
  
FeatureFlagDecision decision = hackleClient.featureFlagDetail(42, “ae03e1adf”);
ParameterConfig config = decision.getConfig();
  
double doubleValue = decision.getDouble(“parameter_key_number_type”, 0.0);
double doubleValueInConfig = config.getDouble(“parameter_key_number_type”, 0.0);
import io.hackle.sdk.HackleClient  
import io.hackle.sdk.common.decision.FeatureFlagDecision
import io.hackle.sdk.common.ParameterConfig  
  
val decision: FeatureFlagDecision = hackleClient.featureFlagDetail(42, “ae03e1adf”)
val config: ParameterConfig = decision.config
  
val doubleValue: Double = decision.getDouble(“parameter_key_number_type”, 0.0)
val doubleValueInConfig: Double = config.getDouble(“parameter_key_number_type”, 0.0)

getLong

  • Number 유형으로 설정된 parameter 값을 Long 타입으로 반환합니다.
  • 상태 결정에 따라 False 또는 True에 설정된 값을 반환합니다.
import io.hackle.sdk.HackleClient  
import io.hackle.sdk.common.decision.FeatureFlagDecision
import io.hackle.sdk.common.ParameterConfig  
  
FeatureFlagDecision decision = hackleClient.featureFlagDetail(42, “ae03e1adf”);
ParameterConfig config = decision.getConfig();
  
long longValue = decision.getLong(“parameter_key_number_type”, 0L);
long longValueInConfig = config.getLong(“parameter_key_number_type”, 0L);
import io.hackle.sdk.HackleClient  
import io.hackle.sdk.common.decision.FeatureFlagDecision
import io.hackle.sdk.common.ParameterConfig  
  
val decision: FeatureFlagDecision = hackleClient.featureFlagDetail(42, “ae03e1adf”)
val config: ParameterConfig = decision.config
  
val longValue: Long = decision.getLong(“parameter_key_number_type”, 0L)
val longValueInConfig: Long = config.getLong(“parameter_key_number_type”, 0L)

getBoolean

  • Boolean 유형으로 설정된 parameter값을 반환합니다.
  • 상태 결정에 따라 False 또는 True에 설정된 값을 반환합니다.
import io.hackle.sdk.HackleClient  
import io.hackle.sdk.common.decision.FeatureFlagDecision
import io.hackle.sdk.common.ParameterConfig  

FeatureFlagDecision decision = hackleClient.featureFlagDetail(42, “ae03e1adf”);
ParameterConfig config = decision.getConfig();

boolean booleanValue = decision.getBoolean(“parameter_key_boolean_type”, false);
boolean booleanValueInConfig = config.getBoolean(“parameter_key_boolean_type”, false);
import io.hackle.sdk.HackleClient  
import io.hackle.sdk.common.decision.FeatureFlagDecision
import io.hackle.sdk.common.ParameterConfig  
  
val decision: FeatureFlagDecision = hackleClient.featureFlagDetail(42, “ae03e1adf”)
val config: ParameterConfig = decision.config
  
val booleanValue: Boolean = decision.getBoolean(“parameter_key_boolean_type”, false)
val booleanValueInConfig: Boolean = config.getBoolean(“parameter_key_boolean_type”, false)