관리 메뉴

나의 개발일지(김지헌)

초기 세팅 본문

공부

초기 세팅

코딩이좋아요 2023. 4. 3. 14:10

Node.js로 ES6 코드 실행(babel사용)

npm i -D @babel/core @babel/cli @babel/preset-env @babel/node express dotenv

@babel/core : 핵심 패키지

@babel/cli : babel 커맨드 사용 할 수 있음(선택)

@babel/preset-env : ES2015 이상의 최신 자바스크립트 문법을 해석 할 수 있음

@babel/node : 코드를 transpile후 바로 실행 해줌

.babelrc

{
  "presets": ["@babel/preset-env"],
}
package.json

{
"start": "nodemon --exec babel-node ./src/app.js"
"createdb": "nodemon --exec babel-node ./src/config/createdb.js"
}

추가 app.js 세팅 후 mysql 시퀄라이즈 연결

npm i sequelize mysql2
//./src/config/createdb.js
//데이터베이스 생성
import { Sequelize } from 'sequelize';
import dotenv from 'dotenv';
dotenv.config();
//데이터베이스 옵션
const createDBOptions = {
    username : process.env.DATABASE_USERNAME || 'root',
    password : process.env.DATABASE_PASSWORD || 'root',
    host : process.env.DATABASE_HOST || 3306,
    dialect : process.env.DATABASE_DIALECT,
}
console.log(createDBOptions)
//DB_NAME 없을시 new DateBase 생성
let db_name = process.env.DATABASE_NAME || 'devdatabase';
//시퀄라이즈 생성 메서드
const dbCreateSequelize = new Sequelize(createDBOptions);

console.log(`======Create DataBase : ${db_name}======`);
//데이터베이스 생성 메서드
dbCreateSequelize
  .getQueryInterface() //인스턴스 반환
  .createDatabase(db_name)
  .then(() => {
    console.log('✅db create success!');
  })
  .catch((e) => {
    console.log('❗️error in create db : ', e);
  });
//app.js


import model  from './models'
model.sequelize
  .sync({ force: false }) // true 로 설정 시 서버 실행 시마다 테이블 재생성
  .then(() => {
    console.log('데이터베이스 연결 성공');
  })
  .catch(err => {
    console.error('ERR~~', err);
  })
//model/index.js


'use strict';

import fs from 'fs';
import path from 'path';
import Sequelize from 'sequelize';
const basename = path.basename(__filename);
const env = process.env.NODE_ENV || 'development';
//데이터베이스 연결하기위한 설정파일
const {config} = require('../../env/database.config');

const db = {};
// const isLogging =
//   !process.env.DB_LOG || process.env.DB_LOG !== 'true' ? false : true;
let sequelize;
if (config.use_env_variable) {
  sequelize = new Sequelize(process.env[config.use_env_variable], config);
} else {
  sequelize = new Sequelize(config.database, config.username, config.password, {
    host: config.host,
    port: config.port,
    database: config.database,
    username: config.username,
    password: config.password,
    dialect: config.dialect,
    timezone: "Asia/Seoul",
    // logging: isLogging,
    //connection pool
    pool: {
      //풀의 최대 연결 수
      max: 50,
      //풀의 최소 연결 수
      min: 0,
      //오류를 발생시키기 전에 풀에서 연결을 시도하는 최대 시간(밀리초)
      acquire: 60000,
      //연결이 해제되기 전에 유휴 상태로 있을 수 있는 최대 시간(밀리초)
      idle: 30000,
    },
  });
}

fs.readdirSync(__dirname)
  .filter((file) => {
    /* 
    file = models 폴더 안 파일
    basename = index.js
    file !== basename -> index.js 파일 아닌거 찾기
    file.indexOf('.') !== 0 -> . 인덱스 찾기(젤 처음만 아니면 됨)
    file.slice(-9, -3) === .model -> .model로 시작할것
    file.slice(-3) === '.js -> .js로 끝날것
    */
    return (
      file.indexOf('.') !== 0 &&
      file !== basename &&
      file.slice(-9, -3) === '.model' &&
      file.slice(-3) === '.js'
    );
  })
  .forEach((file) => {
    // const model = sequelize['import'](path.join(__dirname, file));
    const model = require(path.join(__dirname, file))(sequelize, Sequelize);
    db[model.name] = model;
  });

Object.keys(db).forEach((modelName) => {
  if (db[modelName].associate) {
    db[modelName].associate(db);
  }
});

db.sequelize = sequelize;
db.Sequelize = Sequelize;

module.exports = db;
//env/database.config.js


import dotenv from 'dotenv'
dotenv.config()
export const config = {
    host: process.env.DATABASE_HOST,
    port: process.env.DATABASE_PORT,
    database: process.env.DATABASE_NAME,
    username: process.env.DATABASE_USERNAME,
    password: process.env.DATABASE_PASSWORD,
    dialect: process.env.DATABASE_DIALECT
}

define() : 모듈을 정의 할 때 사용

//model/user.model.js

'use strict';
module.exports = (sequelize, DataTypes) => {
    const user = sequelize.define(
        /* model name */
        'user',
        /* Properties */
        {
            user_idx :{
                type: DataTypes.INTEGER,
                primaryKey: true,
                autoIncrement: true,
            },
            admin_id: {
                type: DataTypes.STRING(40),
                notNull: true,
                /* commnent 쿼리문 조회 */
                comment: '',
            },
            password: {
                type: DataTypes.STRING(50),
                notNull: false,
                comment: '',
            },
        },
        /* options */
        {
            tableName:'user', /* 데이터베이스의 테이블 이름. */
            charset: "utf8", // 한국어 설정
            collate: "utf8_general_ci", // 한국어 설정
            freezeTableName : false,/* true 전역으로 테이블 이름이 모델과 같게됨 */
            underscored: true,/* true시 camel case를 snake case로 바꿈 createdAt => created_at */
            timestamps: false, /* true : 각각 레코드가 생성, 수정될 때의 시간이 자동으로 입력된다. */
            hooks: {
            beforeCreate: (e) => {
            e.admin_id = 123456777
            },
                /* 생성전이나 생성후 함수 실행 할 때
                    afterCreate 생성후 실행, beforeCreate 생성전 실행 
                */
            },
        }
    );

    /* asoociate */
    user.associate = (models) => {
        user.hasMany(models.post, {
            foreignKey: 'user_idx',
            sourceKey: 'user_idx',
          });
        //   user.belongsTo(models.post, {
        //      foreignKey: 'department_idx',
        //      sourceKey: 'department_idx',
        //   });

    }
        return user
}

'공부' 카테고리의 다른 글

Typedi로 api작성 해보기  (0) 2023.04.06
typedi로 의존성 관리 해보기  (0) 2023.04.06
로드밸런서  (0) 2023.03.14
우분투 기본 공부  (0) 2023.03.13
MYSQL 우분투 설치 및 명령어  (0) 2023.03.13