심층 탐구 React Native #3: Babel #2— 실전 전장

발행: (2025년 11월 30일 오후 07:04 GMT+9)
4 min read
원문: Dev.to

Source: Dev.to

절대 경로 & 별칭 — “동기화의 삼각형”

많은 개발자들이 별칭을 설정하고 앱을 실행하면 완벽하게 동작하지만 VS Code에서는 빨간 오류가 표시됩니다. 혹은 그 반대로 VS Code는 정상인데 앱이 크래시가 나는 경우도 있습니다.

왜 그럴까? 세 시스템이 서로 일치해야 하기 때문입니다:

시스템역할
Babel런타임 – 코드를 실행하게 함
TypeScript (tsconfig.json)개발 경험 – VS Code가 import 를 이해하도록 함
Metro(때때로) 겹치는 import 를 해결

표준 설정

리졸버 플러그인을 설치합니다:

yarn add -D babel-plugin-module-resolver

babel.config.js

module.exports = {
  presets: ['module:@react-native/babel-preset'],
  plugins: [
    [
      'module-resolver',
      {
        root: ['./src'],
        extensions: ['.ios.js', '.android.js', '.js', '.ts', '.tsx', '.json'],
        alias: {
          '@components': './src/components',
          '@utils': './src/utils',
          '@assets': './src/assets',
        },
      },
    ],
  ],
};

함정extensions 배열을 빼먹으면(예: .ts/.tsx 누락) Babel이 TypeScript 파일에 별칭을 적용하지 않아 “Module not found” 오류가 발생할 수 있습니다.

tsconfig.json과 동기화 (필수)

{
  "compilerOptions": {
    "baseUrl": "./src",
    "paths": {
      "@components/*": ["components/*"],
      "@utils/*": ["utils/*"]
    }
  }
}

프로덕션을 위한 정리 (Console Log 제거)

console.log는 개발 중에 매우 유용하지만 릴리스 빌드에서는 이 됩니다:

  • JS 브리지 속도가 느려집니다(문자열을 JS와 네이티브 사이에 직렬화해야 함).
  • 사용자가 기기를 컴퓨터에 연결하면 민감한 정보가 노출될 수 있습니다.

스마트 설정 (동적)

babel.config.js에 조건부 로직을 넣을 수 있습니다:

module.exports = function (api) {
  // 캐시를 사용해 빌드 속도 향상
  api.cache(true);

  const presets = ['module:@react-native/babel-preset'];
  const plugins = [];

  // 프로덕션일 때만 console 문을 제거
  if (process.env.NODE_ENV === 'production') {
    plugins.push('transform-remove-console');
  }

  return {
    presets,
    plugins,
  };
};

개발자 인사이트: api.cache(true)(또는 api.cache.using(() => process.env.NODE_ENV))를 사용하면 Babel이 파일마다 설정을 다시 계산하지 않아 빌드 속도가 크게 빨라집니다.

환경 변수 & 캐시 지옥

react-native-dotenv를 사용할 때 Babel은 환경 변수를 문자열 리터럴로 교체합니다.

console.log(process.env.API_URL);
// becomes
console.log("https://api.example.com");

치명적인 함정

.env에서 API_URL을 “dev”에서 “prod”로 바꾸고 앱을 다시 로드해도 여전히 이전 값이 표시될 수 있습니다.

이유: Babel(및 Metro)이 이전 번역을 캐시하고 있기 때문입니다. 소스 라인(process.env.API_URL) 자체가 변하지 않으면 Babel은 다시 번역하지 않습니다.

전문가 솔루션

  • 환경 파일을 변경한 뒤 Metro 번들러를 캐시를 비우고 실행합니다:
npx react-native start --reset-cache
  • 또는 Babel 설정에 .env 파일을 캐시 키에 포함하도록 구성합니다(고급).

요약 – babel.config.js를 위한 3가지 황금 규칙

  1. 삼각형: Babel에서 변경한 모든 경로 별칭은 tsconfig.json에도 동일하게 반영해야 합니다.
  2. 환경: 개발과 프로덕션 설정을 구분합니다(예: 프로덕션에서는 console 로그를 제거).
  3. 캐시 초기화: Babel이나 환경 설정을 수정했을 때는 반드시 --reset-cache 옵션을 사용합니다.
console.log("Thanks for reading!");
Back to Blog

관련 글

더 보기 »

n8n을 EC2 인스턴스에 배포해보자 🚀🚀🚀

나는 자동화를 정말 좋아한다. 나는 항상 내 워크플로우에서 작업들을 자동화하는 것을 사랑했다. n8n을 우연히 발견했을 때, 솔직히 감탄했다. 갑자기 이전에 가졌던 모든 아이디어가…

프로그래밍의 미래에 대비하는 방법

당신은 혼자가 아닙니다. 작가로서 저도 당황하고 있습니다. 같은 질문을 선택한 LLM에 물어보고 활발한 토론을 할 수 있다면, 왜 이것을 읽어야 할까요?