POST 요청 보내보기
mysql 데이터베이스에 원하는 규격의 테이블이 생성되었으며, app.js에서는 mysql2 미들웨어로 커넥션을 구성하였다. 이제 app.post() 요청에서 정상적으로 데이터가 삽입되는지 확인해야 한다.
app.js의 전체적인 코드는 다음과 같다.
const express = require('express')
const ejs = require('ejs')
const bodyParser = require('body-parser')
const mysql = require('mysql2');
require('dotenv').config();
const app = express()
const port = 3000
app.set('view engine', 'ejs');
app.set('views', './views')
// parse application/x-www-form-urlencoded
app.use(bodyParser.urlencoded({ extended: false }))
// MySQL connection
const connection = mysql.createConnection({
host: process.env.DB_HOST,
user: process.env.DB_USER,
password: process.env.DB_PW,
port: process.env.DB_PORT,
database: process.env.DB_NAME,
insecureAuth: true,
});
...
app.post('/api/contact', function (req, res) {
const name = req.body.name;
const phone = req.body.phone;
const email = req.body.email;
const memo = req.body.memo;
const SQL_Query = `INSERT INTO contact(name, phone, email, memo, create_at, modify_at) VALUES ('${name}','${phone}','${email}','${memo}',NOW(), NOW())`;
connection.query(SQL_Query, function(err, result) {
if (err) {
console.error('데이터 삽입 중 에러 발생:', err);
res.status(500).send('내부 서버 오류');
} else {
console.log('데이터가 삽입되었습니다.');
res.send("<script>alert('문의사항이 등록되었습니다.'); location.href='/'</script>");
}
});
});
JavaScript
복사
contact 페이지에서 입력한 값들이 정상적으로 전송 되고 데이터베이스에도 INSERT문이 작동되어 저장된 것을 확인 할 수 있다.
select * from contact;
JavaScript
복사
7. 커넥션 풀로 변경하기
위 mysql 연결은 현재 단일 커넥션이다. 일반적으로 커넥션 풀을 사용하는 것이 단일 커넥션을 사용하는 것보다 일반적으로 더 효율적인데 그 이유는 다음과 같다.
1.
리소스 관리: 커넥션 풀을 사용하면 여러 클라이언트 간에 커넥션을 공유하고 미리 여러 개의 커넥션을 생성하고 풀에 저장해 놓기 때문에 기존의 커넥션을 재사용할 수 있음. 생성과 닫기 과정에 발생하는 지연이 감소하고, 전반적인 성능이 향상
2.
동시성 관리: 커넥션 풀을 사용하면 여러 요청이 동시에 처리될 때 커넥션을 효과적으로 관리하여 동시성 문제를 더 쉽게 다룰 수 있음
3.
애플리케이션 안정성: 커넥션 풀은 커넥션의 오류를 감지하고 이를 처리할 수 있는 기능을 제공함. 또한 메모리 누수와 같은 문제를 방지
따라서 위 커넥션 코드를 커넥션 풀로 관리되도록 리팩토링하였다.
const express = require('express')
const ejs = require('ejs')
const bodyParser = require('body-parser')
const mysql = require('mysql2');
require('dotenv').config();
const app = express()
const port = 3000
app.set('view engine', 'ejs');
app.set('views', './views')
// parse application/x-www-form-urlencoded
app.use(bodyParser.urlencoded({ extended: false }))
// MySQL connection Pool :
// MySQL 커넥션을 사용할 때는 주로 커넥션 풀을 이용하여 관리하는 것이 권장
// 여러 요청이 동시에 처리될 때 효율적으로 커넥션을 관리
const connectionPool = mysql.createPool({
host: process.env.DB_HOST,
user: process.env.DB_USER,
password: process.env.DB_PW,
port: process.env.DB_PORT,
database: process.env.DB_NAME,
insecureAuth: true,
});
// MySQL connection check
connectionPool.getConnection((err, connection) => {
if (err) {
console.error('MySQL에 연결 중 에러 발생:', err);
} else {
console.log('MySQL에 연결되었습니다.');
// 사용이 끝난 경우 연결을 풀에 반환합니다.
connection.release();
}
});
JavaScript
복사
post요청 부분의 코드도 connectionPool을 통해서 진행되도록 수정하였다.
app.post('/api/contact', function (req, res) {
const name = req.body.name;
const phone = req.body.phone;
const email = req.body.email;
const memo = req.body.memo;
const data = `${name} ${phone} ${email} ${memo}`
// 커넥션 풀에서 커넥션을 얻어옵니다.
connectionPool.getConnection((err, connection) => {
if (err) {
console.error('MySQL 커넥션 얻는 중 에러 발생:', err);
res.status(500).send('내부 서버 오류');
} else {
const insertQuery = `
INSERT INTO contact(name, phone, email, memo, create_at, modify_at)
VALUES ('${name}', '${phone}', '${email}', '${memo}', NOW(), NOW())
`;
// 얻어온 커넥션을 사용하여 쿼리를 실행합니다.
connection.query(insertQuery, function (queryErr, result) {
// 쿼리 실행이 끝나면 반드시 커넥션을 풀에 반환합니다.
connection.release();
if (queryErr) {
console.error('데이터 삽입 중 에러 발생:', queryErr);
res.status(500).send('내부 서버 오류');
} else {
console.log('데이터가 삽입되었습니다.');
res.send("<script>alert('문의사항이 등록되었습니다.'); location.href='/'</script>");
}
});
}
});
});
JavaScript
복사