본문 바로가기

블록체인 기반 핀테크 및 응용 SW개발자 양성과정 일기

[33일차 복습 및 정리] node.js connection pool 이란? 노드 제이에스 커넥션 사용법

반응형

 

 Connection pool (CP) 

소프트웨어 공학에서 데이터베이스로의 추가 요청이 필요할 때 연결을 재사용할 수 있도록 관리되는 데이터베이스 연결의 캐시이다. ( ? ) 쉽게 생각하면 DB에 미리 연결된 connection을 미리 만들어 놓은 후 Pool에 보관하였다가 필요할 때 pool 에서 connection을 가져다 사용한 후 다시 server에 반환하는 것

 

사이트에서 client가 ----요청 ---> 백엔드 서버에서 DB서버에 접속해서 query 를 실행하게 된다. CP를 사용하면 접속 / 연결의 과정을 최소한으로 줄일 수 있어서 소요 시간, 서버 자원을 아끼고 과부하를 줄일 수 있다. 필요할 때 빌리고 다 쓰면 돌려줘서 원활하게 만든다. 

 

 

connection 한개일 떄 

 

어제까지 배운 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

 

Express 앱에서 사용하기 위한 미들웨어 작성

Express 앱에서 사용하기 위한 미들웨어 작성 개요 미들웨어 함수는 요청 오브젝트(req), 응답 오브젝트 (res), 그리고 애플리케이션의 요청-응답 주기 중 그 다음의 미들웨어 함수 대한 액세스 권한

expressjs.com

 

 

---------------------------------------------------------------------------------------------------------------------------------

 

Visual studio 자동 저장 기능

이 클릭 한번을 몰라서 그동안 고생이엇다 ㄴ ㅣ.....열불

 

 

----------------------------------------------------------------------------------------------------------------------------------

 

 

 

콜백 함수

function getConn(callback){}

const getConn = function(callback){}

const getConn = (callback) => {}

 

위의 세 코드는 동일하다고 한다. ( 잘 모르겠다 아직...................) 그냥 외워 놓자ㅏ 

콜백함수의 인자값은 보통 'callback'을 쓴다고 한다. 

콜백함수는 뭔가 어려운거 같아서 따로 포스팅을 해놓았는데 이해할때마다 계속 업데이트를 해야겠다.

 

 

 

blckchainetc.tistory.com/72

 

Callback 함수, 콜백 함수란 ? 사용 이유

특징 : non-block , 비동기 (asynchronous) 방식이다. -> 어떤 일을 다른 객체에게 시키고 그 일이 끝나기를 기다리지 않고 그 객체가 다시 나를 부를 때까지 내 할일을 하고 있을 수 있음. Docu

blckchainetc.tistory.com

 

 

 

 

 

 

 

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의 () {} 들이 잘 안 닫혀있다. 이런 뜻으로 이해하면 좋을 듯.. 

 

 

 

 

 

 

 

 

참고 사이트

 

leejungyeoul.tistory.com/83

 

node server/npm mysql/connection pool 구현

connection pool(CP)의 정의는 '소프트웨어 공학에서 데이터베이스로의 추가 요청이 필요할 때 연결을 재사용할 수 있도록 관리되는 데이터베이스 연결의 캐시'이다.  사이트에 사용자가 접속하면

leejungyeoul.tistory.com

 

 

 

 

 

 

 

 

 

 

반응형