✔️ 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까지는 정상적으로 돌아가는데
을 하는 순간 같은 에러가 났다ㅠ
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시간 돌려줘)
아무튼 이렇게 해서 개발/프로덕션 환경에 따라 다른 디비에 연결되도록 설정을 했다~
참고
'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 |