Firebase Functions로 서버리스 환경을 구축하면서, 로컬 개발과 배포 환경의 차이로 인해 어느 환경에서 서버리스 함수를 테스트하느냐에 따라 귀찮게 자꾸 코드를 다시 작성해야 하는 문제가 있었습니다. 개발 환경에서 기능 만들면서 잘 작동하는지 확인하고, 배포한 후에 다시 작동 확인을 하는데, 그 때마다 클라이언트와 서버에서 redirect URI를 다르게 설정해줘야하는게 매우 매우 매우 귀찮을 것 같아서 그냥 딸깍 한번으로 처리할 수 없는지 고민했습니다.
.env
를 직접 수정하는 대신 간단하게 처리할 수 있었으면 좋겠음.vite --mode test
명령어로 환경에 따라 VITE_FIREBASE_KAKAO_REDIRECT_URI
와 VITE_FIREBASE_FUNCTIONS_API_URL
를 다르게 설정하기
.env.local
에 설정된 환경변수에 접근하여 에뮬레이터로 띄워둔 서버리스 함수의 주소(http://127.0.0.1:5001/내 프로젝트 id/~~~
)에 접근함vite --mode test
로 .env.test
파일을 사용해 실제 배포된 서버리스 함수의 주소(https://지역-내 프로젝트 id.cloudfunctions.net
)에 접근함// package.json
"scripts": {
"dev": "vite",
"test-deploy": "vite --mode test"
}
npm run test-deploy
로 실행하고, 에뮬레이터로 띄운 상태일 때는 npm run dev
로 실행하면 됩니다.process.env.NODE_ENV
Firebase Functions에서 개발 환경과 배포 환경에서 환경 변수에 접근하는 방식이 다르다는 점을 이용해보기로 했습니다.
import { config } from 'dotenv';
config();
export const isProduction = process.env.NODE_ENV === 'production';
src/config/environment.ts
에 이렇게 작성해주고, functions
디렉토리의 .env
에는 NODE_ENV=development
로 넣어줍니다.
그리고 firebase CLI에서 firebase functions:config:set env.node_env=production
명령어로 firebase 환경변수의 NODE_ENV
값을 production
으로 설정해줍니다.
개발 환경:
process.env.NODE_ENV
를 호출하면 functions 디렉토리의 .env
파일에 접근하여 설정된 NODE_ENV
값을 가져옵니다. 예를 들어, .env
에 NODE_ENV=development
가 설정되어 있다면 그대로 사용합니다.
배포 환경:
배포 환경에서는 로컬에만 존재하는 .env에 접근할 수 없으니, dotenv
의 config
으로 환경변수를 불러와도 아무것도 로드되지 않습니다.
대신, process.env.NODE_ENV
는 우리가 CLI에서 설정한 firebase 환경변수인 NODE_ENV
에 접근하고, production
이라는 값을 가져옵니다.
환경에 따라 다른 비밀 불러오기:
export async function getKakaoRedirectUri(): Promise<string> {
console.log(process.env.NODE_ENV);
if (!isProduction) {
console.log('개발 환경입니다.');
const redirectUri = getSecret('KAKAO_REDIRECT_URI_DEV');
console.log(`현재 redirectURI는: ${redirectUri}`);
return redirectUri;
}
return getSecret('KAKAO_REDIRECT_URI');
}
개발 환경이면 KAKAO_REDIRECT_URI_DEV
비밀을, 아니면 KAKAO_REDIRECT_URI
비밀을 반환합니다.
실제로 process.env.NODE_ENV
값을 콘솔에서 띄워보면, 개발 환경과 배포 환경에서 각각 다음과 같이 확인할 수 있습니다.
![]() | ![]() |
---|
isProduction
을 활용하면 개발/배포 환경에 따라 다르게 작동해야 하는 다른 기능을 만들때도 간편할 것 같음. 확장성이 높아짐(아마도)