// .env
MYSQL_PW=''
npm install mysql
을 하여 nodejs에서 사용할 수 있는 mysql moduel을 다운받는다.MVC(Model-View-Controller) design patten에 따라 개발할 것이기 때문에 server 디렉토리 안에 다음과 같은 디렉토리들을 구비해 놓는다.
config, controllers, db, models
const dotenv = require('dotenv');
dotenv.config();
{
host: 'localhost',
user: 'root',
password: process.env.MYSQL_PW,
database: 'database_name'
}
const mysql = require('mysql');
const con = mysql.createConnection({
host: 'localhost',
user: 'root',
password: process.env.MYSQL_PW,
database: 'database_name'
});
// 이것은 express의 listen과도 같다. 서버에 정상접속하면 'Connected successfully'가 출력되도록
// 접속이 안됐을 시 에러가 뜨도록 하는 코드이다.
con.connect((err) => {
if(err) throw err;
console.log('Connected successfully');
})
이때에 process.env.NODE_ENV에 따라 데이터베이스가 다르게 접속되도록 하기 위해선 config 디렉토리에 config.js를 만들어서 구현해
보도록 하겠다.
process.env는 자바스크립트 내장객체이고, 전역 변수이므로 별도의 import없이 사용가능하다.
process.env.NODE_ENV을 사용할 것인데, process.env.NODE_ENV는 무엇일까?
process.env.NODE_ENV은 두 가지 기본 값이 있는 데, 하나는 production(배포)이고, 하나는 development(개발)이다.
배포 모드일때와 개발 모드일때는 코드를 다르게 번들링하고 실행시키는 것은 좋은 기능이다. 하지만 이를 쓰진 않고 그저 확인용으로만 사용할 것이다.
const mysql = require('mysql');
const dotenv = require('dotenv');
const config = require('../config/config');
dotenv.config();
const con = mysql.createConnection(
config[process.env.NODE_ENV || 'development'];
)
con.connect((err) => {
if(err) throw err;
console.log('Connected successfully');
})
module.exports = con;
위와 같이 config를 쓰는 이유는 process.env.NODE_ENV가 'development'일때와 'production'일때를 나눠서 데이터베이스를 쓰기
위함이다. 그렇다면 다시 config를 구현해보겠다.
const dotenv = require('dotenv');
dotenv.config();
const config = {
development: {
host: 'localhost',
user: 'root',
password: process.env.DATABASE_SPRINT_PASSWORD,
database: 'cmarket'
},
test: {
host: 'localhost',
user: 'root',
password: process.env.DATABASE_SPRINT_PASSWORD,
database: 'cmarket_test'
}
}
module.exports = config;
이렇게 process.env.NODE_ENV에 따라 데이터베이스를 다르게 쓸 수 있게끔 구현했다. config, db를 구현했으니 다음은 models를 구현
해보도록 하겠다.
const db = require('../db');
module.exports = {
get: (id, callback) => {
const queryString = `SELECT * FROM person WHERE (table_name = ?)`;
const params = [Number(id)];
db.query(queryString, params, (err, result) => {
callback(err, result);
})
},
post: (name, callback) => {
const queryString = `INSERT INTO person(name) VALEUS (?)`;
const params = [name];
db.query(queryString, params, (err, result) => {
callback(err, result);
})
}
}
이제 이 함수들을 controllers/index.js가 사용하게 될 것이다.
const models = require('../models');
module.exports = {
get: (request, response) => {
const id = req.params.id;
if(!id){
return res.status(401).send('Unauthorized Id');
}else{
models.get(id, (error, result) => {
if(error){
res.status(404).send('can not find id');
}else{
res.status(200).json(result);
};
});
};
},
post: (request, response) => {
const name = request.query.name;
if(!name){
res.status(401).send('Unauthorized Name');
}else{
models.post(String(name), (error, result) => {
if(error){
res.status(404).send('can not find name');
}else{
res.status(200).send('Success INSERT INTO');
};
});
};
};
};
또한 이제 이 함수들을 app.js가 express를 곁들여서 라우팅과 함께 쓰게 될 것 이다.
const express = require('express');
const router = require('./routes');
const cors = require('cors');
const morgan = require('morgan');
const parser = require('body-parser');
const controller = require('./controllers');
const app = express();
const port = 4000;
app.use(
morgan(':method :url :status :res[content-length] - :response-time ms')
);
app.use(cors());
app.use(parser.json());
app.get('/:id', controllers.get);
app.post('/', controllers.post);
module.exports = app.listen(port, () => {
console.log(`🚀 Server is starting on ${port}`);
});
node.js로 구현한 웹서버를 mysql과 연동하는 법을 복습해봤다. 혹시 틀린 코드나 틀린 것이 있으면 피드백 부탁드리겠습니다!!