2. Node 가계부 만들기 [ .env 파일 사용, Mysql Sequlize 연결, Mysql 동기화 ]

2022. 5. 23. 11:21프로젝트/가계부 - 제작 JavaScript

1. package.json 실행 스크립트 생성

script에 실행 스크립트를 작성

"scripts": {
    "start": "node ./app.js"
  }

2. app.js (dotenv) 사용, .env 파일 생성

.env 설정 : https://crispypotato.tistory.com/86

 

Node, Express에서 dotenv사용해서 env파일 사용하기

먼저 dotenv를 다운받는다. npm i dotenv 1. 환경변수를 설정 확인 할 수 있게 환경변수를 확인 할 수 있게 www 파일에 환경 변수 확인 값 설정한다. 2. .env 파일 / .env.fail 파일을 만든다 성공시 .env파일

crispypotato.tistory.com

 

2-1. .env 파일 생성

.env 파일 내용

//cors 설정 url
CORS=http://localhost:8080

//노드 환경변수
NODE_ENV=local

DB_NAME=DB 계정 이름
DB_PASSWORD= DB 비밀 번호
DB=DB 이름

//jwt 키 값
JWT=sfnlfgjsdfhgh348hturhkjdsnfg@&^&(%&fdjhlshfdkjghkjdfhkjgshrtgh)

 

3. Sequlize 세팅

3-1. models 폴더 생성, js 파일 생성

구조

3-2. Sequlize 코드 작성 

 

1. models/index.js 코드 작성 ( Mysql => Sequlize 연결 )

const { Sequelize } = require('sequelize')

//.env 설정 값
const name = process.env.DB_NAME
const password = process.env.DB_PASSWORD
const DB = process.env.DB

const config = {
  username: name,
  password,
  database: DB,
  host: 'localhost',
  dialect: 'mysql'
}

//sequlize 연결
const sequelize = new Sequelize(
  config.database,
  config.username,
  config.password,
  {
    username: name,
    password,
    database: DB,
    host: config.host,
    dialect: config.dialect,
    // timezone 는 Mysql 시간을 한국 타임존으로 변경이 가능하다
    timezone: '+09:00'
  }
)

//sequlize 데이터 타입
const DataTypes = Sequelize.DataTypes

module.exports = { sequelize, DataTypes }

 

2. models/user.js 생성

const { sequelize, DataTypes } = require('./index')
// 가계부 외래키 설정
const Accounts = require('./accountlist')

const Users = sequelize.define(
  'user',
  {
    index: {
      type: DataTypes.INTEGER,
      allowNull: false,
      autoIncrement: true,
      primaryKey: true
    },
    id: {
      type: DataTypes.STRING,
      unique: true,
      allowNull: false
    },
    password: {
      type: DataTypes.STRING,
      allowNull: false
    },
    salt: {
      type: DataTypes.STRING,
      allowNull: false
    }
  },
  {
    sequelize,
    timestamps: true,
    freezeTableName: true,
    tableName: 'users'
  }
)

// 가계부 외래키 설정
Users.hasOne(Accounts, {
  sourceKey: 'index',
  foreignKey: 'userIndex',
  onDelete: 'CASCADE'
})

module.exports = Users

 

3. models/accountList.js 생성

const { sequelize, DataTypes } = require('./index')

const Accounts = sequelize.define(
  'account',
  {
    index: {
      type: DataTypes.INTEGER,
      allowNull: false,
      autoIncrement: true,
      primaryKey: true
    },
    userIndex: {
      type: DataTypes.INTEGER,
      allowNull: false
    },
    bigCategory: {
      type: DataTypes.STRING,
      allowNull: false
    },
    smallCategory: {
      type: DataTypes.STRING
    },
    card: {
      type: DataTypes.STRING,
      allowNull: false
    },
    cost: {
      type: DataTypes.INTEGER,
      allowNull: false
    },
    date: {
      type: DataTypes.STRING,
      allowNull: false
    }
  },
  {
    sequelize,
    timestamps: true,
    freezeTableName: true,
    tableName: 'accounts'
  }
)

module.exports = Accounts

 

4. app.js ( Sequlize 동기화 코드 ) 작성

1. app.js 일부 ( Sequlize 동기화 코드 ) node 환경 변수가 'local' 일 때 동기화를 진행

//....
const { sequelize } = require('./models/index')

//node 환경 변수가 'local일 때 동기화를 진행
//product 서버에서 갑자기 디비 구조가 변경되면 에러 대응하기 힘들기 때문
if (process.env.NODE_ENV === 'local') {
  sequelize
    .sync()
    .then(() => {
      console.log('성공')
    })
    .catch((err) => {
      console.log('실패')
      console.log(err)
    })
}

//....

 

2. 전체 app.js 파일

require('dotenv').config()
const express = require('express')
const logger = require('morgan')
const compression = require('compression')

const { sequelize } = require('./models/index')

if (process.env.NODE_ENV === 'local') {
  sequelize
    .sync()
    .then(() => {
      console.log('성공')
    })
    .catch((err) => {
      console.log('실패')
      console.log(err)
    })
}

const app = express()

app.use(compression())
app.use(logger('dev'))
app.use(express.json())

app.listen(3000, () => {
  console.log('server start!')
})

 

728x90
반응형