Implement Feature Flags in Java With Unleash

1. 개요

오늘날의 빠르게 변화하는 소프트웨어 개발 환경에서는 동적인 기능 관리가 필수적입니다.

기능 플래그, 일반적으로 기능 스위치로 알려진 이들은 추가 코드를 배포하지 않고도 기능을 활성화하거나 비활성화할 수 있게 해줍니다. 이 글에서는 오픈 소스 기능 관리 도구인 Unleash를 사용하여 Java에서 기능 플래그를 추가하는 방법을 보여줍니다.

기능 플래그의 기본 사항을 검토하고, Unleash로 구성하는 방법, Java 애플리케이션에 통합하는 방법, 기능 스위치가 제대로 작동하는지 확인하는 방법을 살펴보겠습니다.

2. 기능 플래그 이해 및 사용 이유

기능 플래그는 애플리케이션 개발자가 코드를 재배포하지 않고도 프로그램의 기능을 런타임 동안 변경할 수 있게 해줍니다. 기능 플래그를 사용하여 설정 파일, 데이터베이스 또는 Unleash와 같은 기능 관리 시스템 등 애플리케이션 코드 외부에 위치한 기능 스위치의 값을 설정함으로써 코드 내의 특정 기능을 활성화/비활성화할 수 있습니다.

주요 두 가지 장점은 다음과 같습니다:

  • 더 빠른 개발 주기: 기능 플래그는 스위치처럼 작동하여 코드를 재배포하지 않고도 기능을 켜고 끌 수 있습니다. 이는 새로운 기능의 테스트 및 배포를 가속화합니다.
  • 제한된 롤아웃 테스트: 기능 플래그는 A/B 테스트카나리 배포를 통해 새로운 기능 테스트에 대한 제어를 제공합니다.

3. Unleash 소개

Unleash는 사용자가 기능 간에 스위칭할 수 있게 해주는 오픈 소스 기능 관리 애플리케이션입니다. Unleash는 여러 환경에서 기능 플래그를 관리하기 위한 효과적인 프레임워크를 제공하며, 소규모 팀부터 대기업까지 적합합니다. Unleash의 주요 기능은 다음과 같습니다:

  • 유연성: 특정 요구 사항에 따라 기능 스위칭을 위한 사용자 정의 기술을 지원합니다.
  • 확장성: 여러 환경과 애플리케이션에서 기능 플래그를 관리합니다.
  • 오픈 소스: 커뮤니티 주도의 적극적인 개발과 지원이 있습니다.

Unleash는 클라이언트-서버 아키텍처에서 실행됩니다. Unleash 서버는 기능 플래그 구성의 중앙 집중식 저장소 역할을 합니다. 애플리케이션은 서버와 통신하여 플래그 상태를 확인하고 사전 정의된 전략에 따라 어떤 기능을 활성화할지 결정합니다.

4. Unleash 설정하기

Unleash를 설정하기 위해 먼저 설치 단계를 살펴보고, 간단한 기능 스위치를 구성하는 방법을 배워보겠습니다.

4.1. 설치

Unleash를 설치하고 로컬 인스턴스를 구성하며, 로그인하고 기능 플래그를 추가해 보겠습니다.

Unleash로 시작하기 위해, 먼저 Unleash 서버를 설정하고 머신에 Docker와 Git이 설치되어 있는지 확인해야 합니다. Docker를 사용하여 Unleash를 로컬에서 실행하거나 클라우드에 배포할 수 있습니다. 다음은 Docker를 사용하여 로컬에서 설정하는 간단한 가이드입니다.

터미널 창을 열고 다음 명령어를 실행하여 Unleash 저장소를 Git으로 클론하고, Docker를 사용하여 빌드 및 실행합니다:

git clone https://github.com/Unleash/unleash.git
cd unleash
docker compose up -d

이제 Unleash가 머신에 설치되었으며 배경에서 실행되고 있습니다. 웹 브라우저에서 이 인스턴스에 접속할 수 있습니다: http://localhost:4242 그리고 다음 정보를 사용하여 로그인합니다:

사용자 이름: admin
비밀번호: unleash4all

4.2. 설정

로그인 후 아래 대시보드를 볼 수 있습니다. 여기서 왼쪽 사이드바에서 ‘프로젝트‘를 선택하여 프로젝트를 생성하거나 선택하고 그 프로젝트 아래에서 기능 플래그를 선택합니다.

이글에서는 기본 프로젝트를 사용할 것이므로 ‘기본‘ 프로젝트를 클릭합니다.

다음으로, ‘새 기능 플래그‘를 클릭하여 이름을 ‘testDemoFeatureFlag‘로 지정하여 기능 플래그를 생성합니다. 나머지 기능 플래그 양식에서는 기본값을 그대로 사용합니다.

새 기능 플래그를 생성했고 이제 사용할 준비가 되었습니다. 이 플래그를 개발 환경에서 사용할 수 있도록 활성화해야 합니다. 이렇게 하면 로컬 환경의 애플리케이션에서 접근 가능해집니다.

다음으로, 프로젝트에서 Unleash 서버에 대한 호출을 인증하기 위해 API 토큰을 생성해야 합니다. 애플리케이션은 이 API 토큰을 사용하여 기능을 토글할 것입니다. Unleash에서 기능 플래그에 접근할 수 있도록 인증이 올바른 애플리케이션만 허용되도록 하기 위해 이 API 토큰이 플래그 구성의 일부분으로 필요합니다.

왼쪽 사이드바에서 ‘Admin‘ 섹션을 확장하고 ‘API 접근‘을 선택한 후 ‘새 API 토큰‘ 버튼을 클릭합니다.

API 토큰의 이름을 지정하고, 서버 측 SDK(CLIENT) 유형을 선택합니다. 왜냐하면 Java SDK를 사용하여 서버 측에서 플래그 평가를 수행할 것이기 때문입니다. 이 토큰은 ‘development‘ 환경에 접근할 수 있어야 합니다.

5. Java에서 Unleash 사용하기

여기서는 Maven 빌드 도구를 사용하는 Spring Boot 애플리케이션에서 종속성을 다운로드하고 설치합니다. pom.xml 파일에 Unleash 클라이언트 종속성을 추가합니다:

<dependency>
  <groupId>io.getunleash</groupId>
  <artifactId>unleash-client-java</artifactId>
  <version>9.2.6</version>
</dependency>

다음으로, Unleash 클라이언트를 Unleash 빌더로 구성합니다:

UnleashConfig config = UnleashConfig.builder()
  .appName("appName")
  .instanceId("instanceId")
  .unleashAPI("http://localhost:4242/api/")
  .apiKey("apiToken")
  .build();

Unleash unleash = new DefaultUnleash(config);

애플리케이션 시작 시 Unleash 서버에 연결하도록 보장하기 위해, 애플리케이션의 main 함수나 초기화 중에 호출되는 다른 위치에 위 코드를 추가할 수 있습니다.

UnleashConfig 객체를 생성하는 데 사용되는 주요 구성 요소를 살펴보겠습니다:

  • appName은 애플리케이션의 이름입니다. 이는 기능 플래그를 사용하는 앱을 식별하는 데 도움이 됩니다. 특히 동일한 Unleash 서버에서 애플리케이션을 관리할 때 유용합니다.
  • instanceId는 애플리케이션 인스턴스의 식별자입니다. 이는 인스턴스별 기능 플래그 사용을 추적하고 로깅하는 데 도움이 됩니다.
  • unleashAPI는 Unleash 서버 API의 URL입니다. 이는 클라이언트가 어디서 기능 플래그 구성을 가져오는지를 알려줍니다. 로컬 설정에서는 http://localhost:4242/api/가 됩니다.

Unleash 클라이언트 객체는 이 구성을 사용하여 초기화되며, 애플리케이션이 연결하고 기능 플래그를 효율적으로 관리할 수 있게 합니다. 추가 정보는 구성 옵션API 토큰에 대한 정보에서 확인할 수 있습니다.

6. 기능 토글 경험 검증하기

로컬 Unleash 서버와 Java 애플리케이션에서 기능 플래그를 설정한 후, 플래그가 활성화되어 있는지 또는 Java 프로그램이 플래그의 상태를 읽고 있는지 확인할 수 있습니다.

다음은 Java 코드의 구현입니다:

public static void main(String[] args) throws InterruptedException {
    String appName = "unleash-onboarding-java";
    String appInstanceID = "unleash-onboarding-instance";
    String appServerUrl = "http://localhost:4242/api/";
    String appToken = "<AddYourApiTokenHere>";

    SpringApplication.run(DemoApplication.class, args);
    UnleashConfig config = UnleashConfig.builder()
      .appName(appName)
      .instanceId(appInstanceID)
      .unleashAPI(appServerUrl)
      .apiKey(appToken)
      .build();

    Unleash unleash = new DefaultUnleash(config);
    while (true) {
        if (unleash.isEnabled("testDemoFeatureFlag")) {
            log.info("New feature is enabled!");
        } else {
            log.info("New feature is disabled!");
        }
        Thread.sleep(1000);
    }
}

플래그 토글이 활성화된 상태에서, 아래 이미지처럼 해당 상태가 표시되어야 합니다.

Unleash를 사용하여 플래그를 끄고 콘솔 출력에서 업데이트된 상태를 확인할 수 있습니다. Unleash 대시보드에서 testFeatureFlagdevelopment 환경에서 비활성화합니다.

몇 초 후, 애플리케이션이 최신 플래그 상태를 반영하도록 업데이트되며 콘솔에서 다음과 같은 출력 변경을 볼 수 있습니다.

7. 결론

이 글에서는 Unleash를 사용하여 기능 플래그를 이해하고 구현하며 테스트하는 방법에 대한 심층 가이드를 제공했습니다. 우리는 기능 플래그를 효율적으로 관리하고 최소한의 위험으로 변경 사항을 동적으로 배포할 수 있습니다.

예제 코드의 전체 소스는 GitHub에서 확인할 수 있습니다.

원본 출처

You may also like...

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다