티스토리 뷰

BackEnd/Node.js

express에 mysql연결해보기

철철22 2019. 5. 12. 22:41
반응형

안녕하십니까 

저번에 node js express + typescript + webpack 세팅을 해봤습니다. 그리고 그 이어서 mysql에 연결까지 해보려고 합니다.

 

아직 많이 미숙하니 이상하더라고 봐주세요!

기본 세팅에 대해서는 저번에 작성글을 한번 봐주세요.

2019/05/12 - [nodeJS] - nodeJS Express + Typescript + webpack 적용하기

 

일단 express에 mysql 자체를 붙이는거는 Spring boot에 mysql 붙이는 것보다 진짜 간단합니다.

 

npm install --save mysql 
npm install --save-D @types/mysql

 

커넥션과 사용법은 다음과 같습니다.

 

// Connection
export const connection = mysql.createConnection({
  host: config.db_server.host,
  user: config.db_server.user,
  password: config.db_server.password,
  database: config.db_server.database
});

// Use
  public getBoard(req: express.Request, res: express.Response): any {
     connection.query("select * from c_notice", (err, rows, fields) => {
       let notice: Array<noticeVO> = new Array<noticeVO>();
       Object.assign(notice, rows);
       res.status(200).json(notice);
     });
   }

참고로 Object.assign을 사용한 이유는 Rest Api 형태로 해서 response를 단순히 보낼 수도 있었지만 VO 형태로 해서 response를 보내고 싶었습니다. 나중에 swagger를 이용해서 문서를 만들려구요.

 

하지만 이렇게 단순히 만든다면 얼마나 간편하겠습니까.

저는 이러한 로직들을 분리하고 비동기 형식으로 처리해 보고 싶어 다음과 같이 수정했습니다.

일단 파일 구조는 다음과 같습니다.

 

Spring boot를 이용하다 보니 파일 구조도 비슷하게 짜려고 하는 모습입니다...

 

Service 단은 다음과 같이 사용했습니다.

async/await를 이용해 보고 싶었지만 잘 안되서 Promise를 이용했습니다.

java만 사용하다보니 promise에 대한 이해도가 부족해서 많이 애먹었습니다...

import { BoardVO } from "../vo/BoardVO";
import { connection } from "../configure/connection";
import l from "../configure/logger";
import { RowDataPacket, OkPacket } from "mysql";

export class BoardService {
  getBoard(): Promise<Array<BoardVO>> {
    let notice: Array<BoardVO> = new Array<BoardVO>();
    return new Promise((resolve, reject) => {
      connection.query("select * from c_notice", (err, rows, fields) => {
        if (err) {
          l.error(err);
        }
        Object.assign(notice, rows);
        resolve(notice);
      });
    });
  }
}

export default new BoardService();


그리고 controller를 다음과 같이 수정했습니다.

import express from "express";
import { connection } from "../../configure/connection";
import { BoardVO } from "../../vo/BoardVO";
import BoardService from "../../services/board.service";

export class boardController {
  router: any;
  constructor() {
    this.router = express.Router;
  }


  public getBoard(req: express.Request, res: express.Response): any {
    BoardService.getBoard().then(r => {
      if (r) {
        res.status(200).json(r);
      } else {
        res.status(400).end();
      }
    });
  }
}
export default new boardController();

다른 예제들에서는 db connection과 release 및 pool size를 세팅해주던데 저는 connection과 release를 하면 api를 호출할 때마다 오류가 생기더라고요.

 

이 부분에 대해서는 좀 더 연구를 해야할 거 같습니다.

좀 더 공부한다음 빨리 익숙하게 node js를 사용할 수 있으면 좋겠습니다.

 

이만!

 

 

참고 

 

mysql connection

https://www.npmjs.com/package/mysql

https://poiemaweb.com/nodejs-mysql

 

mysql 비동기/동기 처리 
https://holywater-jeong.github.io/blog/node-mysql-async-await/

https://mayajuni.github.io/2016/07/12/typescript-nodejs-mysql/

반응형
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함