Connection pool (CP)
소프트웨어 공학에서 데이터베이스로의 추가 요청이 필요할 때 연결을 재사용할 수 있도록 관리되는 데이터베이스 연결의 캐시이다. ( ? ) 쉽게 생각하면 DB에 미리 연결된 connection을 미리 만들어 놓은 후 Pool에 보관하였다가 필요할 때 pool 에서 connection을 가져다 사용한 후 다시 server에 반환하는 것
사이트에서 client가 ----요청 ---> 백엔드 서버에서 DB서버에 접속해서 query 를 실행하게 된다. CP를 사용하면 접속 / 연결의 과정을 최소한으로 줄일 수 있어서 소요 시간, 서버 자원을 아끼고 과부하를 줄일 수 있다. 필요할 때 빌리고 다 쓰면 돌려줘서 원활하게 만든다.
어제까지 배운 DB와 연결하는 connection은 1개 엿다. (cliend -----server-----DB)
mysql=require('mysql')
let connection = mysql.createConnection({host:'localhost'.....})
connection.connect(); ) -> 요 3개의 코드를 통해서 만들었음.
근데 DB에 접근하는 connection이 1개일 경우 요청이 폭주하면 서버 과부하가 걸릴 수 있다. DB 서버에 최초 연결되는 connection 객체를 생성하는 부분이 가장 시간이 오래 걸리는 작업이라고 한다.
그래서 생각한게 Pool 이라는 연못들을 만들어서 그 연못에 connection을 여러개 나눠 분산시켜서 미리 접속을 준비시켜 둠.(connection 1개였을 땐 connection.connect();로 항상 접속된 상태였음) 그리고 client의 요청들을 대기 중인 pool 에게 connected되도록 하고 다쓰면 바로 다시 돌려받음. 그렇게 여러개의 connctions 들을 (pools) 운영해서 요청 - 전달이 과부하가 안되도록 조절하기 / 시간 줄이기가 가능해졌다.
expressjs.com/ko/guide/writing-middleware.html
---------------------------------------------------------------------------------------------------------------------------------
Visual studio 자동 저장 기능
----------------------------------------------------------------------------------------------------------------------------------
콜백 함수
function getConn(callback){}
const getConn = function(callback){}
const getConn = (callback) => {}
위의 세 코드는 동일하다고 한다. ( 잘 모르겠다 아직...................) 그냥 외워 놓자ㅏ
콜백함수의 인자값은 보통 'callback'을 쓴다고 한다.
콜백함수는 뭔가 어려운거 같아서 따로 포스팅을 해놓았는데 이해할때마다 계속 업데이트를 해야겠다.
Pool 만들어보기
* server 구동되고 Pool을 생성하는 .createPool 부분은 1 번만 ! 읽혀야함. 만약 post('/', (req,res)=?{}) dksdp mysql.createPool 코드가 들어가면 post 호출 될 때마다 connection.release(); 를 하더라도 connection 수가 계속 쌓이게 된다.
* Pool 1 / Pool 2 ..... 이렇게 여러개의 pool을 만들 필요가 없다. 들어온 요청을 묶을 필요도 없이 요청 들어온 대로 free한 pool이 바로 응답해줌 (선착순 ? 개념)
const mysql = require('mysql');
const pool = mysql.createPool({
host:'localhost',
user:'root',
password:'5353',
database:'homepage1',
connectionLimit:10
})
pool.getConnection((err,connection)=>{
if(err) throw err;
connection.query('select * from baord;', (error, results, fields)=>{
if (error) throw error;
results.render('index.html',{
list:results
})
})
})
-> 요거를 JS 에 적용
const express=require('express');
const router=express.Router();
const mysql=require('mysql');
let pool = mysql.createPool({
host:'localhost',
user:'root',
password:'5353',
database:'homepage1',
connectionLimit:10
})
router.get('/list',(req,res)=>{
pool.getConnection((err,connection)=>{
if(err) throw err;
connection.query("select *, date_format(today, '%H:%i %d.%m.%Y') as today, date_format(motoday, '%H:%i %d.%m.%Y') as motoday from board order by idx desc", (error,results)=>{
connection.release();
if (error) throw error;
let total_record = results.length;
results.forEach(ele=>{
ele.number = total_record;
total_record--;
})
res.render('board/list.html',{
board_db:results,
})
})
})
})
router.get('/write',(req,res)=>{
res.render('board/write.html')
})
router.post('/writedone',(req,res)=>{
pool.getConnection((err,connection)=>{
if(err) throw err;
let subject = req.body.subject;
let writer=req.body.writer;
let content=req.body.content;
let sql=`insert into board (subject,writer,content, today, hit) values ('${subject}','${writer}','${content}', now(),0)`
connection.query(sql,(error,results)=>{
connection.release();
if(error) throw error;
res.redirect('/board/list');
})
})
})
//localhost:3000/dklsdfklsdf/sdfkklsdf/sdjfklsdjkf
router.get('/view',(req,res)=>{
pool.getConnection((err,connection)=>{
if(err) throw err;
let idx = req.query.idx;
let number=req.query.number;
connection.query(`select * from board where idx='${idx}'`,(error,results)=>{
connection.release();
if(error) throw error;
res.render('board/view.html',{
view_db:results[0],
number:number,
});
})
connection.query(`update board set hit=hit+1 where idx='${idx}'`);
})
})
router.get('/modify',(req,res)=>{
pool.getConnection((err,connection)=>{
if(err) throw err;
let idx=req.query.idx;
let number=req.query.number;
connection.query(`select * from board where idx=${idx}`,(error,results)=>{
connection.release();
if(error) throw error;
res.render('board/modify.html',{
modify_db:results[0],
number:number,
});
})
})
})
router.post('/modifydone',(req,res)=>{
pool.getConnection((err,connection)=>{
if(err) throw err;
let idx = req.body.idx;
let number=req.body.number;
let subject = req.body.subject;
let writer = req.body.writer;
let content = req.body.content;
let sql = `update board set subject='${subject}', writer='${writer}', content='${content}', motoday=now() where idx='${idx}'`;
connection.query(sql,(error,results)=> {
connection.release();
if(error) throw error;
res.redirect(`/board/view?idx=${idx}&number=${number}`);
})
})
})
router.get('/delete',(req,res)=>{
pool.getConnection((err,connection)=>{
if(err) throw err;
let idx=req.query.idx;
let sql=`delete from board where idx='${idx}'`;
connection.query(sql,(error,results)=>{
connection.release();
if(error) throw error;
res.redirect('/board/list');
})
})
})
module.exports=router;
다시 해보다가 나온 오류
1. connection -> getConnection 수정함.
2. }) 끝을 못 닫은게 있었는데 아래와 같은 오류가 나옴
server.js 의 4 번째 줄의 13번째 column
저 r 부터 오류가 났다는 건 board를 못가져온다는 뜻 같다.
unexpected end of input 은 이제 가져올 html의 () {} 들이 잘 안 닫혀있다. 이런 뜻으로 이해하면 좋을 듯..
참고 사이트