기능 플래그

이 콘텐츠는 Azure용 클라우드 네이티브 .NET 애플리케이션 설계 eBook 에서 발췌한 것으로, .NET 문서에서 제공되거나 오프라인 상태에서도 읽을 수 있는 PDF(무료 다운로드 가능)로 제공됩니다.

Cloud Native .NET apps for Azure eBook cover thumbnail.

1장에서는 클라우드 네이티브가 속도와 민첩성에 관한 것임을 확인했습니다. 사용자는 빠른 응답성, 혁신적인 기능 및 제로 가동 중지 시간을 예상합니다. Feature flags는 클라우드 네이티브 애플리케이션의 민첩성을 높이는 데 도움이 되는 최신 배포 기술입니다. 이를 통해 프로덕션 환경에 새 기능을 배포할 수 있지만 가용성을 제한할 수 있습니다. 스위치를 누르면 앱을 다시 시작하거나 새 코드를 배포하지 않고도 특정 사용자에 대한 새 기능을 활성화할 수 있습니다. 새 기능의 릴리스를 코드 배포와 분리합니다.

기능 플래그는 런타임에 사용자의 기능 가시성을 제어하는 조건부 논리를 기준으로 합니다. 최신 클라우드 네이티브 시스템에서는 프로덕션 초기에 새로운 기능을 배포하지만 제한된 대상 그룹으로 테스트하는 것이 일반적입니다. 신뢰도가 높아짐에 따라 이 기능은 점점 더 많은 대상에게 롤아웃될 수 있습니다.

기능 플래그에 대한 기타 사용 사례는 다음과 같습니다.

  • 프리미엄 기능을 더 높은 구독 요금을 지불할 의지가 있는 특정 고객 그룹으로 제한합니다.
  • 문제 기능을 신속하게 비활성화하여 시스템을 안정화하고 롤백 또는 즉각적인 핫픽스의 위험을 방지합니다.
  • 사용량이 많은 기간 동안 리소스 사용량이 많은 선택적 기능을 사용하지 않도록 설정합니다.
  • 타당성 및 인기도의 유효성을 검사하기 위해 소규모 사용자 세그먼트에 대해 experimental feature releases를 수행합니다.

또한 기능 플래그는 trunk-based 개발을 촉진합니다. 개발자가 단일 분기의 기능에 대해 협업하는 소스 제어 분기 모델입니다. 이 방법은 많은 수의 장기 실행 기능 분기를 병합할 때의 위험과 복잡성을 최소화합니다. 활성화될 때까지 기능을 사용할 수 없습니다.

기능 플래그 구현

핵심에서 기능 플래그는 간단한 decision object에 대한 참조입니다. on 또는 off의 부울 상태를 반환합니다. 이 플래그는 일반적으로 기능을 캡슐화하는 코드 블록을 래핑합니다. 플래그의 상태는 해당 코드 블록이 지정된 사용자에 대해 실행되는지 여부를 결정합니다. 그림 10-11은 구현을 보여 줍니다.

if (featureFlag) {
    // Run this code block if the featureFlag value is true
} else {
    // Run this code block if the featureFlag value is false
}

그림 10-11 - 간단한 기능 플래그 구현입니다.

이 방법은 의사 결정 논리를 기능 코드와 분리하는 방법을 확인합니다.

1장에서는 Twelve-Factor App에 대해 설명했습니다. 이 지침에 따르면 구성 설정을 애플리케이션 실행 코드 외부에 유지하는 것이 좋습니다. 필요한 경우 외부 원본에서 설정을 읽을 수 있습니다. 기능 플래그 구성 값도 코드베이스와 독립적이어야 합니다. 플래그 구성을 별도의 리포지토리에 외부화하면 애플리케이션을 수정하고 다시 배포하지 않고 플래그 상태를 변경할 수 있습니다.

Azure App Configuration은 기능 플래그에 대한 중앙 집중식 리포지토리를 제공합니다. 이를 사용하여 다양한 종류의 기능 플래그를 정의하고 해당 상태를 빠르고 자신 있게 조작할 수 있습니다. App Configuration 클라이언트 라이브러리를 애플리케이션에 추가하여 기능 플래그 기능을 사용하도록 설정합니다. 다양한 프로그래밍 언어 프레임워크가 지원됩니다.

기능 플래그는 ASP.NET Core 서비스에서 쉽게 구현할 수 있습니다. .NET 기능 관리 라이브러리 및 App Configuration 공급자를 설치하면 코드에 기능 플래그를 선언적으로 추가할 수 있습니다. 코드베이스에서 if 문을 수동으로 작성할 필요가 없도록 FeatureGate 특성을 사용하도록 설정합니다.

Startup 클래스에서 구성되면 컨트롤러, 작업 또는 미들웨어 수준에서 기능 플래그 기능을 추가할 수 있습니다. 그림 10-12는 다음과 같은 컨트롤러 및 작업 구현을 제공합니다.

[FeatureGate(MyFeatureFlags.FeatureA)]
public class ProductController : Controller
{
    ...
}
[FeatureGate(MyFeatureFlags.FeatureA)]
public IActionResult UpdateProductStatus()
{
    return ObjectResult(ProductDto);
}

그림 10-12 - 컨트롤러 및 작업의 기능 플래그 구현입니다.

기능 플래그를 사용하지 않도록 설정하면 응답 본문이 없는 404(찾을 수 없음) 상태 코드가 표시됩니다.

기능 플래그는 C# 클래스에 직접 삽입할 수도 있습니다. 그림 10-13은 기능 플래그 삽입을 보여 줍니다.

public class ProductController : Controller
{
    private readonly IFeatureManager _featureManager;

    public ProductController(IFeatureManager featureManager)
    {
        _featureManager = featureManager;
    }
}

그림 10-13 - 클래스에 대한 기능 플래그 삽입입니다.

기능 관리 라이브러리는 배후 상황의 기능 플래그 수명 주기를 관리합니다. 예를 들어 구성 저장소에 대한 호출 수를 최소화하기 위해 라이브러리는 지정된 기간 동안 플래그 상태를 캐시합니다. 요청 호출 중에 플래그 상태의 불변성을 보장할 수 있습니다. 또한 Point-in-time snapshot을 제공합니다. 키-값의 기록을 다시 구성하고 이전 7일 이내에 언제든지 이전 값을 제공할 수 있습니다.