태그
목차

app config로 설정하기

app.json/app.config.js/app.config.ts 파일이 무엇이며 어떻게 동적으로 커스터마이징 하고 사용할 수 있는지 알아본다.

생성일: 2024-04-03

수정일: 2024-04-03

앱 설정(app config) 파일은 Expo 프로젝트의 다양한 측면을 설정하는 데 사용되는 중요한 파일이다. 이 파일은 일반적으로 프로젝트 루트 디렉토리에 위치하며, JSON 형식(app.json)이나 JavaScript 또는 TypeScript 모듈(app.config.js 또는 app.config.ts)로 작성될 수 있다.

앱 설정 파일의 주요 역할은 다음과 같다:

  1. Expo Prebuild 생성 설정:

    • expo prebuild 명령을 실행할 때 생성되는 네이티브 프로젝트 디렉토리(iosandroid)의 설정을 정의한다.
    • 앱 이름, 번들 식별자, 버전 번호, 방향, 아이콘, 스플래시 화면 등과 같은 앱의 기본 속성을 설정한다.
    • 필요한 권한, 연결된 도메인, 설정 플러그인(Config Plugins) 등을 지정하여 네이티브 프로젝트의 동작을 커스터마이징할 수 있다.
  2. Expo Go에서 프로젝트 로드 방식 설정:

    • Expo Go에서 프로젝트를 열 때 사용되는 설정을 정의한다.
    • 개발 모드에서 앱의 동작을 제어하는 옵션을 포함한다(예: 개발자 메뉴 활성화, 리로드 시 캐시 지우기 등).
  3. OTA(Over-the-Air) 업데이트 매니페스트 설정:

    • expo-updates 라이브러리를 사용하여 JavaScript 번들과 assets을 원격으로 업데이트할 때 사용되는 매니페스트를 설정한다.
    • 업데이트 서버 URL, 업데이트 간격, 폴백 동작 등을 지정할 수 있다.

앱 설정 파일의 기본 구조는 다음과 같다:

// app.json
{
  "expo": {
    "name": "My app",
    "slug": "my-app"
  }
}

속성

앱 설정은 앱 이름, 아이콘, 스플래시 화면, 딥 링킹 스키마, 일부 서비스에 사용할 API 키 등 많은 것을 설정한다. 사용 가능한 프로퍼티의 전체 목록은 app.json/app.config.js/app.config.ts 레퍼런스를 확인한다.

Note

Visual Studio Code를 사용한다면 Expo Tools 확장 프로그램을 설치하여 app.json 파일에서 속성의 자동 완성 기능을 사용하는 것이 좋다.

앱에서 설정 값 읽기

앱 설정의 대부분의 값은 Constants.expoConfig 를 사용하여 JavaScript 코드에서 런타임에 액세스할 수 있다. 앱 설정에는 민감한 정보를 포함해서는 안 된다(아래 설명된 대로 필터링되는 필드에 대한 몇 가지 예외 사항이 있음).

npx expo config --type public 명령을 실행하여 어떤 설정이 빌드/업데이트에 포함되어 런타임에 사용 가능한지 확인할 수 있다.

퍼블릭 앱 설정에서 어떤 필드가 필터링될까?

다음 필드는 퍼블릭 앱 설정에서 필터링되어(Constants.expoConfig 객체를 통해 접근할 수 없다):

  • hooks
  • ios.config
  • android.config
  • updates.codeSigningCertificate
  • updates.codeSigningMetadata

Warning

JavaScript 코드에서 app.json 또는 app.config.js를 직접 import하는 것은 피해야 한다. 이렇게 하면 처리된 버전이 아닌 파일 전체가 import되기 때문이다. 대신 Constants.expoConfig 를 사용하여 설정에 액세스한다.

설정 확장

라이브러리 작성자는 Expo 설정 플러그인(Config plugins)을 사용하여 앱 설정을 확장할 수 있다.

Note

설정 플러그인은 주로 npx expo prebuild 명령을 설정하는 데 사용된다.

prebuild 명령은 앱의 네이티브 프로젝트 디렉토리를 생성하거나 업데이트할 때 사용된다. 설정 플러그인은 네이티브 프로젝트 파일을 수정하거나 추가 리소스를 생성할 수 있다.

동적 설정

JavaScript(app.config.js) 또는 TypeScript(app.config.ts)를 사용하면 앱 구성을 더 유연하게 커스터마이징 할 수 있다. 이러한 파일은 동적 설정을 가능하게 하는 몇 가지 이점이 있다:

예를 들어, 커스텀 설정을 정의하기 위해 객체를 export 할 수 있다:

// app.config.js
const myValue = 'My App';

module.exports = {
  name: myValue,
  version: process.env.MY_CUSTOM_PROJECT_VERSION || '1.0.0',
  // All values in extra will be passed to your app.
  extra: {
    fact: 'kittens are cool',
  },
};

extra 키를 사용하면 앱에 임의의 설정 데이터를 전달할 수 있다. 이 키의 값은 expo-constants 를 사용하여 접근할 수 있다:

// App.js
import Constants from 'expo-constants';

Constants.expoConfig.extra.fact === 'kittens are cool';

객체를 반환하는 함수를 export하여 들어오는 설정 값에 접근하고 수정할 수 있다. 이는 프로젝트에 app.json도 있는 경우에 유용하다. 기본적으로 Expo CLI는 먼저 app.json을 읽고 정규화된 결과를 app.config.js로 보낸다.

예를 들어, 다음과 같은 app.json이 있다:

// app.json
{
  "expo": {
    "name": "My App"
  }
}

그리고 app.config.js 에서 export한 함수의 인자에 해당 설정이 제공된다:

// app.config.js
module.exports = ({ config }) => {
  console.log(config.name); // prints 'My App'
  return {
    ...config,
  };
};

환경에 따른 설정 전환

개발, 스테이징 및 프로덕션 환경에서 일부 다른 설정을 사용하거나 앱을 화이트 라벨링하기 위해 설정을 완전히 교체하는 것이 일반적이다. 이를 달성하기 위해 환경 변수와 함께 app.config.js를 사용할 수 있다.

// app.config.js
module.exports = () => {
  if (process.env.MY_ENVIRONMENT === 'production') {
    return {
      /* 프로덕션 설정 */
    };
  } else {
    return {
      /* 개발 설정 */
    };
  }
};

Expo CLI 명령과 함께 환경 변수를 사용하여 설정을 전환하는 방법에는 두 가지가 있다:

  1. 특정 명령에 대한 환경 변수 설정:
    • 이 방법은 개별 명령을 실행할 때 일회성으로 환경 변수를 설정하는 것이다.
    • 예시와 같이 명령 앞에 변수명=값 을 접두사로 붙여 사용한다.
    • Unix 계열 시스템(Linux, macOS)에서는 MY_ENVIRONMENT=production eas update 와 같이 사용할 수 있다.
    • Windows에서는 cross-env 라는 패키지를 사용하여 유사한 동작을 구현할 수 있다: npx cross-env MY_ENVIRONMENT=production eas update
    • 이렇게 하면 해당 명령을 실행하는 동안에만 환경 변수가 설정되고, 명령이 완료되면 환경 변수는 초기 상태로 돌아간다.
MY_ENVIRONMENT=production eas update
npx cross-env MY_ENVIRONMENT=production eas update
  1. 셸 프로파일에서 환경 변수 설정:
    • 이 방법은 셸 프로파일 파일(예: .bashrc, .bash_profile, .zshrc 등)에 환경 변수를 영구적으로 설정하는 것이다.
    • 셸 프로파일 파일에 export MY_ENVIRONMENT=production과 같은 명령을 추가한다.
    • 변경 사항을 적용하려면 새로운 터미널 세션을 시작하거나 source 명령을 사용하여 셸 프로파일을 다시 로드해야 한다.
    • 이렇게 설정된 환경 변수는 모든 명령에 대해 지속적으로 적용된다.

이 두 가지 방법 외에도 환경 변수를 설정하는 다른 메커니즘을 사용할 수 있다. 예를 들어:

중요한 점은 app.config.js 에서 process.env 를 통해 환경 변수에 접근할 수 있다는 것이다. 이를 통해 환경에 따라 다른 설정을 적용할 수 있다. 개발 환경과 프로덕션 환경에서 서로 다른 API 엔드포인트, 인증 키, 기능 플래그 등을 사용할 수 있다.

TypeScript를 사용한 설정: app.config.js 대신 app.config.ts 사용

TypeScript에서 Expo 설정과 함께 자동 완성 및 doc-blocks을 사용할 수 있다. 다음과 같이 app.config.ts를 생성한다:

// app.config.ts
import { ExpoConfig, ConfigContext } from 'expo/config';

export default ({ config }: ConfigContext): ExpoConfig => ({
  ...config,
  slug: 'my-app',
  name: 'My App',
});

다른 TypeScript 파일을 import하거나 언어 기능을 커스터마이징 하려면 ts-node 를 사용한다.

설정 해석 규칙

설정에는 두 가지 다른 유형이 있다: 정적 설정(app.config.json, app.json)과 동적 설정(app.config.js, app.config.ts)이다.

Expo는 앱 설정을 관리하기 위해 여러 가지 규칙을 사용한다. 이 규칙들은 정적 설정과 동적 설정이 어떻게 해석되고 병합되는지를 정의한다.

  1. 정적 설정 읽기:

    • Expo는 먼저 app.config.json 파일이 존재하는지 확인한다. 이 파일이 있으면 정적 설정으로 사용된다.
    • app.config.json이 없는 경우, Expo는 app.json 파일을 찾는다. 이 파일이 있으면 정적 설정으로 사용된다.
    • 정적 설정 파일이 없는 경우, Expo는 package.json과 프로젝트의 종속성에서 기본값을 추론한다.
  2. 동적 설정 읽기:

    • Expo는 app.config.ts 또는 app.config.js 파일이 존재하는지 확인한다.
    • 두 파일이 모두 존재하는 경우, TypeScript 설정(app.config.ts)이 우선적으로 사용된다.
    • 동적 설정 파일이 없는 경우, 이 단계는 건너뛴다.
  3. 동적 설정에서 함수 반환:

    • 동적 설정 파일(app.config.js 또는 app.config.ts)이 함수를 export하는 경우, 이 함수는 정적 설정을 인자로 받는다.
    • 함수 시그니처는 ({ config }) => ({})와 같은 형태입니다. 여기서 config는 정적 구성 객체입니다.
    • 이 함수 내에서 정적 설정 값을 수정하거나 새로운 값을 추가할 수 있다.
    • 이 단계는 정적 설정에 대한 일종의 미들웨어로 생각할 수 있다. 동적 설정에서 정적 설정을 변경할 수 있다.
  4. 최종 설정 반환:

    • 동적 설정 파일에서 반환된 값은 최종 설정으로 사용된다.
    • 이 값은 일반 JavaScript 객체여야 하며, promise를 포함해서는 안 된다.
    • 동적 설정에서 반환된 값은 정적 설정과 병합되어 최종 설정을 형성한다.
  5. 설정 함수 평가 및 직렬화:

    • 설정 내의 모든 함수는 Expo 도구에서 사용되기 전에 평가되고 직렬화된다.
    • 함수는 실행되고 그 결과 값으로 대체된다.
    • 최종 설정은 JSON 형식으로 직렬화될 수 있어야 한다. 직렬화할 수 없는 값(예: 함수, Promise 등)은 포함될 수 없다.
    • 이 단계는 설정이 호스팅되거나 다른 도구에 의해 사용될 때 수행된다.

이러한 규칙을 통해 Expo는 정적 설정과 동적 설정을 유연하게 조합하여 사용할 수 있다. 개발자는 프로젝트의 요구 사항에 따라 적절한 설정 방식을 선택할 수 있다.

정적 설정은 간단하고 CLI 도구로 쉽게 업데이트할 수 있는 반면, 동적 설정은 더 많은 유연성과 프로그래밍 기능을 제공한다. 동적 설정을 사용하면 환경 변수에 따라 조건부로 설정을 수정하거나, 외부 데이터 소스에서 설정 값을 가져오는 등의 작업을 수행할 수 있다.

Expo의 설정 해석 규칙은 이러한 다양한 사용 사례를 지원하면서도 일관되고 예측 가능한 방식으로 설정을 관리할 수 있도록 도와준다.