저장을 습관화

230808 TIL - 잘못 알고 있던 부분을 바로 잡았다. 본문

공부/TIL

230808 TIL - 잘못 알고 있던 부분을 바로 잡았다.

ctrs 2023. 8. 8. 21:15

그 동안 헛짓을 했었다.

정리하자면

 

1. .env 

node.js위에서 sequelize를 쓸때,

$ npx sequelize init을 입력하면 

/config/config.json, /models/index.js, /migrations 파일들이 생성된다.

 

그리고 config.json에 DB의 HOST(나의 경우엔 AWS RDS 주소), DB사용자 정보와 패스워드 등

민감한 정보가 들아가기에 이를 숨기기 위해 .env를 사용한다.

 

 

2. 지금까지 어떻게 썼었나

2-1. /config/config.json 파일에 아래와 같이 정보를 넣고

{
  "development": {
    "username": (생략),
    "password": (생략),
    "database": (생략),
    "host": "express-database.(생략).rds.amazonaws.com",
    "dialect": "mysql"
  },
// 생략
}

sequelize db:create, sequelize db:migrate 등의 작업이 이상없이 진행되었다 싶으면?

 

 

2-2. .env파일을 생성, 진짜 정보는 여기에 넣고

DB_HOST=express-database.(생략).rds.amazonaws.com
DB_USER=(생략)
DB_PASS=(생략)
DB_NAME=(생략)
DB_DIALECT=mysql

 

2-3. /config 폴더 밑에 config.js 파일을 생성, 진짜 정보들을 받아올 수 있게 사용하였다.

require('dotenv').config();
module.exports = {
  development: {
    username: process.env.DB_USER,
    password: process.env.DB_PASS,
    database: process.env.DB_NAME,
    host: process.env.DB_HOST,
    dialect: process.env.DB_DIALECT,
  },
// 생략
};

 

2-4. 그 후 .gitignore에 config, .env를 적어서 github에 올라가지 않게끔만 하였다.

 

하지만 sequelize는 여전히 /config/config.json의 내용을 읽고 있었던 거고,

나는 그 동안 쓰이지도 않을 헛파일 2개만 추가했던 거였다.

 

적고 있으니까 지금까지 이상하다고 느끼지 못했다는 것도 신기하다

sequelize가 알아서 어련히 하고 있겠거니 했었나보다

 

 

3. /config 폴더 밑에 config.js 파일을 왜 만드느냐

.env에 숨겨놓은 내용을 가져오기 위해 자바스크립트의 기능이 필요했던 거였다

 

JSON파일은 데이터 표현식이기 때문에, 자바스크립트처럼 import, export, require 등 파일 간 내용 공유의 개념이 없다.

.env를 준비한다고해도 JSON에서 그 내용을 불러올 방법이 없다.

 

따라서 .env에 내용, config.js에 내용 가져오기 로직을 넣은 후

sequelize가 config.json이 아닌 config.js를 사용하게끔 하려면

 

/models/index.js에서 sequelize가 내용을 불러올 대상을 수정해줘야 한다.

'use strict';

// 생략

// before
// const config = require(__dirname + '/../config/config.json')[env];

// after
const config = require(__dirname + '/../config/config.js')[env];

// 생략

module.exports = db;

 

지금은 이렇게 적용한 상황이고

config.json은 삭제하였다.

테스트 결과 문제없이 잘 진행되고 있다.

 

 

4. 이 사실을 알게된 계기

혼자서 작업을 하다가,

github에 올라가있는 팀원이 작성한 파일이 필요해서,

git pull을 했는데 계속 에러가 나길래,

우선 내가 작성한 파일을 PR 보내고, 

내 로컬에 있는 파일들을 싹 지우고,

gihub repository에서 다시 통으로 clone 받아왔다.

 

그런 후 API 작성 후 테스트 해보니

DB 접근하는 부분에서

getaddrinfo ENOTFOUND your database 에러가 발생하더라

 

검색해보니 DB에 접근할 수 없을때 발생하는 에러라고 나오는데

sequelize db:drop, sequelize db:create는 잘 먹히는거보면 네트워크 문제는 아닌것 같거든?

뭐가 문제지? 하면서 찾아보니까

 

config.json에는 엉뚱한 내용이 들어가 있었고

이게 무슨 상황인지 튜터님께 질문을 하다가 알게되었다.

 

config.json도 지우고 다시 만들고,

config.js도 지우고 다시 만들고 했지만

큰 문제 하나 제대로 잡았으니 다행이다.

 

 

내용 추가

5. 잘못된 config.json을 가지고 있었으면서 npx sequelize db:create, db:drop, db:migrate는 왜 멀쩡히 되던거지?

그것도 내 RDS 밑에서?

 

5-1. config.json, config.js 둘 다 없을때

config/config.json 파일을 읽을 수 없다고 나온다.

여기까지는 알고 있던 내용

 

 

5-2. config.json은 있지만 config.js는 없을때 (단, config.json의 내용은 잘못되었다.)

getaddrinfo ENTFOUND your database 

니 DB에 접근할 수 없다는 에러가 나온다.

 

config.json의 내용이 정상적이라면 쓰여진 설정 내용에 따라서 DB가 생성되었을 것이다.

 

 

5-3. config.json이 없지만, config.js는 있을때

5-3-1. config.js가 .env를 보고 있으나, .env의 내용이 없을때

sequelize가 config/config.js를 읽으려고 했으나

Dialect, 즉 어떤 DB를 사용할 것인지에 대한 내용이 없어 에러가 발생했다.

 

/models/index.js에 /config/config.js에 대한 언급이 전혀 없음에도

sequelize가 알아서 config.js를 인지하고, 접근한 것이다.

 

 

sequelize 공식 문서에 보면 아래와 같이 설명하고 있다.

'sequelize는 각 dialect의 기본 연결 포트를 사용합니다(예를 들어, postgres는 5432).

만약 다른 포트를 지정하고 싶다면, "port" 필드를 사용하십시오.(기본적으로 config/config.js를 제공하지는 않지만, 간단히 만들 수 있습니다.' 

 

'설정 파일은 기본적으로 config.json이라는 JSON입니다. 하지만 때로 환경 변수에 접근하거나 구성을 결정하기 위해 동적 설정이 필요합니다. 

 

고맙게도, Sequelize CLI는 .json과 .js 파일 모두 읽을 수 있습니다. 이건 .sequelizerc 파일에서 설정할 수 있습니다. export한 개체의 config 옵션에 .js 파일의 경로를 제공하기만 하면 됩니다.'

 

'이제 sequelize CLI는 설정 옵션을 가져오기 위해 config/config.js을 읽을 것입니다.'

 

.sequelizerc 파일은 찾지 못했지만, 별도의 설정 없이도 sequelize가 알아서 config.js를 인지하고,

config.json이 없다면 config.js에 접근하는 것으로 보아

이것이 sequelize의 기본 구성이라고 생각된다.

 

config.js에 대한 설명이 좀 더 많고 자세했으면 좋았을것 같다.

 

https://sequelize.org/docs/v6/other-topics/migrations/

 

Migrations | Sequelize

Just like you use version control systems such as Git to manage changes in your source code, you can use migrations to keep track of changes to the database. With migrations you can transfer your existing database into another state and vice versa: Those s

sequelize.org

 

 

5-3-2. config.js와 .env가 정상적일때

sequelize가 config.json이 없다는것을 인지하고

대신 config.js의 내용을 읽어와 DB와 테이블을 정상적으로 생성하였다.

 

생성된 DB 테이블에 접근하는 코드를 실행시키면

DB에 데이터가 정상적으로 생성되는 것을 확인할 수 있다.

 

 

5-4. config.json, config.js, .env가 모두 존재하지만

config.json은 잘못된 내용을 가지고 있고, config.js와 .env는 정상적일때 (오늘 작업하던 상태와 동일)

config.json이 정상이 아니라는 것을 파악했는지 

config.js를 보고 sequelize db:create, db:drop, db:migrate 등의 DB 및 테이블 추가 삭제를 진행하였다.

 

기분탓일지는 모르겠지만 config.json이 없었을때보다 조금 더 오래 걸린 것 같기도 하다.

 

그리고 생성된 DB 테이블에 접근하는 코드를 실행시키면

database를 찾을 수 없다는 에러메세지가 나온다.

 

이를 통해

자바스크립트와 같은 코드를 사용해 DB에 접근하려고 한다면

config.json의 정상여부, config.js의 존재유무를 따지지 않고 config.json에만 접근한다는 것을 알수 있었다.

 

동적 설정을 위해 config.js를 만들었다면 config.json은 지워주도록 하자