
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

WebView 전용 페이지가 외부 브라우저로 열렸을 때의 안내 플로우 처리하기
네이티브 인터페이스가 주입되지 않은 환경으로 진입한 사용자의 경험 저하 문제를, 인터페이스 폴링과 BottomSheet 안내, 플랫폼별 분기로 처리한 과정을 다룹니다.

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

Lighthouse cache-insight를 결정하는 must-revalidate 한 단어
next/image 적용 후 줄어든 Lighthouse cache-insight 항목의 진짜 원인을 추적해, max-age도 응답 크기도 아닌 must-revalidate 한 단어가 게이트 역할을 한다는 사실을 확인한 과정을 정리합니다.