Firebase Summit에서 발표된 모든 내용을 살펴보고 Firebase로 앱을 빠르게 개발하고 안심하고 앱을 실행하는 방법을 알아보세요. 자세히 알아보기

원격 구성 템플릿 및 버전 관리

컬렉션을 사용해 정리하기 내 환경설정을 기준으로 콘텐츠를 저장하고 분류하세요.

원격 구성 템플릿은 Firebase 프로젝트에 대해 생성한 JSON 형식 매개변수 및 조건의 서버 측 세트입니다. 매개변수조건 탭에서 템플릿 콘텐츠를 그래픽 형식으로 표시하는 Firebase 콘솔을 사용하여 템플릿을 수정하고 관리할 수 있습니다. 원격 구성 백엔드 API 또는 Firebase CLI 를 사용하여 구성을 수정하고 관리할 수도 있습니다.

다음은 템플릿 파일의 예입니다.

  {
    "conditions": [
      {
        "name": "ios",
        "expression": "device.os == 'ios'"
      }
    ],
    "parameters": {
      "welcome_message": {
        "defaultValue": {
          "value": "Welcome to this sample app"
        },
        "conditionalValues": {
          "ios": {
            "value": "Welcome to this sample iOS app"
          }
        }
      },
      "welcome_message_caps": {
        "defaultValue": {
          "value": "false"
        }
      },
      "header_text": {
        "defaultValue": {
          "useInAppDefault": true
        }
      }
    },
    "version": {
      "versionNumber": "28",
      "updateTime": "2020-05-14T18:39:38.994Z",
      "updateUser": {
        "email": "user@google.com"
      },
      "updateOrigin": "CONSOLE",
      "updateType": "INCREMENTAL_UPDATE"
    }
  }

매개변수를 업데이트할 때마다 원격 구성은 새 버전의 원격 구성 템플릿을 만들고 필요에 따라 검색하거나 롤백할 수 있는 버전으로 이전 템플릿을 저장합니다. 버전 번호는 Remote Config에 저장된 초기 값부터 순차적으로 증가합니다. 모든 템플릿에는 표시된 대로 해당 특정 버전에 대한 메타데이터가 포함된 version 필드가 있습니다.

Firebase 콘솔, Firebase CLI 또는 원격 구성 백엔드 API를 사용하여 다음과 같은 버전 관리 작업을 수행할 수 있습니다.

  • 저장된 모든 템플릿 버전 나열
  • 특정 버전 검색
  • 특정 버전으로 롤백

원격 구성 템플릿을 관리할 때 만료 임계값을 염두에 두십시오. 앱에서 사용 중인 현재 활성 원격 구성 템플릿은 만료되지 않습니다 . 그러나 업데이트로 대체되는 경우 이전 버전은 90일 동안만 저장되며 그 이후에는 만료되어 검색할 수 없습니다. 또한 저장된 버전은 총 300개로 제한됩니다. 이러한 제한을 벗어난 템플릿을 저장하거나 롤백하려면 수동으로 저장하고 저장하십시오.

원격 구성 템플릿 버전 관리

이 섹션에서는 원격 구성 템플릿의 버전을 관리하는 방법을 설명합니다. 프로그래밍 방식으로 템플릿을 생성, 수정 및 저장하는 방법에 대한 자세한 내용은 프로그래밍 방식으로 원격 구성 수정 을 참조하세요.

원격 구성 템플릿의 저장된 모든 버전 나열

원격 구성 템플릿의 저장된 모든 버전 목록을 검색할 수 있습니다. 예를 들어:

노드.js

function listAllVersions() {
  admin.remoteConfig().listVersions()
    .then((listVersionsResult) => {
      console.log("Successfully fetched the list of versions");
      listVersionsResult.versions.forEach((version) => {
        console.log('version', JSON.stringify(version));
      });
    })
    .catch((error) => {
      console.log(error);
    });
}

자바

ListVersionsPage page = FirebaseRemoteConfig.getInstance().listVersionsAsync().get();
while (page != null) {
  for (Version version : page.getValues()) {
    System.out.println("Version: " + version.getVersionNumber());
  }
  page = page.getNextPage();
}

// Iterate through all versions. This will still retrieve versions in batches.
page = FirebaseRemoteConfig.getInstance().listVersionsAsync().get();
for (Version version : page.iterateAll()) {
  System.out.println("Version: " + version.getVersionNumber());
}

쉬다

curl --compressed -D headers -H "Authorization: Bearer <var>token</var>" -X GET https://firebaseremoteconfig.googleapis.com/v1/projects/<var>my-project-id</var>/remoteConfig:listVersions

Firebase 콘솔

매개변수 탭에서 오른쪽 상단에 표시된 "시계" 아이콘을 선택합니다. 그러면 오른쪽의 목록 메뉴에 저장된 모든 템플릿 버전이 나열된 변경 내역 페이지가 열립니다.

저장된 각 버전에 대해 표시되는 세부 정보에는 변경 사항이 콘솔, REST API, 롤백에서 발생했는지 또는 템플릿의 강제 저장으로 인한 증분 변경 사항인지에 대한 정보가 포함됩니다.

Firebase CLI

firebase remoteconfig:versions:list

--limit 옵션을 사용하여 반환되는 버전 수를 제한합니다. 모든 버전을 가져오려면 '0'을 전달합니다.

템플릿 목록에는 업데이트 시간, 만든 사용자, 콘솔 또는 REST API를 통해 만들어졌는지 여부를 포함하여 저장된 모든 버전에 대한 메타데이터가 포함됩니다. 다음은 버전 요소의 예입니다.

{
  "versions": [{
    "version_number": "6",
    "update_time": "2022-05-12T02:38:54Z",
    "update_user": {
      "name": "Jane Smith",
      "email": "jane@developer.org",
      "imageUrl": "https://lh3.googleusercontent.com/a-/..."
    },
    "description": "One small change on the console",
    "origin": "CONSOLE",
    "update_type": "INCREMENTAL_UPDATE"
  }]

원격 구성 템플릿의 특정 버전 검색

원격 구성 템플릿의 저장된 특정 버전을 검색할 수 있습니다. 예를 들어:

노드.js

최신 버전의 템플릿을 검색하거나 특정 버전을 검색하려면 getTemplateAtVersion() 을 사용하려면 인수 없이 getTemplate() 을 전달하십시오.

// Get template version: 6
admin.remoteConfig().getTemplateAtVersion('6')
  .then((template) => {
    console.log("Successfully fetched the template with ETag: " + template.etag);
  })
  .catch((error) => {
    console.log(error);
  });

자바

Template template = FirebaseRemoteConfig.getInstance().getTemplateAtVersionAsync(versionNumber).get();
// See the ETag of the fetched template.
System.out.println("Successfully fetched the template with ETag: " + template.getETag());

쉬다

curl --compressed -D headers -H "Authorization: Bearer <var>token</var>" -X GET https://firebaseremoteconfig.googleapis.com/v1/projects/<var>my-project-id</var>/remoteConfig?version_number=6

URL 매개변수 ?version_numberGET 작업에만 유효합니다. 업데이트의 버전 번호를 지정하는 데 사용할 수 없습니다. ?version_number 매개변수가 없는 유사한 get 요청은 현재 활성 템플릿을 검색합니다.

Firebase 콘솔

기본적으로 변경 내역 탭의 세부 정보 창에는 현재 활성 템플릿이 표시됩니다. 목록에서 다른 버전에 대한 세부 정보를 보려면 오른쪽 메뉴에서 선택하십시오.

선택되지 않은 버전의 컨텍스트 메뉴 위로 마우스를 가져간 다음 선택한 버전과 비교를 선택하여 현재 선택한 버전과 저장된 다른 버전의 자세한 차이점을 볼 수 있습니다.

Firebase CLI

firebase remoteconfig:get -v VERSION_NUMBER

선택적으로 -o, FILENAME 을 사용하여 지정된 파일에 출력을 쓸 수 있습니다.

원격 구성 템플릿의 특정 저장된 버전으로 롤백

템플릿의 저장된 버전으로 롤백할 수 있습니다. 예를 들어:

노드.js

// Roll back to template version: 6
admin.remoteConfig().rollback('6')
  .then((template) => {
    console.log("Successfully rolled back to template version 6.");
    console.log("New ETag: " + template.etag);
  })
  .catch((error) => {
    console.log('Error trying to rollback:', e);
  })

자바

try {
  Template template = FirebaseRemoteConfig.getInstance().rollbackAsync(versionNumber).get();
  System.out.println("Successfully rolled back to template version: " + versionNumber);
  System.out.println("New ETag: " + template.getETag());
} catch (ExecutionException e) {
  if (e.getCause() instanceof FirebaseRemoteConfigException) {
    FirebaseRemoteConfigException rcError = (FirebaseRemoteConfigException) e.getCause();
    System.out.println("Error trying to rollback template.");
    System.out.println(rcError.getMessage());
  }
}

쉬다

저장된 원격 구성 템플릿으로 롤백하려면 사용자 지정 메서드 :rollback 을 사용하여 HTTP POST를 실행하고 요청 본문에서 적용할 특정 버전을 실행합니다. 예를 들어:

curl --compressed -D headers -H "Authorization: Bearer <var>token</var>" -H "Content-Type: application/json" -X POST https://firebaseremoteconfig.googleapis.com/v1/projects/<var>my-project-id</var>/remoteConfig:rollback -d '{"version_number": 6}'

응답에는 새 버전 메타데이터와 함께 현재 활성화된 저장된 템플릿의 내용이 포함됩니다.

Firebase 콘솔

롤백할 수 있는 이전 템플릿 버전의 경우 해당 버전으로 롤백할 수 있는 옵션 버튼이 변경 내역 페이지의 오른쪽 상단에 표시됩니다. 해당 버전으로 롤백하고 모든 앱과 사용자에 대해 해당 값 을 즉시 사용하려는 경우에만 이 항목을 클릭하고 확인합니다.

Firebase CLI

firebase remoteconfig:rollback -v VERSION_NUMBER

이 롤백 작업은 새로운 번호가 매겨진 버전을 효과적으로 생성합니다. 예를 들어, 버전 10에서 버전 6으로 롤백하면 버전 번호가 11이라는 점에서만 원본과 다른 버전 6의 새 복사본이 효과적으로 생성됩니다. 원본 버전 6은 만료되지 않은 것으로 가정하고 여전히 저장됩니다. 버전 11이 활성 템플릿이 됩니다.

원격 구성 템플릿 다운로드 및 게시

원격 구성 템플릿을 다운로드 및 게시하여 소스 제어 및 빌드 시스템에 통합하고, 구성 업데이트를 자동화하고, 여러 프로젝트에서 매개변수와 값을 동기화된 상태로 유지합니다.

프로그래밍 방식으로 또는 Firebase 콘솔에서 현재 활성화된 원격 구성 템플릿을 다운로드할 수 있습니다. 그런 다음 내보낸 JSON 파일을 업데이트하고 동일한 프로젝트에 게시하거나 새 프로젝트 또는 기존 프로젝트에 게시할 수 있습니다.

개발, 테스트, 스테이징 및 프로덕션 환경과 같은 소프트웨어 개발 수명 주기의 여러 단계를 나타내는 여러 프로젝트가 있다고 가정해 보겠습니다. 이 경우 스테이징 프로젝트에서 템플릿을 다운로드하고 프로덕션 프로젝트에 게시하여 스테이징 환경에서 프로덕션 환경으로 완전히 테스트된 템플릿을 승격할 수 있습니다.

또한 이 방법을 사용하여 한 프로젝트에서 다른 프로젝트로 구성을 마이그레이션하거나 설정된 프로젝트의 매개변수 및 값으로 새 프로젝트를 채울 수 있습니다.

A/B Testing 실험에서 변형으로 특별히 생성된 매개변수 및 매개변수 값은 내보낸 템플릿에 포함되지 않습니다.

원격 구성 템플릿을 내보내고 가져오려면:

  1. 현재 원격 구성 구성 템플릿을 다운로드합니다 .
  2. 원격 구성 템플릿을 확인합니다 .
  3. 원격 구성 템플릿을 게시합니다 .

현재 원격 구성 템플릿 다운로드

프로그래밍 방식으로 또는 Firebase 콘솔을 사용하여 현재 및 활성 원격 구성 템플릿을 다운로드할 수 있습니다.

다음 명령을 사용하여 활성 원격 구성 템플릿을 JSON 형식으로 다운로드합니다.

노드.js

function getTemplate() {
  var config = admin.remoteConfig();
  config.getTemplate()
      .then(function (template) {
        console.log('ETag from server: ' + template.etag);
        var templateStr = JSON.stringify(template);
        fs.writeFileSync('config.json', templateStr);
      })
      .catch(function (err) {
        console.error('Unable to get template');
        console.error(err);
      });
}

자바

Template template = FirebaseRemoteConfig.getInstance().getTemplateAsync().get();
// See the ETag of the fetched template.
System.out.println("ETag from server: " + template.getETag());

쉬다

curl --compressed -D headers -H "Authorization: Bearer token" -X GET https://firebaseremoteconfig.googleapis.com/v1/projects/my-project-id/remoteConfig -o filename

이 명령은 JSON 페이로드를 하나의 파일로 출력하고 헤더(ETag 포함)를 별도의 headers 파일로 출력합니다.

Firebase 콘솔

  1. 원격 구성 매개변수 또는 조건 탭에서 메뉴 를 열고 현재 구성 파일 다운로드 를 선택합니다.
  2. 메시지가 표시되면 구성 파일 다운로드 를 클릭하고 파일을 저장할 위치를 선택한 다음 저장 을 클릭합니다.

Firebase CLI

firebase remoteconfig:get -o filename

원격 구성 템플릿 확인

Firebase Admin SDK 또는 REST API를 사용하여 게시하기 전에 템플릿 업데이트를 확인할 수 있습니다. Firebase CLI 또는 Firebase 콘솔에서 게시를 시도할 때도 템플릿의 유효성이 검사됩니다.

템플릿 유효성 검사 프로세스는 매개변수 및 조건에 대한 중복 키, 유효하지 않은 조건 이름 또는 존재하지 않는 조건 또는 형식이 잘못된 ETag와 같은 오류를 확인합니다. 예를 들어 허용된 키 수(2000개)를 초과하는 요청은 Param count too large 오류 메시지를 반환합니다.

노드.js

function validateTemplate(template) {
  admin.remoteConfig().validateTemplate(template)
      .then(function (validatedTemplate) {
        // The template is valid and safe to use.
        console.log('Template was valid and safe to use');
      })
      .catch(function (err) {
        console.error('Template is invalid and cannot be published');
        console.error(err);
      });
}

자바

try {
  Template validatedTemplate = FirebaseRemoteConfig.getInstance()
          .validateTemplateAsync(template).get();
  System.out.println("Template was valid and safe to use");
} catch (ExecutionException e) {
  if (e.getCause() instanceof FirebaseRemoteConfigException) {
    FirebaseRemoteConfigException rcError = (FirebaseRemoteConfigException) e.getCause();
    System.out.println("Template is invalid and cannot be published");
    System.out.println(rcError.getMessage());
  }
}

쉬다

게시 요청에 URL 매개변수 ?validate_only=true 를 추가하여 템플릿 업데이트를 확인합니다.

curl --compressed -H "Content-Type: application/json; UTF8" -H "If-Match: last-returned-etag" -H "Authorization: Bearer token" -X PUT https://firebaseremoteconfig.googleapis.com/v1/projects/my-project-id/remoteConfig?validate_only=true -d @filename

템플릿이 성공적으로 검증된 경우 curl 명령은 제출한 JSON 템플릿을 반환하고 저장된 headers 파일에서 HTTP/2 상태 200 및 접미사가 -0 인 업데이트된 ETag를 찾을 수 있습니다. 템플릿이 검증되지 않은 경우 JSON 응답에서 검증 오류를 수신하고 headers 파일에 200이 아닌 응답(ETag 없음)이 포함됩니다.

원격 구성 템플릿 게시

템플릿을 다운로드하고 JSON 콘텐츠를 필요한 대로 변경하고 유효성을 검사한 후 프로젝트에 게시할 수 있습니다.

템플릿을 게시하면 기존 구성 템플릿 전체가 업데이트된 파일로 바뀌고 템플릿 버전이 하나씩 증가합니다. 전체 구성이 대체되기 때문에 JSON 파일에서 매개변수를 삭제하고 게시하면 해당 매개변수가 서버에서 삭제되고 클라이언트에서 더 이상 사용할 수 없습니다.

게시 후 매개변수 및 값에 대한 변경 사항은 앱과 사용자가 즉시 사용할 수 있습니다. 필요한 경우 이전 버전으로 롤백 할 수 있습니다.

다음 명령을 사용하여 템플릿을 게시합니다.

노드.js

function publishTemplate() {
  var config = admin.remoteConfig();
  var template = config.createTemplateFromJSON(
      fs.readFileSync('config.json', 'UTF8'));
  config.publishTemplate(template)
      .then(function (updatedTemplate) {
        console.log('Template has been published');
        console.log('ETag from server: ' + updatedTemplate.etag);
      })
      .catch(function (err) {
        console.error('Unable to publish template.');
        console.error(err);
      });
}

자바

try {
  Template publishedTemplate = FirebaseRemoteConfig.getInstance()
          .publishTemplateAsync(template).get();
  System.out.println("Template has been published");
  // See the ETag of the published template.
  System.out.println("ETag from server: " + publishedTemplate.getETag());
} catch (ExecutionException e) {
  if (e.getCause() instanceof FirebaseRemoteConfigException) {
    FirebaseRemoteConfigException rcError = (FirebaseRemoteConfigException) e.getCause();
    System.out.println("Unable to publish template.");
    System.out.println(rcError.getMessage());
  }
}

쉬다

curl --compressed -H "Content-Type: application/json; UTF8" -H "If-Match: last-returned-etag" -H "Authorization: Bearer token" -X PUT https://firebaseremoteconfig.googleapis.com/v1/projects/my-project-id/remoteConfig -d @filename

curl 명령의 경우 "@" 문자와 파일 이름을 사용하여 내용을 지정할 수 있습니다.

Firebase 콘솔

  1. 원격 구성 매개변수 또는 조건 탭에서 메뉴 를 열고 파일에서 게시를 선택합니다.
  2. 메시지가 표시되면 찾아보기 를 클릭하고 게시할 원격 구성 파일로 이동하여 선택한 다음 선택 을 클릭합니다.
  3. 파일의 유효성이 검사되고 성공하면 게시 를 클릭하여 앱과 사용자가 구성을 즉시 사용할 수 있도록 할 수 있습니다.

원격 구성 개인화 및 조건은 다운로드한 템플릿에 포함되어 있으므로 다른 프로젝트에 게시를 시도할 때 다음 제한 사항에 유의하는 것이 중요합니다.

  • 프로젝트 간에 개인화를 가져올 수 없습니다.

    예를 들어 프로젝트에서 개인 설정이 활성화되어 있고 템플릿을 다운로드하고 편집하는 경우 동일한 프로젝트에 게시할 수 있지만 템플릿에서 개인 설정을 삭제하지 않는 한 다른 프로젝트에 게시할 수 없습니다.

  • 프로젝트에서 프로젝트로 조건을 가져올 수 있지만 게시하기 전에 특정 조건부 값(예: 앱 ID 또는 대상)이 대상 프로젝트에 있어야 합니다.

    예를 들어 iOS 의 플랫폼 값을 지정하는 조건을 사용하는 원격 구성 매개변수가 있는 경우 플랫폼 값이 모든 프로젝트에서 동일하기 때문에 템플릿을 다른 프로젝트에 게시할 수 있습니다. 그러나 대상 프로젝트에 존재하지 않는 특정 앱 ID 또는 사용자 대상에 의존하는 조건이 포함된 경우 유효성 검사가 실패합니다.

  • 게시하려는 템플릿에 Google Analytics를 사용하는 조건이 포함된 경우 대상 프로젝트에서 Analytics를 활성화해야 합니다.

원격 구성 템플릿 기본값 다운로드

앱이 항상 인터넷에 연결되어 있지 않을 수 있으므로 모든 원격 구성 매개변수에 대해 클라이언트 측 앱 기본값을 구성해야 합니다. 또한 시간이 지남에 따라 변경될 수 있으므로 앱 클라이언트 기본값과 원격 구성 백엔드 기본 매개변수 값을 주기적으로 동기화해야 합니다.

이 섹션 끝에 있는 플랫폼별 링크에 설명된 대로 앱에서 이러한 기본값을 수동으로 설정하거나 모든 매개변수 대한 키-값 쌍과 활성 원격 구성 템플릿. 그런 다음 이 파일을 프로젝트에 포함하고 이러한 값을 가져오도록 앱을 구성할 수 있습니다.

Android 앱의 경우 XML 형식, iOS 앱의 경우 속성 목록(plist) 형식, 웹 앱의 경우 JSON 형식으로 이러한 파일을 다운로드할 수 있습니다.

앱과 원격 구성 백엔드가 동기화된 상태를 유지하려면 새 앱이 출시되기 전에 원격 구성 기본값을 주기적으로 다운로드하는 것이 좋습니다.

템플릿 기본값이 포함된 파일을 다운로드하려면:

쉬다

curl --compressed -D headers -H "Authorization: Bearer token -X GET https://firebaseremoteconfig.googleapis.com/v1/projects/my-project-id/remoteConfig:downloadDefaults?format=file_format'

다운로드하려는 파일 형식에 따라 XML , PLIST 또는 JSONformat 값으로 사용합니다.

Firebase 콘솔

  1. 매개변수 탭에서 메뉴 를 열고 기본값 다운로드 를 선택합니다.
  2. 메시지가 표시되면 다운로드할 파일 형식에 해당하는 라디오 버튼을 클릭한 다음 파일 다운로드 를 클릭합니다.

원격 구성 기본값을 앱으로 가져오는 방법에 대한 자세한 내용은 다음을 참조하세요.