Nodejs/DB

Database - MySQL #2

Sila 2022. 2. 19. 21:43

1. intro

이번에는 MySQL 접속을 배워보자.

 

클라이언트가 서버에 요청을 전달하고 서버가 반응을 주는 것처럼 

 

데이터를 DB에서 가져오기 위해서는

 

서버가 데이터베이스에 요청을, DB가 응답을 줘야한다.

 

통신 방식에는 TCP와 UDP 2가지 방식이 있는데, 우선 TCP에 대해서만 알아볼 것이다.

 

(서버와 클라이언트의 통신방식인 http도 TCP기반이다.)

 

 

우선 최초로 서버와 DB가 연결될 때, TCP 요청과 TCP 응답이 순차적으로 일어난다.

 

이 2가지 작업을 묶어서 handshake 작업이라고 하는데, 이걸 진행한 후

 

데이터를 양방향으로 주고 받을 수 있게 된다.

 

(handshake가 최초로 1번 실행된 후, 종료될 때까지 connection 상태가 유지된다.)

 

이런 양방향의 데이터 전송을 소켓 통신 (Socket)이라고 하는데, 실시간 채팅같은 프로그램에 활용되곤 한다.

 

이제 handshake와 connect에 대한 코드를 어떻게 작성하는지 배워보도록 하자.

 

 

2. HandShake/Connection

 

이런 통신에 대한 코드를 직접 짜기 보다는 역시 라이브러리를 가져와 사용하는데,

 

그게 mysql이라는 node.js기반 라이브러리이다.

npm install mysql

 

를 입력해 우선 라이브러리를 설치하자.

 

2.1 Handshake

/*  server_DB.js  */

const mysql = require('mysql')

let connection = mysql.createConnection({
    host:'localhost', // or 본인 IP 주소
    user: 'sila',
    password:'11111111',
    database:'members'
})

user와 password, database는 전부 우리가 윈도우 터미널에서 mysql을 처음 구동할 때 설정한 것이고,

 

database도 우리가 우리가 저번에 만든 members를 사용한 것이다.

 

여기까지 쓰면 우리가 접속할 곳에 대한 정보를 담는 것까지 완료 된 것이다.

 

이제 connection상태를 만들어주는 코드를 작성해보자.

 

2.2 Connection

/*  server_DB.js  */

connection.connect((err) => {
    if(err) throw err;
    console.log('socket open')
})

이 코드는 express 라이브러리를 사용하진 않았지만 express의 listen 메소드처럼 

 

계속해서 실행되는 상태에 놓여있는 코드이다.

 

에러가 없다면 'socket open'을 출력해줄 것이다.

 

connection을 끝내려면

connection.end()

를 추가해주면 된다.

 

DB와 잘 연결이 되었는지 확인해보려면 터미널에서 MySQL을 실행한 후,

SHOW STATUS LIKE 'Threads_connected';

이렇게 입력하면 현재 연결된 connection의 수를 보여준다. 

 

코드가 실행되고 있을 때와 그렇지 않을 때 각각 connection의 수가 달라지는 것을 확인할 수 있다.

 

 

커넥션의 수에는 한계가 있고, 이 커넥션 자체로도 리소스를 많이 먹기 때문에

 

데이터를 주고 받고 연결을 종료하고를 반복하는 것은 비효율적이다.

 

그래서 보통은 이렇게 작성 안 한다.

 

여기서 등장하는게 Connection Pool이다.

 

3. Connection Pool

쉽게 말하면 Connection Pool은 서버와 DB 사이에 커넥션 풀이라는 완충지대가 있다고 생각을 하면 된다.

 

pool에는 이용가능한 커넥션이 여러개 있어서 요청이 오면 풀에 있는 커넥션을 주고,

 

연결이 끝나면 다시 커넥션을 돌려받아 풀에 저장한다.

 

이 커넥션 풀의 의의는 기존의 커넥션을 다시 재사용 할 수 있게 만들어 리소스 소모를 크게 줄여주는 것에 있다.

 

이는 곧 전체적인 성능의 향상을 의미하며, 그래서 DB를 필요로 하는 프로그램에 많이 사용된다.

 

새로운 js 파일을 하나 생성해 다음과 같이 코드를 작성해준다.

 

/*  pool.js  */

const mysql = require('mysql')

const pool = mysql.createPool({
    host:'localhost',
    user:'sila',
    password:'11111111',
    database:'members'
})

pool.getConnection((error, connection) => {
    connection.query('select * from members', (error, result) => {
        if (!error) {
            connection.release()
        }
        else {
            throw error
        }
    })
})

 

createConnection을 createPool로 바꿔 접속할 정보를 가져오고,

 

선언한 변수에 getConnection 메소드를 건다.

 

그 후, connection이 MySQL에 입력해줄 명령어를 매개변수 형태로 준 후, 에러가 없다면

 

원하는 데이터를 가져올 수 있다.

 

 

 

 

 

'Nodejs > DB' 카테고리의 다른 글

Database - MySQL #1  (0) 2022.02.18