MySql은 오픈소스의 관계형 데이터베이스 관리시스템으로 기존의 파일 시스템보다
효율적으로 데이터를 관리할 수 있다. Node.Js와 MySql을 연동하기 위해
기본적으로 mysql이 설치 되어있어야 하고 npm을 이용하여 mysql 외장 모듈을 설치해야 한다.
$ npm install mysql
을 입력해 설치 해준다.
DB에 User 테이블을 생성한다.
CREATE TABLE User ( `user_id` VARCHAR(45) NOT NULL, `user_pw` VARCHAR(45) NULL, `user_name` VARCHAR(45) NULL, `user_nickName` VARCHAR(45) NULL, `user_email` VARCHAR(45) NULL, `user_code` VARCHAR(45) NULL, PRIMARY KEY (`user_id`)
나는 그냥 연결하는 것이 아닌 ORM 중 Sequelize 와 Mybatis 모두 사용해 연결해주도록 하겠다.
Object Relational Mapping, 객체-관계 매핑
객체와 관계형 데이터베이스의 데이터를 자동으로 매핑(연결)해주는 것을 말한다.
👉🏻 code
const path = require("path");
const Sequelize = require("sequelize");
const mybatisMapper = require("mybatis-mapper");
const envType = process.env.ENV ? process.env.ENV : "dev";
const version = process.env.VERSION ? process.env.VERSION : "base";
// DB connection 정보
const sequelize = new Sequelize('Database', 'userName', 'Password', {
host: '127.0.0.1',
dialect: 'mysql'
} );
const sqlPath = path.join(__dirname, "..", ".", `/sql/${version}/`);
mybatisMapper.createMapper([`${sqlPath}/base.xml`]);
var init = async function(req, res, next) {
req.envType = envType;
req.sequelize = sequelize;
req.mybatisMapper = mybatisMapper;
next();
};
module.exports = init;
나는 쿼리 매핑은 mybatisMapper를 이용해 xml로 구성한다.
또 따로 config.json 파일을 생성하지 않고 하나의 파일에서 연결을 마쳤다.
(후회할것 같지만 일단은 이렇게 했다...🤦♂️ 동작확인이 너무 하고싶었음...)
여기까지 됐다면 DB는 연결되었다. 이제 정상 동작하는지 코드를 작성해 확인해보자 🤷♂️
📕 base.xml
<mapper namespace="BASE">
<select id="USER.SELECT.TB_VU.001">
/* 사용자, 유저 정보 조회 */
SELECT
*
FROM user_T
WHERE user_id = #{id}
</select>
</mapper>
📕 user.js
var express = require("express");
var app = express.Router();
app.get("/users/:id", async (req, res) => {
if (!req.params || !req.params.id) {
res.status(403).send({ msg: "잘못된 파라미터입니다." });
return;
}
var selectParams = {
id: req.params.id
};
var selectQuery = req.mybatisMapper.getStatement(
"BASE",
"USER.SELECT.TB_VU.001",
selectParams,
{ language: "sql", indent: " " }
);
let data = [];
try {
data = await req.sequelize.query(selectQuery, {
type: req.sequelize.QueryTypes.SELECT
});
console.log("TCL: data", data);
} catch (error) {
res.status(403).send({ msg: "rdb select에 실패하였습니다.", error: error });
return;
}
if (data.length == 0) {
res.status(403).send({ msg: "정보가 없습니다." });
return;
}
res.json({
msg: "RDB에서 정보 꺼내오기",
user: data.map(x => {
x.vu_password = "";
return x;
})[0]
});
});
module.exports = app;
좋은 개발의 흔적이다