
React 프로젝트를 진행하면서 하나의 프로젝트에 동시에 여러 개의 개발 서버를 둬야 하는 상황이 생겼습니다. 개발 서버마다 DB가 달라 프론트엔드에서 사용하는 API 주소도 각각 다르게 설정되어야 했는데, 별도의 코드 분리 없이 API 주소만 분리 관리할 방법이 없을지 고민하다가 env 파일의 환경 변수를 활용하기로 했습니다.
env-cmd란?
env-cmd는 env 파일을 관리할 때 더 자유로운 네이밍 규칙을 사용할 수 있게 해주고, env 파일을 여러 개로 나눠 환경별로 다른 환경 변수를 주입할 수 있도록 도와주는 라이브러리입니다. Node.js로 실행되는 환경이라면 어디서든 사용할 수 있다는 장점이 있습니다.
적용방법
우선 프로젝트 루트에 .env, .env.development, .env.production 파일을 만들고 아래처럼 값을 설정합니다.
// .env
REACT_APP_DEPLOY_MODE=local
REACT_APP_FETCH_BASE_URL=http://www.fetch-url1.com
// .env.development
REACT_APP_DEPLOY_MODE=development
REACT_APP_FETCH_BASE_URL=http://www.fetch-url2.com
// .env.production
REACT_APP_DEPLOY_MODE=production
REACT_APP_FETCH_BASE_URL=http://www.fetch-url3.com프로젝트 루트의 package.json을 열어 scripts를 아래처럼 수정합니다.
"scripts": {
"start": "react-scripts start",
"build": "env-cmd -f .env react-scripts build",
"build-development": "env-cmd -f .env.development react-scripts build",
"build-production": "env-cmd -f .env.production react-scripts build",
"test": "react-scripts test",
"eject": "react-scripts eject",
},
이제 yarn build, yarn build-development, yarn build-production 명령어를 실행하면 각각 scripts에 지정한 .env 파일을 참조해 빌드합니다.
// app.js
function App() {
return (
<div className="App">
<h1>Deploy mode : {process.env.REACT_APP_DEPLOY_MODE}</h1>
<h2>Fetch base url : {process.env.REACT_APP_FETCH_BASE_URL}</h2>
</div>
);
}각 build별로 env 파일이 제대로 적용되었는지 확인하기 위해 app.js에서 환경 변수를 출력하도록 했습니다.
결과
1) yarn build

2) yarn build-development

3) yarn build-production

각 build마다 설정된 env 환경 변수가 출력되는 것을 확인할 수 있습니다.
샘플 코드
참고 자료
Related Posts

Lighthouse 접근성 점수가 움직이지 않은 이유
Lighthouse 자동 검사가 잡는 영역과 잡지 않는 영역을 구분하고, 마크업 4건을 정리해 접근성 점수를 84점에서 95점까지 올린 과정을 다룹니다.

GitHub Actions으로 레포 간 workflow 체이닝하기
repository_dispatch를 활용하여 패키지 publish부터 호스트 프로젝트의 버전 업데이트, 스토리북 빌드, 배포까지 자동화한 과정을 정리합니다.

Next.js GitHub Pages 배포 트러블슈팅: export, basePath, configure-pages
GitHub Pages에 Next.js를 정적 export로 배포하면서 겪은 문제점과 디버그/해결 과정을 정리했습니다.