JavaScript 기능 관리
JavaScript 기능 관리 라이브러리는 기능 플래그를 기반으로 애플리케이션 기능을 개발하고 노출하는 방법을 제공합니다. 새로운 기능이 개발되면 많은 애플리케이션에는 해당 기능을 사용하도록 설정해야 하는 시기와 조건 등 특별한 요구 사항이 있습니다. 이 라이브러리는 이러한 관계를 정의하는 방법을 제공하고 일반적인 JavaScript 코드 패턴에 통합되어 이러한 기능을 노출할 수 있도록 합니다.
기능 플래그는 JavaScript 애플리케이션이 기능을 동적으로 켜거나 끌 수 있는 방법을 제공합니다. 개발자는 조건문과 같은 간단한 사용 사례에서 기능 플래그를 사용할 수 있습니다.
JavaScript 기능 관리 라이브러리를 사용할 경우의 이점은 다음과 같습니다.
- 기능 관리에 대한 일반적인 규칙
- 진입 장벽이 낮음
- JSON 개체와 지도 기반 기능 플래그 원본을 모두 지원합니다.
- Node.js 및 브라우저 환경 모두에서 사용 지원
- Azure 앱 구성을 사용하여 기능 플래그 수명 관리
- 구성 값은 실시간으로 변경할 수 있습니다.
- 간단한 시나리오에서 복잡한 시나리오를 다룹니다.
- 선언적 구성 파일을 통해 기능 켜기/끄기 전환
- 서버 호출을 기반으로 기능 상태를 동적으로 평가합니다.
JavaScript 기능 관리 라이브러리는 오픈 소스. 자세한 내용을 보려면 GitHub 리포지토리를 참조하세요.
참고 항목
기능 관리 라이브러리를 Azure 앱 Configuration과 함께 사용하는 것이 좋습니다. Azure 앱 구성은 애플리케이션 설정 및 기능 플래그를 중앙에서 관리하기 위한 솔루션을 제공합니다. 자세한 내용은 이 섹션을 참조하세요.
기능 플래그
기능 플래그는 이름과 기능을 활성화하는 데 사용되는 기능 필터 목록의 두 부분으로 구성됩니다.
기능 필터
기능 필터는 기능을 사용하도록 설정해야 하는 경우에 대한 시나리오를 정의합니다. 기능의 켜기 또는 끄기를 평가할 때 필터 중 하나가 해당 기능을 사용하도록 설정해야 한다고 결정할 때까지 해당 기능 필터 목록이 트래버스됩니다. 이 시점에서 기능은 사용하도록 설정된 것으로 간주되며 기능 필터를 통한 트래버스가 중지됩니다. 기능을 사용하도록 설정해야 함을 나타내는 기능 필터가 없으면 사용하지 않도록 설정된 것으로 간주됩니다.
예를 들어, Microsoft Edge 브라우저 기능 필터를 설계할 수 있습니다. 이 기능 필터는 HTTP 요청이 Microsoft Edge에서 오는 한, 연결된 모든 기능을 활성화합니다.
기능 플래그 구성
JavaScript에서 개발자는 일반적으로 개체 또는 맵을 기본 데이터 구조로 사용하여 구성을 나타냅니다. JavaScript 기능 관리 라이브러리는 두 가지 구성 접근 방식을 모두 지원하므로 개발자는 요구 사항에 가장 적합한 옵션을 유연하게 선택할 수 있습니다. 기본 FeatureManager
제공 ConfigurationObjectFeatureFlagProvider
및 ConfigurationMapFeatureFlagProvider
을 사용하여 다양한 유형의 구성에서 기능 플래그를 읽을 수 있습니다.
const config = new Map([
["feature_management", {
"feature_flags": [
{
"id": "FeatureT",
"enabled": true
},
{
"id": "FeatureU",
"enabled": false
}
]
}],
["some other configuration", " some value"]
]);
import { ConfigurationMapFeatureFlagProvider, FeatureManager } from "@microsoft/feature-management";
const featureProvider = new ConfigurationMapFeatureFlagProvider(config);
const featureManager = new FeatureManager(featureProvider);
Azure 앱 구성의 기능 플래그 사용
기능 플래그를 애플리케이션에 하드 코딩하는 대신, 기능 플래그를 애플리케이션 외부에 유지하고 별도로 관리하는 것이 좋습니다. 이렇게 하면 언제든지 플래그 상태를 수정하고 해당 변경 내용을 애플리케이션에 즉시 적용할 수 있습니다. Azure App Configuration 서비스는 모든 기능 플래그를 관리하기 위한 전용 포털 UI를 제공합니다. 자습서를 참조하세요.
또한 Azure 앱 Configuration 서비스는 JavaScript 클라이언트 라이브러리 @azure/app-configuration-provider를 통해 애플리케이션에 기능 플래그를 직접 제공합니다. 다음 예제에서는 라이브러리를 사용하는 방법을 보여줍니다.
App Configuration JavaScript 공급자는 개체에 기능 플래그를 Map
제공합니다. 기본 제공 ConfigurationMapFeatureFlagProvider
은 이 경우 기능 플래그를 로드하는 데 도움이 됩니다.
import { DefaultAzureCredential } from "@azure/identity";
import { load } from "@azure/app-configuration-provider";
import { ConfigurationMapFeatureFlagProvider, FeatureManager } from "@microsoft/feature-management";
const appConfig = await load("YOUR_APP-CONFIG-ENDPOINT",
new DefaultAzureCredential(), // For more information: https://learn.microsoft.com/javascript/api/overview/azure/identity-readme
{featureFlagOptions: { enabled: true }}); // load feature flags from Azure App Configuration service
const featureProvider = new ConfigurationMapFeatureFlagProvider(appConfig);
const featureManager = new FeatureManager(featureProvider);
참고 항목
Azure 앱 Configuration에서 기능 관리 라이브러리를 사용하는 방법에 대한 자세한 내용은 빠른 시작을 참조하세요.
기능 플래그 선언
다음 예제에서는 JSON 파일에서 기능 플래그를 설정하는 데 사용되는 형식을 보여줍니다.
{
"feature_management": {
"feature_flags": [
{
"id": "FeatureT",
"enabled": true
},
{
"id": "FeatureU",
"enabled": false
},
{
"id": "FeatureV",
"enabled": true,
"conditions": {
"client_filters": [
{
"name": "Microsoft.TimeWindow",
"parameters": {
"Start": "Wed, 01 May 2019 13:59:59 GMT",
"End": "Mon, 01 Jul 2019 00:00:00 GMT"
}
}
]
}
}
]
}
}
이 feature_management
섹션은 규칙에 따라 기능 플래그 설정을 로드하는 데 사용됩니다.
feature_flags
섹션은 라이브러리에 로드되는 기능 플래그 목록입니다. 위 섹션에서는 세 가지 다른 기능을 볼 수 있습니다. 기능은 conditions
내에서 client_filters
속성을 사용하여 기능 필터를 정의합니다. 기능 필터FeatureT
에서 정의된 필터 FeatureT
가 true
없으므로 enabled
항상 반환됩니다 true
.
FeatureU
는 FeatureT
와 동일하지만 enabled
는 false
이므로 해당 기능이 항상 false
를 반환합니다.
FeatureV
는 Microsoft.TimeWindow
라는 기능 필터를 지정합니다.
FeatureV
는 구성 가능한 기능 필터의 예입니다. 이 예에서 필터에 parameters
속성이 있음을 볼 수 있습니다.
parameters
속성은 필터를 구성하는 데 사용됩니다. 이 경우 해당 기능이 활성화되는 시작 및 종료 시간이 구성됩니다.
feature_management
섹션의 자세한 스키마는 여기에서 확인할 수 있습니다.
고급: 기능 플래그 이름에는 콜론 ':'을 사용할 수 없습니다.
요구 사항 유형
기능 플래그의 requirement_type
속성은 기능 상태를 평가할 때 필터가 Any
또는 All
논리를 사용해야 하는지 결정하는 데 사용됩니다.
requirement_type
이 지정되지 않은 경우 기본값은 Any
입니다.
-
Any
는 기능을 사용하도록 설정하려면 하나의 필터만 true로 평가되어야 함을 의미합니다. -
All
은 기능을 사용하도록 설정하려면 모든 필터가 true로 평가되어야 함을 의미합니다.
All
중 requirement_type
은 트래버스를 변경합니다. 첫째, 필터가 없으면 기능이 사용하지 않도록 설정됩니다. 그런 다음 필터 중 하나가 해당 기능을 사용하지 않도록 설정해야 한다고 결정할 때까지 기능 필터가 트래버스됩니다. 기능을 사용하지 않도록 설정해야 함을 나타내는 필터가 없으면 사용하도록 설정된 것으로 간주됩니다.
{
"feature_management": {
"feature_flags": [
{
"id": "FeatureW",
"enabled": true,
"conditions": {
"requirement_type": "All",
"client_filters": [
{
"name": "Microsoft.TimeWindow",
"parameters": {
"Start": "Wed, 01 May 2019 13:59:59 GMT",
"End": "Mon, 01 Jul 2019 00:00:00 GMT"
}
},
{
"name": "Percentage",
"parameters": {
"Value": "50"
}
}
]
}
},
]
}
}
위의 예에서 FeatureW
는 All
의 requirement_type
을 지정합니다. 즉, 기능을 사용하도록 설정하려면 모든 필터가 true로 평가되어야 합니다. 이 경우 지정된 기간 동안 50%의 사용자에게 이 기능이 사용하도록 설정됩니다.
소비
기능 관리의 기본 형태는 기능 플래그가 사용하도록 설정되어 있는지 확인한 다음 그 결과에 따라 작업을 수행하는 것입니다. 기능 플래그의 상태를 확인하는 작업은 FeatureManager
의 isEnabled
메서드를 통해 수행됩니다.
import { ConfigurationMapFeatureFlagProvider, FeatureManager } from "@microsoft/feature-management";
const featureProvider = new ConfigurationMapFeatureFlagProvider(config);
const featureManager = new FeatureManager(featureProvider);
const isBetaEnabled = await featureManager.isEnabled("Beta");
if (isBetaEnabled) {
// Do something
}
기능 필터 구현
기능 필터를 만들면 정의한 기준에 따라 기능을 사용하도록 설정할 수 있습니다. 기능 필터를 구현하려면 IFeatureFilter
인터페이스를 구현해야 합니다.
IFeatureFilter
에는 name
속성과 이름이 지정된 evaluate
메서드가 있습니다. 구성 name
에서 기능 플래그 내에서 기능 필터를 참조하는 데 사용해야 합니다. 기능이 기능 필터에 대해 사용하도록 설정될 수 있음을 지정하면 evaluate
메서드가 호출됩니다.
evaluate
가 true
를 반환하는 경우 해당 기능을 사용하도록 설정해야 한다는 의미입니다.
interface IFeatureFilter {
name: string;
evaluate(context: IFeatureFilterEvaluationContext, appContext?: unknown): boolean | Promise<boolean>;
}
다음 코드 조각에서는 이름으로 MyCriteria
사용자 지정된 기능 필터를 구현하는 방법을 보여 줍니다.
class MyCriteriaFilter {
name = "MyCriteria";
evaluate(context, appContext) {
if (satisfyCriteria()) {
return true;
}
else {
return false;
}
}
}
를 만들 때 사용자 지정 필터를 FeatureManager
등록해야 합니다.
const featureManager = new FeatureManager(ffProvider, {customFilters: [new MyCriteriaFilter()]});
매개 변수가 있는 기능 필터
일부 기능 필터에는 기능을 켜야 하는지 여부를 결정하는 매개 변수가 필요합니다. 예를 들어, 브라우저 기능 필터는 특정 브라우저 집합에 대한 기능을 켤 수 있습니다. Edge 및 Chrome 브라우저에서는 기능을 사용하도록 설정하는 것이 바람직할 수 있지만 Firefox에서는 그렇지 않습니다. 이를 위해 매개 변수를 예상하도록 기능 필터를 설계할 수 있습니다. 이러한 매개 변수는 기능 구성에 지정되며 코드에서는 IFeatureFilter.Evaluate
의 IFeatureFilterEvaluationContext
매개 변수를 통해 액세스할 수 있습니다.
interface IFeatureFilterEvaluationContext {
featureName: string;
parameters?: unknown;
}
IFeatureFilterEvaluationContext
에는 parameters
라는 속성이 있습니다. 이러한 매개 변수는 기능 필터가 기능 사용 여부를 평가하는 방법을 결정하는 데 사용할 수 있는 원시 구성을 나타냅니다. 브라우저 기능 필터를 다시 한 번 예로 사용하기 위해 필터는 parameters
를 사용하여 기능을 위해 지정될 허용 브라우저 집합을 추출한 다음 요청이 해당 브라우저 중 하나에서 전송되고 있는지 확인할 수 있습니다.
기능 평가에 애플리케이션 컨텍스트 사용
기능 필터는 기능 플래그를 평가하기 위해 런타임 애플리케이션 컨텍스트가 필요할 수 있습니다. 를 호출 isEnabled
할 때 컨텍스트를 매개 변수로 전달할 수 있습니다.
featureManager.isEnabled("Beta", { userId : "Sam" })
기능 필터는 호출될 때 isEnabled
전달되는 컨텍스트를 활용할 수 있습니다. 애플리케이션 컨텍스트는 두 번째 매개 변수 IFeatureFilter.Evaluate
로 전달됩니다.
기본 제공 기능 필터
패키지TimeWindowFilter
TargetingFilter
와 함께 제공되는 두 가지 기능 필터가 FeatureManagement
있습니다.
기본 제공된 각 기능 필터에는 고유한 매개 변수가 있습니다. 다음은 예를 함께 보여 주는 기능 필터 목록입니다.
Microsoft.TimeWindow
이 필터는 기간을 기반으로 기능을 사용하도록 설정하는 기능을 제공합니다.
End
만 지정된 경우 해당 시간까지 기능이 사용되는 것으로 간주됩니다.
Start
만 지정된 경우 해당 시간 이후의 모든 지점에서 기능이 켜진 것으로 간주됩니다.
"client_filters": [
{
"name": "Microsoft.TimeWindow",
"parameters": {
"Start": "Wed, 01 May 2019 13:59:59 GMT",
"End": "Mon, 01 Jul 2019 00:00:00 GMT"
}
}
]
Microsoft.Targeting
이 필터는 대상 그룹 고객을 위한 기능을 사용하도록 설정하는 기능을 제공합니다. 대상 지정에 대한 자세한 설명은 아래의 대상 지정 섹션에 설명되어 있습니다. 필터 매개 변수에는 사용자, 그룹, 제외된 사용자/그룹, 기능에 액세스해야 하는 사용자 기반의 기본 비율을 설명하는 Audience
개체가 포함됩니다.
Groups
섹션에 나열된 각 그룹 개체는 액세스 권한을 가져야 하는 그룹 멤버의 비율도 지정해야 합니다. 사용자가 Exclusion
섹션에 직접 지정된 경우 또는 사용자가 제외된 그룹에 있는 경우 기능이 사용하지 않도록 설정됩니다. 또한 사용자가 Users
섹션에 직접 지정되거나, 사용자가 임의 그룹 출시의 포함된 비율에 속하거나, 사용자가 기본 출시 비율에 속하는 경우 해당 사용자는 기능을 사용하도록 설정하게 됩니다.
"client_filters": [
{
"name": "Microsoft.Targeting",
"parameters": {
"Audience": {
"Users": [
"Jeff",
"Alicia"
],
"Groups": [
{
"Name": "Ring0",
"RolloutPercentage": 100
},
{
"Name": "Ring1",
"RolloutPercentage": 50
}
],
"DefaultRolloutPercentage": 20,
"Exclusion": {
"Users": [
"Ross"
],
"Groups": [
"Ring2"
]
}
}
}
}
]
대상 지정
대상 지정은 개발자가 사용자 기반에 새로운 기능을 점진적으로 롤아웃할 수 있도록 하는 기능 관리 전략입니다. 이 전략은 대상 그룹으로 알려진 일련의 사용자를 대상으로 지정한다는 개념을 바탕으로 빌드되었습니다. 대상 그룹은 특정 사용자, 그룹, 제외된 사용자/그룹, 전체 사용자 기반 중 지정된 비율로 구성됩니다. 대상 그룹에 포함된 그룹은 전체 멤버의 비율로 더 세분화될 수 있습니다.
다음 단계에서는 새로운 '베타' 기능에 대한 점진적 출시의 예를 보여 줍니다.
- 개별 사용자인 Jeff와 Alicia에게 베타에 대한 액세스 권한이 부여됩니다.
- 다른 사용자인 Mark가 옵트인을 요청하여 포함되었습니다.
- "Ring1" 사용자로 알려진 그룹의 20%가 베타에 포함되어 있습니다.
- 베타에 포함된 "Ring1" 사용자 수는 최대 100%까지 증가합니다.
- 사용자 기반의 5%가 베타에 포함됩니다.
- 출시 비율이 100%까지 올라가고 기능이 완전히 출시됩니다.
기능을 롤아웃하기 위한 이 전략은 포함된 Microsoft.Targeting 기능 필터를 통해 라이브러리에 기본 제공됩니다.
대상 지정 컨텍스트를 사용하여 사용자 대상 지정
대상 지정 필터는 대상 지정 컨텍스트를 사용하여 기능을 켜야 하는지 여부를 평가합니다. 이 대상 지정 컨텍스트에는 현재 평가 중인 사용자 및 사용자가 속한 그룹 등의 정보가 포함됩니다. 대상 지정 컨텍스트는 호출될 때 isEnabled
직접 전달되어야 합니다.
featureManager.isEnabled("Beta", { userId: "Aiden", groups: ["Ring1"] })
대상 지정 제외
대상 그룹을 정의할 때 사용자 및 그룹을 대상 그룹에서 제외할 수 있습니다. 제외는 기능이 사용자 그룹에 출시될 때 유용하지만 일부 사용자 또는 그룹을 출시에서 제외해야 합니다. 제외는 대상 그룹의 Exclusion
속성에 사용자 및 그룹 목록을 추가하여 정의됩니다.
"Audience": {
"Users": [
"Jeff",
"Alicia"
],
"Groups": [
{
"Name": "Ring0",
"RolloutPercentage": 100
}
],
"DefaultRolloutPercentage": 0,
"Exclusion": {
"Users": [
"Mark"
]
}
}
위의 예에서는 Jeff
및 Alicia
라는 사용자에 대해 기능이 사용하도록 설정되었습니다.
Ring0
이라는 그룹의 사용자에 대해서도 사용하도록 설정되어 있습니다. 그러나 사용자 이름이 Mark
인 경우 그룹 Ring0
에 속해 있는지 여부에 관계없이 기능이 사용하지 않도록 설정됩니다. 제외는 나머지 대상 지정 필터보다 우선 순위가 높습니다.
변형
새로운 기능이 애플리케이션에 추가되면 기능에 여러 가지 다른 디자인 옵션이 제안되는 경우가 있을 수 있습니다. 디자인을 결정하기 위한 일반적인 솔루션은 사용자 기반의 다양한 세그먼트에 기능의 다른 버전을 제공하고 사용자 상호 작용을 기반으로 버전을 선택하는 일종의 A/B 테스트입니다. 이 라이브러리에서 이 기능은 변형이 있는 기능의 다양한 구성을 나타냄으로써 사용하도록 설정됩니다.
변형을 사용하면 기능 플래그가 단순한 켜기/끄기 플래그 이상이 될 수 있습니다. 변형은 문자열, 숫자, 부울 또는 구성 개체일 수 있는 기능 플래그의 값을 나타냅니다. 변형을 선언하는 기능 플래그는 각 변형을 사용해야 하는 상황을 정의해야 합니다. 이에 대한 자세한 내용은 변형 할당 섹션에서 다룹니다.
대상 지정 컨텍스트를 사용하여 변형 가져오기
각 기능에 대해 FeatureManager
의 getVariant
메서드를 사용하여 변형을 검색할 수 있습니다. 변형 할당은 현재 평가 중인 사용자에 따라 달라지고 해당 정보는 전달한 대상 지정 컨텍스트에서 가져옵니다.
const variant = await featureManager.getVariant("MyVariantFeatureFlag", { userId: "Sam" });
const variantName = variant.name;
const variantConfiguration = variant.configuration;
// Do something with the resulting variant and its configuration
변형 기능 플래그 선언
일반 기능 플래그와 비교하여 변형 기능 플래그에는 variants
및 allocation
이라는 두 가지 추가 속성이 있습니다.
variants
속성은 이 기능에 대해 정의된 변형을 포함하는 배열입니다.
allocation
속성은 이러한 변형을 기능에 할당하는 방법을 정의합니다. 일반 기능 플래그를 선언하는 것과 마찬가지로 JSON 파일에서 변형 기능 플래그를 설정할 수 있습니다. 다음은 변형 기능 플래그의 예입니다.
{
"feature_management": {
"feature_flags": [
{
"id": "MyVariantFeatureFlag",
"enabled": true,
"allocation": {
"default_when_enabled": "Small",
"group": [
{
"variant": "Big",
"groups": [
"Ring1"
]
}
]
},
"variants": [
{
"name": "Big"
},
{
"name": "Small"
}
]
}
]
}
}
변형 정의
각 변형에는 이름과 구성이라는 두 가지 속성이 있습니다. 이름은 특정 변형을 참조하는 데 사용되며 구성은 해당 변형의 값입니다.
configuration_value
속성을 사용하여 구성을 설정할 수 있습니다.
configuration_value
는 문자열, 숫자, 부울 또는 구성 개체일 수 있는 인라인 구성입니다.
configuration_value
를 지정하지 않으면 반환된 변형의 configuration
속성이 undefined
이 됩니다.
가능한 모든 변형 목록은 variants
속성 아래 각 기능에 대해 정의됩니다.
{
"feature_management": {
"feature_flags": [
{
"id": "MyVariantFeatureFlag",
"variants": [
{
"name": "Big",
"configuration_value": {
"Size": 500
}
},
{
"name": "Small",
"configuration_value": {
"Size": 300
}
}
]
}
]
}
}
변형 할당
기능의 변형을 할당하는 프로세스는 기능의 allocation
속성에 따라 결정됩니다.
"allocation": {
"default_when_enabled": "Small",
"default_when_disabled": "Small",
"user": [
{
"variant": "Big",
"users": [
"Marsha"
]
}
],
"group": [
{
"variant": "Big",
"groups": [
"Ring1"
]
}
],
"percentile": [
{
"variant": "Big",
"from": 0,
"to": 10
}
],
"seed": "13973240"
},
"variants": [
{
"name": "Big",
"configuration_value": "500px"
},
{
"name": "Small",
"configuration_value": "300px"
}
]
기능의 allocation
설정에는 다음과 같은 속성이 있습니다.
속성 | 설명 |
---|---|
default_when_disabled |
기능이 사용하지 않도록 설정된 것으로 간주되는 동안 변형이 요청될 때 사용해야 하는 변형을 지정합니다. |
default_when_enabled |
기능이 사용하도록 설정된 것으로 간주되고 사용자에게 다른 변형이 할당되지 않은 상태에서 변형이 요청될 때 사용해야 하는 변형을 지정합니다. |
user |
변형과 해당 변형을 할당해야 하는 사용자 목록을 지정합니다. |
group |
변형 및 그룹 목록을 지정합니다. 사용자가 그룹 중 하나 이상에 속해 있으면 변형이 할당됩니다. |
percentile |
해당 변형이 할당되기 위해 사용자가 계산한 백분율이 맞아야 하는 변형 및 백분율 범위를 지정합니다. |
seed |
percentile 에 대한 백분율 계산의 기준이 되는 값입니다. 동일한 seed 값이 사용되는 경우 특정 사용자에 대한 백분율 계산은 모든 기능에서 동일합니다.
seed 가 지정되지 않으면 기능 이름을 기반으로 기본 시드가 만들어집니다. |
기능이 사용하도록 설정되지 않은 경우 기능 관리자는 default_when_disabled
로 표시된 변형을 현재 사용자에게 할당하며 이 경우에는 Small
입니다.
기능이 사용하도록 설정된 경우 기능 관리자는 변형을 할당하기 위해 user
, group
및 percentile
할당을 순서대로 확인합니다. 이 특정 예에서 평가 중인 사용자의 이름이 Ring1
인 그룹에서 Marsha
인 경우 또는 사용자가 우연히 0에서 10번째 백분위수 사이에 속하는 경우 지정된 변형이 사용자에게 할당됩니다. 이 경우 할당된 모든 사용자는 Big
변형을 반환합니다. 이러한 할당 중 일치하는 것이 없으면 사용자에게 default_when_enabled
변형, 즉 Small
이 할당됩니다.
할당 논리는 Microsoft.Targeting 기능 필터와 유사하지만 할당에는 없지만 대상 지정에는 존재하는 일부 매개 변수가 있으며 그 반대의 경우도 마찬가지입니다. 대상 지정과 할당의 결과는 관련이 없습니다.
변형으로 사용 안 함 상태 재정의
변형을 사용하여 기능 플래그의 사용하도록 설정 상태를 재정의할 수 있습니다. 재정의하면 변형에 기능 플래그의 평가를 확장할 수 있는 기회가 제공됩니다. 변형이 있는 플래그에서 is_enabled
을(를) 호출하는 경우 기능 관리자는 현재 사용자에게 할당된 변형이 결과를 재정의하도록 구성되어 있는지 확인합니다. 재정의는 선택적 변형 속성 status_override
를 사용하여 수행됩니다. 기본적으로 이 속성은 None
으로 설정됩니다. 즉, 이 플래그가 사용 또는 사용 안 함으로 간주되는지에 따라 변형에 영향을 미치지 않습니다.
status_override
를 Enabled
로 설정하면 변형이 선택될 때 사용하도록 설정할 플래그를 재정의할 수 있습니다.
status_override
를 Disabled
로 설정하면 반대 기능이 제공되므로 변형이 선택될 때 플래그가 사용하지 않도록 설정됩니다.
enabled
상태가 false
인 기능은 재정의할 수 없습니다.
이진 파일 변형과 함께 기능 플래그를 사용하는 경우 status_override
속성이 유용할 수 있습니다. 이를 통해 백분위수 할당 및 시드와 같은 변형과 함께 제공되는 새로운 기능의 혜택을 활용하면서 애플리케이션에서 is_enabled
와 같은 API를 계속 사용할 수 있습니다.
{
"id": "MyVariantFeatureFlag",
"enabled": true,
"allocation": {
"percentile": [
{
"variant": "On",
"from": 10,
"to": 20
}
],
"default_when_enabled": "Off",
"seed": "Enhanced-Feature-Group"
},
"variants": [
{
"name": "On"
},
{
"name": "Off",
"status_override": "Disabled"
}
]
}
위의 예에서는 이 기능이 항상 사용하도록 설정되어 있습니다. 현재 사용자가 계산된 백분위수 범위 10~20에 있으면 On
변형이 반환됩니다. 그렇지 않으면 Off
변형이 반환되고 status_override
가 Disabled
와 같기 때문에 이제 기능이 사용하지 않도록 설정된 것으로 간주됩니다.
원격
기능 플래그 변경 내용이 배포되면 해당 변경 내용이 애플리케이션에 미치는 영향을 분석하는 것이 중요한 경우가 많습니다. 예를 들어, 다음과 같은 몇 가지 질문이 발생할 수 있습니다.
- 내 플래그가 예상대로 사용하거나 사용하지 않도록 설정되어 있나요?
- 대상 사용자가 예상대로 특정 기능에 액세스하고 있나요?
- 특정 사용자에게 어떤 변형이 표시되나요?
이러한 형식의 질문은 기능 플래그 평가 이벤트의 발생 및 분석을 통해 답할 수 있습니다.
원격 분석 사용
기본적으로 기능 플래그에는 원격 분석이 내보내지지 않습니다. 특정 기능 플래그에 대한 원격 분석을 게시하려면 플래그가 원격 분석 내보내기에 대해 사용하도록 설정되었음을 반드시 선언해야 합니다.
json에 정의된 기능 플래그의 경우 telemetry
속성을 사용하여 사용하도록 설정합니다.
{
"feature_management": {
"feature_flags": [
{
"id": "MyFeatureFlag",
"enabled": true,
"telemetry": {
"enabled": true
}
}
]
}
}
위의 코드 조각은 원격 분석에 사용하도록 설정된 MyFeatureFlag
라는 기능 플래그를 정의합니다.
telemetry
개체의 enabled
속성은 true
로 설정됩니다. 플래그에 대한 원격 분석을 게시하려면 enabled
속성의 값이 true
여야 합니다.
기능 플래그의 telemetry
섹션에는 다음과 같은 속성이 있습니다.
속성 | 설명 |
---|---|
enabled |
기능 플래그에 대해 원격 분석을 게시해야 하는지 여부를 지정합니다. |
metadata |
기능 플래그에 대한 사용자 지정 메타데이터를 평가 이벤트에 연결하는 데 사용할 수 있는 사전으로 모델링된 키-값 쌍의 컬렉션입니다. |
사용자 지정 원격 분석 게시
를 만들 FeatureManager
때 콜백 함수를 onFeatureEvaluated
등록할 수 있습니다. 이 콜백은 기능 플래그가 평가되고 해당 플래그에 대해 원격 분석을 사용할 때마다 호출됩니다. 콜백 함수는 기능 평가 결과를 매개 변수로 사용합니다.
다음 예제에서는 기능 평가 결과에서 추출된 정보를 사용하여 원격 분석을 보내고 기능 관리자에 등록하는 사용자 지정 콜백 함수를 구현하는 방법을 보여줍니다.
const sendTelemetry = (evaluationResult) => {
const featureId = evaluationResult.feature.id;
const featureEnabled = evaluationResult.enabled;
const targetingId = evaluationResult.targetingId;
const variantName = evaluationResult.variant?.name;
const variantAssignmentReason = evaluationResult.variantAssignmentReason;
// custom code to send the telemetry
// ...
}
const featureManager = new FeatureManager(featureProvider, { onFeatureEvaluated : sendTelemtry});
Application Insights 통합
JavaScript 기능 관리 라이브러리는 Application Insights SDK와 통합되는 확장 패키지를 제공합니다.
Application Insights는 웹 및 Node.js 시나리오에 대해 다양한 SDK를 제공합니다. 애플리케이션에 대한 올바른 확장 패키지를 선택하세요.
애플리케이션이 브라우저에서 실행되는 경우 패키지를 설치합니다 "@microsoft/feature-management-applicationinsights-browser"
. 다음 예제에서는 기본 제공 Application Insights 원격 분석 게시자를 만들고 기능 관리자에 등록하는 방법을 보여 줍니다.
import { ApplicationInsights } from "@microsoft/applicationinsights-web"
import { FeatureManager, ConfigurationObjectFeatureFlagProvider } from "@microsoft/feature-management";
import { createTelemetryPublisher, trackEvent } from "@microsoft/feature-management-applicationinsights-browser";
const appInsights = new ApplicationInsights({ config: {
connectionString: "<APPINSIGHTS_CONNECTION_STRING>"
}});
appInsights.loadAppInsights();
const publishTelemetry = createTelemetryPublisher(appInsights);
const provider = new ConfigurationObjectFeatureFlagProvider(jsonObject);
const featureManager = new FeatureManager(provider, {onFeatureEvaluated: publishTelemetry});
// FeatureEvaluation event will be emitted when a feature flag is evaluated
featureManager.getVariant("TestFeature", {userId : TARGETING_ID}).then((variant) => { /* do something*/ });
// Emit a custom event with targeting id attached.
trackEvent(appInsights, TARGETING_ID, {name: "TestEvent"}, {"Tag": "Some Value"});
원격 분석 게시자는 원격 분석으로 사용하도록 설정된 기능 플래그가 평가될 때 Application Insights에 사용자 지정 이벤트를 보냅니 FeatureEvaluation
다. 사용자 지정 이벤트는 FeatureEvaluationEvent 스키마를 따릅니다.
다음 단계
애플리케이션에서 기능 플래그를 사용하는 방법을 알아보려면 다음 빠른 시작을 계속 진행합니다.
기능 필터를 사용하는 방법을 알아보려면 다음 자습서를 계속 진행합니다.