NodeJS에서 MySQL비동기로 사용하기

임재현·2021년 5월 2일
0

TIP

목록 보기
2/12

mysql2
시퀄라이즈 등의 orm을 사용하지 않고 바로 mysql과 nodejs를 연결시켜 사용해보고자 했다. 그런데, 비동기적인 부분이 불편한 점이 있었다. 그래서 정리해보고자 한다.
우선 mysql2모듈을 사용해야 한다.
그냥 mysql모듈은 promise지원을 안한다. 따라서 콜백으로 처리해주어야 한다.

  • 디렉토리구조
.
├── controller
│   └── user
│       ├── index.js
│       └── postUser.js
├── db
│   └── index.js
├── index.js
├── package-lock.json
├── package.json
└── router
    └── userRouter.js
  • db/index.js
require("dotenv").config();
const mysql = require("mysql2/promise");	//중요!!! mysql2뒤에'/promise'붙이는 것도 중요!

const host = process.env.DB_HOST;
const user = process.env.DB_USER;
const password = process.env.DB_PASSWORD;
const database = process.env.DB_DATABASE;

const connection = mysql.createConnection({
  host,
  user,
  password,
  database,
});

module.exports = connection;
  • controller/user/postuser.js
const connection = require("../../db");

const postUser = {
  signUp: async (req, res) => {
    console.log("user Signup!");

   
    let result = await (await connection).execute("SELECT * FROM Users");
    console.log("result : ", result[0]);
  },
};

module.exports = postUser;

좀 의아한 부분이 있을 수 있다.

let result = await (await connection).execute("SELECT * FROM Users");

이부분이 의아 할 수도 있는데 (await connection)이렇게 해준 이유는 connection도 동기로 이루어져야 하는데 db.js에서 export할 때 그냥 바로 연결객체를 export하고 있어서 여기서 await connection해주고 그 앞에 또 await이 붙은 것은 연결이 된 객체에서 데이터를 불러올 때 또 동기로 처리해야하기 때문이다.

MVC구조라고 하기도 좀 이상하고(MC구조라고 해야할듯하다) 어쨌든 현재 비즈니스로직이랑 모델로직이랑 구별이 잘 안되있는 모습인데 연구를 더 해서 점점 보충해나가야겠다.

++추가로 모델을 추가해줬다.

.
├── controller
│   └── user
│       ├── index.js
│       └── postUser.js
├── db
│   └── index.js
├── index.js
├── model
│   └── userModel.js
├── package-lock.json
├── package.json
└── router
    └── userRouter.js

모델 디렉토리와 그 밑에 userModel.js가 추가되었다.

  • userModel.js
const connection = require("../db");
module.exports = {
  getAllUser: async () => {
    let result = await (await connection).execute("SELECT * FROM Users");
    return result[0];
  },
};

이렇게 해서 좀더 MVC모델스럽게 바꼈다. 하지만 아직 await (await connection).execute("SELECT * FROM Users");이 부분을 어떻게 해야할지는 떠오르지 않는다. 전부다 정리되면 다시한번 정리해서 글을 써야겠다.

profile
임재현입니다.

0개의 댓글