🤔 환경변수란?
환경변수는 프로젝트 전체에서 참조할 수 있는 변수 만들 수 있어 편리하게 이용된다.
환경변수로 변수를 선언하시면 JS파일 내에서 지역변수로 선언한 것 과같이 변수를 참조해 올 수 있다.
기본적으로 NODE_ENV라는 환경변수가 있고,
필요에따라 REACT_APP_으로 시작하는 다른 환경 변수들도 설정할 수 있다.
이 둘에 대한 이야기는 아래에서 각각 더 자세히 다룬다.
💡 NODE_ENV는 현재의 모드를 가르킨다
Node.js의 express 서버를 실행할 때 필요한 변수이다.
NODE.ENV는 지금 돌아가고 있는 어플리케이션의 모드를 특성화 시키는 환경변수이다.
보통은 'development'와 'production' 이 두가지 문자열로 등장한다.
아래의 코드를 보면 어떤 식으로 쓰이는지 더 잘 이해가 갑니다. (코드 출처)
const { NODE_ENV } = process.env as {[key as string]: string}
// 환경변수의 경우 반환값이 항상 string입니다.
const isPro = NODE_ENV === 'production';
const isDev = NODE_ENV === 'development';
const isTest = NODE_ENV === 'test';
if(isDev){
// 개발자 모드
}else if(isPro){
//프로덕션 모드
}else if(isTest){
//테스트 모드
}else{
// 에러!!
}
지금 내가 npm start로 개발모드 중이냐, 아님 npm build로 배포모드이냐, 아님 npm test로 테스트 모드이냐에 따라
NODE_ENV라는 환경 변수가 각각 모드에 맞게 변하고, 이를 이용해서 다양한 로직을 짤 수 있다.
create-react-app으로 리액트 앱 개발을 실행할 경우
package.json에 자동으로 들어가있는 아래의 부분을 보면 ...
"scripts": {
"start": "react-scripts start",
"build": "react-scripts build",
"test": "react-scripts test",
"eject": "react-scripts eject"
},
바로 요기서 어떤 명령어를 실행하냐에 따라 저 ENV변수가 설정될 것이다.
App.js에 아래의 코드를 넣고 npm start를 하면
console.log(`NODE_ENV = ${process.env.NODE_ENV}`);
콘솔창에 'NODE_ENV = development' 가 뜬다.
📌 리액트 커스텀 환경변수는 REACT_APP_으로 시작
NODE_ENV외에도 직접 환경 변수를 지정하여 편하게 꺼내다 쓸 수 있다.
이때에는 꼭 REACT_APP_으로 시작하여 네이밍을 해야한다.
아래는 REACT_APP_ 환경변수를 이용해서 토큰을 저장하고, 서버에 요청보낼때 꺼내서 사용하는 예시이다.
💙 1. 프로젝트 최상위 디렉토리에 .env파일을 생성한다.

💙 2. .env파일 내부에 환경변수를 설정한다.

🛑주의
- 변수명은 반드시 REACT_APP_ 키워드로 시작한다.
-쌍따옴표, 작은 따옴표, 띄어쓰기 모두 ❌ (대문자로작성하고 띄어쓰기는 언더바(_)사용)
💙 3. 서버에 요청보낼 파일내에서 process.env.[변수명]로 접근해서 값을 가져온다.
import { graphql } from '@octokit/graphql';
const { REACT_APP_GITHUB_AGORA_STATES_TOKEN, NODE_ENV } = process.env; //📌
async function getRepository() {
let token;
//📌NODE_ENV 환경 변수 활용 'production'일때는 token에 아무것도 할당되지 않아서 번들에 포함안됨
if (NODE_ENV === 'development' || NODE_ENV === 'test') {
token = REACT_APP_GITHUB_AGORA_STATES_TOKEN;
}
const { repository, viewer } = await graphql(
`
{
repository(owner: "codestates-seb", name: "agora-states-fe") {
discussionCategories(first: 100) {
edges {
node {
id
name
}
}
}
discussions(first: 100) {
edges {
node {
category {
name
}
author {
login
avatarUrl
}
createdAt
title
id
updatedAt
bodyHTML
url
answer {
author {
login
avatarUrl
}
bodyHTML
createdAt
id
}
}
}
}
},
viewer{
login
avatarUrl
}
}
`,
{
headers: {
authorization: `token ${token}`, //📌
},
}
);
return {repository, viewer};
}
export default getRepository;
💡참고:
-위 코드에서는 graphQL의 쿼리를 로컬 환경에서 쉽게 수행할 수 있게 도와주는 라이브러리 octokit/graphql을 사용하고 있다.
-서버로 부터 받아올 때는 async와 await꼭 써줘야한다. (함수가 실질적으로 쓰이는 곳엔 useEffect와 then,catch이용)
-Github GraphQL Explorer를 사용하여 깃허브 데이터를 받아오는 실습을 할 수 있다.
-실습해보고 코드에 적용할땐, 깃허브>settings>developer settings> 토큰이 필요하다.
💙 4. 깃허브에 올릴 때는 꼭 .env 파일을 추가하여 비밀정보가 노출되지 않도록 한다.

🔥 그 밖의 .env 활용
env 파일 자체를 나누어, 각각 모드에따라 다른 환경 변수가 설정되도록 할 수 있다.
더 자세한 내용은 링크 참고 (https://han-py.tistory.com/441)
| .env | 기본 |
| .env.local | 기본 .env를 덮어쓰는 파일, Test를 제외한 모든 환경에서 로딩됨 |
| .env.development | 개발 환경(npm start)에서 로딩 |
| .env.test | 테스트 환경(npm test)에서 로딩 |
| .env.production | 배포 환경(npm run build)에서 로딩 |
또 이러한 파일은 각 명령어에서 다음의 우선순위를 적용받는다.
| npm start | env.development.local > .env.local > .env.development > .env |
| npm run build | .env.production.local > .env.local > .env.production > .env |
| npm test | env.test.local > .env.test > .env (note .env.local is missing) |
💙참고자료
Adding Custom Environment Variables

'개념 > React' 카테고리의 다른 글
| hoxy...Proxy가 왜 필요한지 아시나요? 정확히요... (1) | 2022.10.13 |
|---|---|
| 웹팩 기본 구조 (1) | 2022.09.26 |
| 번들링과 웹팩, 무엇이고 왜 필요할까? (1) | 2022.09.26 |
| [React] useRef사용법, 언제 써야 할까? (0) | 2022.08.30 |
| [React] Styled Components 시작하기, styled-reset 추가 하기 (0) | 2022.08.29 |