๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
Back-end/SQL

.env ํŒŒ์ผ ๊ด€๋ฆฌ๋ถ€ํ„ฐ dotenv & DB๋ž‘ NodeJS ์—ฐ๊ฒฐํ•˜๊ธฐ

by ciocio 2021. 11. 13.

๐Ÿ“Œ  .env ํŒŒ์ผ ?-?

 

" ํ™˜๊ฒฝ ๋ณ€์ˆ˜ ํŒŒ์ผ "  ์„ ์˜๋ฏธํ•œ๋‹ค.

์ด ํŒŒ์ผ์€, ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ์‹คํ–‰๋  ๋•Œ ๋„˜๊ธฐ๊ณ  ์‹ถ์€ ํŠน์ • ๊ฐ’์„ ๋‹ด๊ณ  ์žˆ๋Š” ๋ณ€์ˆ˜๊ฐ€ ๊ธฐ๋ก๋˜์–ด ์žˆ๋‹ค.

๋ฏธ๋ฆฌ ์ •์˜๋œ ๊ฐ’์„ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ํ™œ์šฉํ•˜๊ณ  ์‹ถ์„ ๋•Œ ์ด .env ํŒŒ์ผ์„ ํ™œ์šฉํ•œ๋‹ค.

 

๐Ÿ“‚  .env

 

// .env ํŒŒ์ผ
// DB์— ์ ‘์†ํ•˜๊ธฐ ์œ„ํ•ด ํ•„์š”ํ•œ username๊ณผ password์™€ dbname์„ ๋ณ€์ˆ˜์— ์ฐจ๋ก€์ฐจ๋ก€ ๋‹ด์•„์คฌ๋‹ค.

DATABASE_USERNAME='lee'
DATABASE_PASSWORD=1234
DATABASE_NAME='learnsql'

// .env ํŒŒ์ผ
// local URI ์™€ test server๋ฅผ ์œ„ํ•œ URI, id์™€ ๋น„๋ฐ€๋ฒˆํ˜ธ ๋“ฑ๋“ฑ ๋‹ค์–‘ํ•œ ๋ฐฉ์‹์œผ๋กœ ๋‹ด์•„๋‘˜ ์ˆ˜ ์žˆ๋‹ค.

REACT_APP_LOCAL_URI=http://localhost:8080/
REACT_APP_TEST_SERVER=http://test.com:9090/

clientId=client-test1111
clientServer=server-test1111

 

์œ„์—์„œ ์„ค์ •ํ•œ ๋ณ€์ˆ˜๋“ค์€ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋กœ์ง์—๋„ ํ™œ์šฉํ•  ์ˆ˜ ์žˆ๊ณ , ์›นํŒฉ์œผ๋กœ ๋นŒ๋“œํ•  ๋•Œ๋„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

 

 

๐Ÿ“Œ  .env ํ™œ์šฉ ๋ชจ๋“ˆ - dotenv ?

 

๐Ÿ“Ž  dotenv

 

nodeJS ์˜ ๋ชจ๋“ˆ๋กœ, npm ์„ ์‚ฌ์šฉํ•ด ์„ค์น˜ํ•˜๊ณ  ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

dotenv ๋ฅผ ์‚ฌ์šฉํ•ด ํ˜„์žฌ ๋””๋ ‰ํ† ๋ฆฌ์— ์œ„์น˜ํ•œ .env ํŒŒ์ผ๋กœ๋ถ€ํ„ฐ ํ™˜๊ฒฝ ๋ณ€์ˆ˜๋ฅผ ์ฝ์–ด๋‚ผ ์ˆ˜ ์žˆ๋‹ค.

 

// npm install dotenv (node.js์— dotenv ์„ค์น˜ํ•˜์‹œ๊ตฌ์š”)

// ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ์ž‘๋™๋  ๋•Œ ๊ฐ€์žฅ ๋จผ์ € ์‹คํ–‰๋˜๋Š” jsํŒŒ์ผ์˜ ์ตœ์ƒ๋‹จ์—์„œ config() ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•ด์ฃผ๋ฉด
// .envํŒŒ์ผ์— ์ €์žฅ๋œ ํ™˜๊ฒฝ ๋ณ€์ˆ˜๋ฅผ process.env ๋ชจ๋“ˆ์„ ํ†ตํ•ด ๋ถˆ๋Ÿฌ์˜ฌ ์ˆ˜ ์žˆ๋‹ค.
require("dotenv").config();

console.log("DATABASE_USERNAME: ", process.env.DATABASE_USERNAME);
console.log("DATABASE_PASSWORD: ", process.env.DATABASE_PASSWORD);
console.log("DATABASE_NAME: ", process.env.DATABASE_NAME);

// DATABASE_USERNAME: lee
// DATABASE_PASSWORD: 1234
// DATABASE_NAME: learnsql

 

// ๋งŒ์•ฝ์— .env๊ฐ€ ์•„๋‹ˆ๋ผ ๋‹ค๋ฅธ ๊ฒฝ๋กœ์— ์‚ฌ์šฉํ•  ํ™˜๊ฒฝ ๋ณ€์ˆ˜๋ฅผ ์ €์žฅํ•ด๋’€๋‹ค๋ฉด
// config ํ•จ์ˆ˜์— pathํ‚ค์— ๊ฒฝ๋กœ๋ฅผ ๋‹ด์€ ๊ฐ์ฒด๋ฅผ ์ธ์ž๋กœ ์ „๋‹ฌํ•ด์„œ ํ˜ธ์ถœํ•˜๋ฉด๋œ๋‹ค.
require("dotenv").config({path: "/path/.env.example"});

 

 

๐Ÿ“Œ  ํ™˜๊ฒฝ ๋ณ€์ˆ˜ ํ™œ์šฉํ•ด์„œ DB ๋ž‘ NodeJS ์—ฐ๊ฒฐํ•˜๊ธฐ - mysql ?

 

๐Ÿ“Ž  mysql

 

.env ์— ๋“ค์–ด์žˆ๋Š” ํ™˜๊ฒฝ ๋ณ€์ˆ˜๋“ค์„ nodeJS ์—์„œ ์ž˜ ๋ถˆ๋Ÿฌ์™”๋‹ค๋ฉด, ์ด์ œ๋ถ€ํ„ด DB๋ฅผ ์—ฐ๊ฒฐํ•ด๋ณด์ž !! 

mysql ์€ nodeJS ์˜ ๋ชจ๋“ˆ๋กœ, npm ์„ ์‚ฌ์šฉํ•ด ์„ค์น˜ํ•˜๊ณ  ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

์›ํ•˜๋Š” ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์™€ nodeJS ๋ฅผ ์—ฐ๊ฒฐํ•  ๋•Œ ํ•„์š”ํ•˜๋‹ค :)

 

// npm install mysql (node.js์— mysql ์„ค์น˜ํ•˜์‹œ๊ตฌ์š”)

const dotenv = require("dotenv");
const mysql = require("mysql");

dotenv.config();

const connection = mysql.createConnection({
  host     : 'localhost',
  user     : process.env.DATABASE_USERNAME || 'root',
  password : process.env.DATABASE_PASSWORD || '',
  database : process.env.DATABASE_NAME || 'learnsql'
});

connection.connect();

// query๋ฌธ ์ฒ˜๋ฆฌํ•œ ํ›„

connection.end();

 

mysql ๋ชจ๋“ˆ์—์„œ createConnection ์ด๋ž€ ๋ชจ๋“ˆ์— ์ฐฉ์ฐฉ key์™€ value๋ฅผ ๋งž์ถฐ ๋„ฃ์–ด์ฃผ๋ฉด ์›ํ•˜๋Š” DB์™€ ์—ฐ๊ฒฐํ•  ์ˆ˜ ์žˆ๋‹ค *!*

 

// connect ๋ฉ”์„œ๋“œ์— ์ฝœ๋ฐฑ ํ•จ์ˆ˜ ๋„ฃ์–ด์„œ DB์™€ NodeJS์˜ ์—ฐ๊ฒฐ ์—ฌ๋ถ€ ํ™•์ธํ•˜๊ธฐ 

connection.connect(function(err){
  if(err) throw err;
  console.log("Connected!");
})

 

์ด๋Ÿฐ์‹์œผ๋กœ ํ•จ์ˆ˜๋ฅผ ์ „๋‹ฌํ•จ์œผ๋กœ์จ ์—ฐ๊ฒฐ์ด ์ž˜ ๋˜์—ˆ๋Š” ์ง€ ์•ˆ๋˜์—ˆ๋Š” ์ง€ ํ™•์ธํ•  ์ˆ˜๋„ ์žˆ๊ณ 

 

// query ๋ฉ”์„œ๋“œ์— ์ฝœ๋ฐฑ ํ•จ์ˆ˜ ๋„ฃ์–ด์„œ ์›ํ•˜๋Š” SQL ๊ฒฐ๊ณผ ๋“ค๊ณ  ์˜ค๊ธฐ

const sql = `SELECT * FROM table` // ์˜ˆ์‹œ SQL๋ฌธ

connection.connect(function(){
  connection.query(sql, function(err, result){
  	if(err) throw err;
    console.log("Result: ", result);
  });
});

// connect ์•ˆ๊ณผ ๋ฐ– ๋ชจ๋‘ query ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

connection.query(sql, function(err, result){
  if(err) throw err;
  console.log("Result: ", result);
});

 

query ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•ด์„œ DB์—์„œ ์›ํ•˜๋Š” ๊ฒฐ๊ณผ๋ฅผ ๋“ค๊ณ  ์˜ฌ ์ˆ˜๋„ ์žˆ๋‹ค >_>

 

 

๐Ÿ“  ์‚ฝ์งˆํ•˜๋‹ค ์•Œ๊ฒŒ ๋œ ๋ช…๋ น์–ด - source ?

 

์ด๋ฏธ DB ์™€ NodeJS ์˜ ์—ฐ๊ฒฐ์€ ๊ตฌํ˜„์ด ๋˜์–ด์žˆ์—ˆ๋Š”๋ฐ ๋‚œ ๊ทธ๊ฑธ ๊นจ๋‹ซ์ง€ ๋ชปํ•˜๊ณ  ์—ฌ์–ผ์‹ฌํžˆ ์—ฐ๊ฒฐํ•  ๋ฐฉ๋ฒ•์„ ์ฐพ์•„๋‹ค๋…”๋‹ค.

๊ทธ๋Ÿฌ๋‹ค source ๋ผ๋Š” ๋ช…๋ น์–ด๋ฅผ ์•Œ๊ฒŒ ๋˜์—ˆ๋‹ค !

mysql์„ ์‹คํ–‰์‹œํ‚ค๊ณ  ๋‚ด๊ฐ€ ์›ํ•˜๋Š” sql ํŒŒ์ผ์„ ์‹คํ–‰์‹œํ‚จ ํ›„ ๋“œ๋””์–ด ์›ํ•˜๋Š” ๊ฒฐ๊ณผ๋ฅผ ์–ป์–ด์„œ ๋„ˆ๋ฌด ๊ธฐ๋ถ„์ด ์ข‹์•˜๋Š”๋ฐ ใ…Ž ...

ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค๊ฐ€ ์›ํ•˜๋Š” ๊ฒฐ๊ณผ๋Š” ์•„๋‹ˆ์—ˆ๋”ฐ ;;;

 

โœ”  source ๋ช…๋ น์–ด

 

mysql ์—์„œ source [ ํŒŒ์ผ ๊ฒฝ๋กœ ] ๋ช…๋ น์„ ์ž…๋ ฅํ•˜๋ฉด ์™ธ๋ถ€ sql ํŒŒ์ผ์„ ์‹คํ–‰์‹œํ‚ฌ ์ˆ˜ ์žˆ๋‹ค.

 

mysql > source [ ํŒŒ์ผ ๊ฒฝ๋กœ ]

 

mysql > source [ ํŒŒ์ผ ๊ฒฝ๋กœ ]

 

mysql ์—์„œ schema.sql ์˜ SQL๋ฌธ์„ ์‹คํ–‰ํ•จ์œผ๋กœ์จ learnmysql DB ๊ฐ€ ์ถ”๊ฐ€๋œ ๊ฑธ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค. ^____^

์ €๋ ‡๊ฒŒ ์ž˜ ์ถ”๊ฐ€๊ฐ€ ๋˜์—ˆ์œผ๋‚˜ ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค๋Š” ํŒ๋‹จํ•˜์ง€ ๋ชปํ–ˆ๋‹ค ...

 

 

๐Ÿ“  NodeJS ์™€ DB ๊ฐ€ ์—ฐ๊ฒฐ์ด ์•ˆ๋  ๋•Œ

 

mysql ์—์„œ ์›ํ•˜๋Š” ๋น„๋ฐ€๋ฒˆํ˜ธ๋ฅผ ๋„ฃ์–ด์„œ ๋‹ค์Œ ๋ช…๋ น์„ ์‹คํ–‰์‹œ์ผœ์ค€๋‹ค.

 

ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY '[๋น„๋ฐ€๋ฒˆํ˜ธ]';
FLUSH PRIVILEGES

 

mysql ์ด ์˜ค๋ž˜๋œ mysql_native_password ๋ฅผ ์‚ฌ์šฉํ•ด์„œ ์˜ค๋ฅ˜๊ฐ€ ๋‚  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์—

์ƒˆ๋กœ์šด ๋น„๋ฐ€๋ฒˆํ˜ธ๋กœ ๊ฐฑ์‹ ํ›„ ์—…๋ฐ์ดํŠธ ์‹œ์ผœ์ค€๋‹ค๊ณ  ์ƒ๊ฐํ•˜๋ฉด ๋œ๋‹ค :)

 

 

๐Ÿ“  ์ถ”๊ฐ€๋กœ ๊ณต๋ถ€ํ•  ๊ฒƒ

 

โœ”  ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ class ๋ฌธ๋ฒ• ๋‹ค์‹œ ๊ณต๋ถ€ํ•  ๊ฒƒ class / static / constructor / super

 

// class ์ž˜ ์“ฐ๊ณ ์‹ถ๋‹ค !!!!!

class SingletonBase {
  static instance;
  constructor() {
    if (!SingletonBase.instance) {
      SingletonBase.instance = this;
    } else {
      console.log('    already has instance.');
      console.log('    return existing instance.');
    }

    return SingletonBase.instance;
  }
}

module.exports = class DatabaseConnector extends SingletonBase {
  constructor() {
    super();
    this.config = {
      host: 'localhost',
      user: process.env.DATABASE_USERNAME || 'root',
      password: process.env.DATABASE_PASSWORD || '',
      database: process.env.DATABASE_NAME || 'learnmysql'
    };

    return this;
  }
}

 

๋ฐ˜์‘ํ˜•

๋Œ“๊ธ€