๐Ÿ’ป์šฉ๋‡ฝ ๊ฐœ๋ฐœ ๋…ธํŠธ๐Ÿ’ป
article thumbnail
๋ฐ˜์‘ํ˜•

[React Native] ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ ํ™˜๊ฒฝ์—์„œ ํ™˜๊ฒฝ ๋ณ€์ˆ˜(.env) ์ ์šฉํ•˜๊ธฐ

๐Ÿ“– ๋“ค์–ด๊ฐ€๋ฉฐ

์ตœ๊ทผ React Native + TypeScript ๋กœ ๊ฐ„๋‹จํ•œ ์–ดํ”Œ์„ ๋งŒ๋“ค๋ฉด์„œ ๊ณต๋ถ€ํ•˜๋˜ ๋„์ค‘์— ํ™˜๊ฒฝ ๋ณ€์ˆ˜ (env)๋ฅผ ์ ์šฉ์ด ํ•„์š”ํ–ˆ๋Š”๋ฐ,

๊ทธ๋ƒฅ React์—์„œ ์‚ฌ์šฉํ•˜๋˜ ๋ฐฉ๋ฒ•๊ณผ ์กฐ๊ธˆ ๋‹ค๋ฅธ ๊ฒƒ ๊ฐ™์•„์„œ ์ƒ์†Œํ–ˆ์Šต๋‹ˆ๋‹ค.

1. react-native-dotenv

react-native-dotenv๋Š” React Native ํ™˜๊ฒฝ์—์„œ ํ™˜๊ฒฝ๋ณ€์ˆ˜(env)๋ฅผ ์ ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

ํ„ฐ๋ฏธ๋„์„ ์ผœ๊ณ  ํ•ด๋‹น ๋ช…๋ น์–ด๋ฅผ ํ†ตํ•ด ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์„ค์น˜ํ•ฉ๋‹ˆ๋‹ค.

npm i react-native-dotenv

๋˜๋Š”

yarn add react-native-dotenv

๊ทธ๋ฆฌ๊ณ  ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ ํ™˜๊ฒฝ์—์„œ๋Š” ์ถ”๊ฐ€๋กœ types๋ฅผ ์„ค์น˜ํ•ด ์ค˜์•ผ ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ ํ™˜๊ฒฝ์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

npm install -D @types/react-native-dotenv

๋˜๋Š”

yarn add -D @types/react-native-dotenv

2. babel.config.js ์—…๋ฐ์ดํŠธ ํ•˜๊ธฐ

๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์„ค์น˜ ํ›„์— babel.config.js ํŒŒ์ผ์˜ ๋‚ด์šฉ์„ ์ˆ˜์ • ํ•ด์ค˜์•ผ ํ•ฉ๋‹ˆ๋‹ค.

module.exports = function (api) {
  api.cache(true);
  return {
    presets: ['babel-preset-expo'],
    plugins: [
      [
        'module:react-native-dotenv',
        {
          moduleName: '@env',
          path: '.env',
          blacklist: null,
          whitelist: null,
          safe: false,
          allowUndefined: true,
        },
      ],
    ],
  };
};

์ˆ˜์ •๋œ ๋‚ด์šฉ ์•ˆ์— moduleName์€ import ํ•  ๋•Œ ๋ช…์‹œํ•œ ์ด๋ฆ„์œผ๋กœ ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์žˆ๋„๋ก ์„ค์ •ํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

import { ENV_VAR } from "@env"

moduleName์„ ๋”ฐ๋กœ ์„ค์ • ์•ˆ ํ•  ์‹œ์—๋Š”

import { ENV_VAR } from "react-native-dotenv"
๋ฐ˜์‘ํ˜•

3. .env ํŒŒ์ผ ์ƒ์„ฑ

๋ฃจํŠธ ๋””๋ ‰ํ† ๋ฆฌ์— .envํŒŒ์ผ์„ ์ƒ์„ฑํ•˜๊ณ  ์‚ฌ์šฉ ํ•˜๊ณ ์ž ํ•˜๋Š” ํ™˜๊ฒฝ ๋ณ€์ˆ˜๋ฅผ .envํŒŒ์ผ ์•ˆ์— ์ถ”๊ฐ€ ํ•ด์ค๋‹ˆ๋‹ค.

์˜ˆ์‹œ)

API_URL=https://yong-nyong.tistory.com

4. env.d.ts

ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ ํ™˜๊ฒฝ์—์„œ๋Š” env.d.ts ํŒŒ์ผ์„ ์ƒ์„ฑํ•˜๊ณ  ์‚ฌ์šฉํ•˜๊ณ ์ž ํ•˜๋Š” ํ™˜๊ฒฝ ๋ณ€์ˆ˜ ํƒ€์ž…์„ ์ง€์ • ํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.

ํ•ด๋‹น ํŒŒ์ผ๊ณผ ๋‚ด์šฉ์„ ์ถ”๊ฐ€๋ฅผ ์•ˆ ํ•  ์‹œ, ํ™˜๊ฒฝ ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๋ ค ํ•  ๋•Œ ํ•ด๋‹น ๋ณ€์ˆ˜๋ฅผ ์ฐพ์„ ์ˆ˜ ์—†๋‹ค๊ณ  ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

declare module '@env' {
  export const API_URL: string;
}

5. ์‚ฌ์šฉํ•˜๊ธฐ

์ด์ œ ๋ชจ๋“  ์…‹ํŒ…์€ ๋๋‚ฌ์Šต๋‹ˆ๋‹ค.

์‚ฌ์šฉ ์˜ˆ์‹œ)

import { API_URL } from '@env';

export async function fetchData() {
  try {
    const data = await fetch(API_URL);
    const json = data.json();
    return json;
  } catch (error) {
    console.error(error);
    return error;
  }
}

๐Ÿ“• ๋งˆ๋ฌด๋ฆฌ

๋ฆฌ์•กํŠธ ๋„ค์ดํ‹ฐ๋ธŒ + ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ ํ™˜๊ฒฝ์—์„œ  react-native-dotenv๋ฅผ ํ†ตํ•ด์„œ ํ™˜๊ฒฝ๋ณ€์ˆ˜(env) ํŒŒ์ผ์„ ์ ์šฉํ•ด ๋ณด์•˜์Šต๋‹ˆ๋‹ค.

๋ฐ˜์‘ํ˜•
profile

๐Ÿ’ป์šฉ๋‡ฝ ๊ฐœ๋ฐœ ๋…ธํŠธ๐Ÿ’ป

@์šฉ๋‡ฝ

ํฌ์ŠคํŒ…์ด ์ข‹์•˜๋‹ค๋ฉด "์ข‹์•„์š”โค๏ธ" ๋˜๋Š” "๊ตฌ๋…๐Ÿ‘๐Ÿป" ํ•ด์ฃผ์„ธ์š”!