NestJS | production/development환경 각각 다른 DB 사용하기(dotenv)

2022. 11. 19. 22:06·TIL
반응형

✔️ production/development 환경 구분하기

개발을 하면서 이것저것 테스트를 해보게될텐데 배포해서 출시된 프로덕트와 연결된 디비에다가 테스트를 막 하면 안되겠쥬..?

그래서 배포환경/개발환경일때 따라서 각각 다른 db를 사용해야 하는데 환경변수 관리 라이브러리 dotenv를 이용해서 하는 방법이 있다. 

환경에 따라 서로 다른 .env파일을 읽도록 하는것.

 

node.js는 NODE_ENV라는 환경변수를 활용하여 서버의 환경을 구분한다.

package.json 파일을 수정하여 npm run start:dev 명령이 수행될 때 NODE_ENV가 development로 설정되도록 한다.

// package.json
"scripts": {
    ...
    "start:dev": "NODE_ENV=development nest start --watch",
    ...
  },

 

그리고 env라는 폴더를 만들어 개발환경에서 사용할 환경변수를.development.env에, 프로덕션환경에서 사용할 환경변수를 .production.env에 저장해준다.

난 테스트를 위해 CURRENT_MODE에 prod, dev를 저장해놨다.

 

그리고 main.ts에 아래와 같은 코드를 추가해준다.

// main.ts
import * as dotenv from 'dotenv';
import * as path from 'path';

dotenv.config({
  path: path.resolve(
    (process.env.NODE_ENV === 'development') ? 'env/.development.env' : 'env/.production.env'
  )
});

NODE_ENV가 development일 때는 .development.env, 아닐때는 .production.env파일을 읽도록 설정해준다.

 

// main.ts
async function bootstrap() {
  const app = await NestFactory.create(AppModule);
  await app.listen(process.env.SERVER_PORT);
  console.log(process.env.CURRENT_MODE);
}

테스트하기위해 콘솔에 CURRENT_MODE를 출력하게 하고 실행해보면

 

> npm run start

> npm run start:dev

환경에 맞게 다른 env파일을 잘 읽는걸 확인할 수 있다.

 

 

✔️ DB 연결하기

난 configs/typeorm.config.ts에 typeORMConfig를 작성하고

app.module.ts에서 임포트했다.

 

main.ts는 이렇게 작성해놨는데

[Nest] 66182  - 2022. 11. 19. 오후 9:32:49   ERROR [TypeOrmModule] Unable to connect to the database. Retrying (1)...
Error: Access denied for user ''@'localhost' (using password: YES)

계속 이런 에러가 났다.

 

그래서 typeORMConfig를 환경변수를 불러오지 않고 각각 넣어줘봤는데 잘 돌아갔다.

그럼 환경변수를 못읽는건가? 해서 전체 환경변수도 콘솔에 찍어봤는데 제대로 나왔다......ㅠ

그래서 옵션을 한줄한줄 환경변수를 불러오도록 바꾸면서 계속 실행해봤다.

이런식으로......

port까지는 정상적으로 돌아가는데

username: process.env.DATABASE_USERNAME

을 하는 순간 같은 에러가 났다ㅠ

host port는 잘 불러오면서 왜 username하고 password만???

username하고 password만 못읽어오는 이유는.............?

고통의흔저규

아무데서도 답을 찾을수가 없었다ㅠ

겹치는 로컬 변수가 있나 해서 다시 찍어봐도 정상적으로 잘 나오는데 왜 접속실패일까

그러다가 에러메세지에서 ''@'localhost' 이부분이 눈에 들어와서 

username: 'root',
password: process.env.DATABASE_PASSWORD,

코드를 이렇게 수정했더니 에러메세지가 

Error: Access denied for user 'root'@'localhost' (using password: YES)

이렇게 바뀌었다

못읽는거네 근데왜............?????????

그러다 아 설마설마............;;;;;;;;;;;;;;;ㅠㅠㅠㅠㅠㅠㅠㅠㅠ

하고 main.ts의 코드를 바꿔봤다 이렇게 환경변수 설정을 위로...

그랬더니 정상동작했당..ㅎㅎ

AppModule 안에 typeORMConfig가 있으니까 env파일을 먼저 읽고 AppModule을 불러와야하는데

순서가 거꾸로돼서 환경변수가 안읽혔던것같다.

그런데 대체왜.............

DATABASE_HOST랑 DATABASE_PORT랑은 읽고 username부터 못읽은걸까???????

-> 는 host랑 port를 읽은게 아니었다~

https://github.com/mysqljs/mysql#connection-options

여기 들어가서 보면

host의 기본값은 localhost,

port의 기본값은 3306으로 설정돼있다

그래서 host, port에 환경변수를 넣었을때 아무것도 안들어가서 기본값으로 설정되어 정상적으로 연결됐던것!ㅠ(내 2시간 돌려줘)

 

아무튼 이렇게 해서 개발/프로덕션 환경에 따라 다른 디비에 연결되도록 설정을 했다~

 

 

참고

https://wikidocs.net/158579

반응형
저작자표시 비영리 변경금지 (새창열림)

'TIL' 카테고리의 다른 글

NestJS | TypeORM: entity 정의(soft delete, 추상클래스)  (0) 2022.11.21
NestJS | @nestjs/config 패키지를 활용한 환경변수 관리 -> db연결  (0) 2022.11.21
NestJS | 패키지 버전 지정해서 세팅하기  (0) 2022.11.19
node.js | 인스타그램: 비밀번호 암호화(bcrypt)  (1) 2022.10.04
node.js | 인스타그램: 게시글 CRUD  (1) 2022.10.04
'TIL' 카테고리의 다른 글
  • NestJS | TypeORM: entity 정의(soft delete, 추상클래스)
  • NestJS | @nestjs/config 패키지를 활용한 환경변수 관리 -> db연결
  • NestJS | 패키지 버전 지정해서 세팅하기
  • node.js | 인스타그램: 비밀번호 암호화(bcrypt)
이라후
이라후
  • 이라후
    화이팅
    이라후
  • 전체
    오늘
    어제
    • 분류 전체보기 (133)
      • TIL (23)
      • 기타 (26)
      • Python (14)
      • Django (10)
      • JavaScript (8)
      • git & GitHub (8)
      • Web (10)
      • Go (3)
      • wecode (31)
  • 반응형
  • 인기 글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
이라후
NestJS | production/development환경 각각 다른 DB 사용하기(dotenv)
상단으로

티스토리툴바