dotenv가 .env 파일을 찾지 못하는 문제 (+ proces.env 파일에 대하여)

김민재·2025년 7월 30일
0

폴더 구조와 파일 내용은 다음과 같다.

폴더 구조

server/                  <-- 루트 폴더
│
├── .env                 <-- 환경변수 파일
├── database/            <-- database 폴더
│   └── updateRankingData.ts
└── apis/                <-- apis 폴더
    └── supabaseClient.ts

.env 파일

SUPABASE_ANON_KEY=eyJhbGciOiJ ...
KOPIS_SERVICE_KEY=060f38 ...

supabaseClient.ts 파일

import { createClient } from '@supabase/supabase-js'
import 'dotenv/config';

const supabaseUrl = "https://razltwjkvwqiyksaydcw.supabase.co";

if (!process.env.SUPABASE_ANON_KEY) {
  console.log(process.env.SUPABASE_ANON_KEY);
  throw new Error("환경변수 SUPABASE_ANON_KEY가 설정되어 있지 않습니다!");
}

const supabaseAnonKey = process.env.SUPABASE_ANON_KEY;
export const supabase = createClient(supabaseUrl, supabaseAnonKey);

export default supabase;

updateRankingData.ts 파일

import supabase from "@/apis/supabaseClient";
import { apiURL, classic, serviceKey } from "@/apis/kopisClient";
import dayjs from "dayjs";
import convert from "xml-js";
import { ElementCompact } from "xml-js";
import { RankingItem, RankingPeriod, pfIdObject } from "@/types/ranking";
import {
  StyUrl,
  Ticketlink,
  PerformanceDetail,
} from "@/types/performanceDetail";

// 랭킹 데이터 업데이트
const getRankingAPI = (period: RankingPeriod) => {
  let stDate = "";

나는 updateRankingData.ts의 파일을 실행하고자 database 폴더로 이동한 후 해당 파일을 실행하였다. 하지만 다음과 같은 에러가 발생했다.

❯ npx ts-node -r tsconfig-paths/register updateRankingData.ts

undefined
/Users/MJKIM/Desktop/dev/project/classichub/classic-hub/server/apis/supabaseClient.ts:8
  throw new Error("환경변수 SUPABASE_ANON_KEY가 설정되어 있지 않습니다!");
        ^
Error: 환경변수 SUPABASE_ANON_KEY가 설정되어 있지 않습니다!
    at Object.<anonymous> (/Users/MJKIM/Desktop/dev/project/classichub/classic-hub/server/apis/supabaseClient.ts:8:9)
    at Module._compile (node:internal/modules/cjs/loader:1529:14)
    at Module.m._compile (/Users/MJKIM/Desktop/dev/project/classichub/classic-hub/server/node_modules/ts-node/src/index.ts:1618:23)
    at Module._extensions..js (node:internal/modules/cjs/loader:1613:10)
    at Object.require.extensions.<computed> [as .ts] (/Users/MJKIM/Desktop/dev/project/classichub/classic-hub/server/node_modules/ts-node/src/index.ts:1621:12)
    at Module.load (node:internal/modules/cjs/loader:1275:32)
    at Function.Module._load (node:internal/modules/cjs/loader:1096:12)
    at Module.require (node:internal/modules/cjs/loader:1298:19)
    at require (node:internal/modules/helpers:182:18)
    at Object.<anonymous> (/Users/MJKIM/Desktop/dev/project/classichub/classic-hub/server/database/updateRankingData.ts:1:1)

supabaseClient.ts 파일에서 .env 파일을 제대로 읽어오지 못하고 있었다.


🔎 원인

환경변수 등록을 위해 구성한 .env 파일의 내용을 읽기 위해 설치한 dotenv 모듈은 기본적으로 명령어를 실행한 현재 작업 디렉터리(working directory) 에서 .env 파일을 찾는다.

하지만 내가 명령어를 실행한 경로는 server/database 였기 때문에 dotenv.env의 내용을 읽지 못한 것이었다.


✅ 해결 방법

.env 파일이 존재하는 디렉토리에서 명령어를 실행한다.


추가 정보)

.env 파일에 저장해놓은 환경 변수들을 dotenv 라이브러리를 이용해서 process.env에 설정할 수 있다.

이 때 import dotenv/config를 하면 dotenv.config()가 자동으로 실행되어 process.env를 참조할 수 있게 되는 것이다.

이 때 .env 파일 안에 있는 데이터들은 dotenv에 의해 프로그램이 실행될 때 process.env에 추가된 것이므로, 프로그램이 종료되면 해당 데이터도 사라지게 된다.

process 는 Node.js에 기본적으로 내장된 전역 객체여서 별도로 불러올(import) 필요없이 프로그램의 어디에서든지 사용할 수 있다.

유의점은 process 객체는 Node.js에서만 사용이 가능하며, 브라우저와 같은 다른 자바스크립트 실행 환경에서는 존재하지 않는 전역 객체이다.

프로그램 실행 종료 후 process.env 를 확인해보면 .env 파일 안에 있는 key 정보가 보이지 않는다.

profile
넓이보단 깊이있게

0개의 댓글