이번 포스팅에서는 Node.js에서 "mysql" 패키지를 사용했을 때 MySQL에 어떤 방식으로 접속하는지 그 원리에 대해 간략하게 알아보고자 한다.
< 목차 >
- MySQL 접속이란?
- mysql 드라이버 사용하기
1. MySQL 접속이란?
데이터베이스와 서버 간의 연결에 대해 자세히 알기 위해서는 네트워크 개념에 대해 숙지를 하고 있어야 한다. 하지만 네트워크 개념에 대해 완벽히 이해하고 있지 않더라도 데이터베이스와 서버 사이에서 어떠한 일들이 일어나는지 간략하게라도 알아보고 넘어가자.
네트워크 통신 방법에는 TCP 방식과 UDP 방식의 두가지 통신방법이 존재한다. HTTP 통신 역시 TCP 기반의 통신방법이며 웹서버가 DB 서버에게 요청하는 통신방법 역시 TCP 통신이다. TCP 통신은 간단하게 얘기해서 한번의 요청에 한번의 응답이 오는 형태의 통신 방식이라고 생각하면 된다.
웹서버(클라이언트)와 DB서버 간의 통신을 단계별로 살펴보면 다음과 같다.
step1. TCP 통신 요청
step2. TCP 통신에 대한 응답
1단계와 2단계의 작업을 통틀어서 "핸드쉐이크(HandShake)"라 한다. 여기서 핸드쉐이크란 웹서버와 DB서버가 서로 간에 연결이 잘 되었는지 테스트 해보는 과정이라고 생각하면 된다. (서로 연결되었는지 테스트)
step3. 커넥션(Connection) 생성.
핸드쉐이크가 끝난 웹서버(클라이언트)와 DB서버는 연결 상태가 된다. 서로 연결된 상태에서는 요청자와 응답자가 서로 데이터를 마음대로 주고 받을 수 있는 상태가 된다. 해당 상태에서는 서버도 클라이언트에게 요청을 할 수 있게 되는데 이러한 통신을 "소켓 통신"이라 한다.
👉 HTTP 통신 & Socket 통신
- HTTP 통신은 클라이언트에서 서버에 요청을 보내고 서버는 이에 응답하는 방식으로 통신이 이루어진다. 이로 인해 HTTP 통신은 클라이언트의 요청이 있을 때 서버가 응답하는 방식인 단방향 통신의 성격을 가진다.
- HTTP 통신은 TCP 기반이되 통신이 순차적, 개별적으로 이루어지며 요청자와 응답자가 정해져있다.
- Socket 통신이란 서버와 클라이언트 간에 양방향 연결이 이루어지는 통신으로 클라이언트와 서버 양쪽에서 서로에게 데이터를 전달할 수 있는 방식의 양방향 통신이다. (채팅 프로그램 같은 실시간 통신 가능)
핸드쉐이크 작업이 완료가 되면 커넥션(Connection) 상태가 되고 이때부터 클라이언트와 서버는 데이터를 주고 받을 수 있다. 즉, 핸드쉐이크가 최초로 1회 실행된 후 종료될 때까지 커넥션 상태가 유지된다. 핸드쉐이크가 일어나고 그 이후부터는 소켓통신이 가능해지는 것이다. 이후 연결 상태를 끊고 싶은 경우 커넥션을 종료하고 소켓 통신을 종료하는 과정을 거치게 된다. (소켓 통신은 많은 자원을 소비하기 때문에 종료를 해줘야 한다.)
step4. 커넥션 종료.
step5. 소켓 통신 종료.
HTTP 통신은 한번 요청이 가면 응답이 오기 전까지 다음 요청을 보낼 수 없다. 요청을 보냈다면 반드시 응답이 와야만 한다. Socket 통신을 하게 되면 이와 다르게 여러개의 요청을 보낼 수 있다. 그리고 서버쪽에서는 요청이 처리되는 순서대로 응답을 주게 된다. 이러한 형태는 마치 비동기 통신과 비슷하다고 할 수 있다.
Node.js에서 제공하는 "mysql" 라이브러리를 사용하면 이러한 과정을 통해 DB에 접속할 수 있다. 이렇게 커넥션을 만들어 주고 소켓 통신을 할 수 있게끔 해주는 것을 "드라이버"라 하고 "mysql 드라이버"라고 부른다.
<요약>
DB에 접속하고자 하는 웹서버는 클라이언트가 되고, DB는 서버가 된다.
최초에 Client에서 DB Server에게 HandShake를 한다. 이는 Client -> DB Server에게 요청을 보내고 DB Server -> Client에게 응답을 보내는 행위를 말한다. 이것은 HTTP 구조랑 비슷하다.
핸드쉐이크로 Connection이 맺어지게 된다.
Client 와 DB Server 간에 소켓(Socket)이라는 것이 생긴다. <- 소켓 Open
소켓이 열리면 서로 내용을 주고 받을 수 있는 상태가 된다.
소켓 통신은 많은 자원을 소비하기 때문에 종료를 해줘야 한다.
커넥션 close -> 소켓 close
2. mysql 드라이버 사용하기
이제 vsCode(Visual Studio Code)의 터미널에서 npm install mysql 을 입력해 mysql 패키지를 설치한 후 Node.js를 사용해 다음의 코드를 실행해보도록 하자.
const mysql = require('mysql')
const connection = mysql.createConnection({ // 이때 핸드쉐이크가 일어나서 커넥션을 맺어준다.
host: 'localhost',
user: 'DB계정명',
password: '비밀번호',
database: '데이터베이스명'
})
connection.connect((err)=>{ // 소켓 open
if (err) throw err;
console.log('socket open') // 연결이 되면 실행되게끔 하기 위해서 콜백형태로 구현이 됨.
});
connection.query("SELECT * FROM tester", (err, result)=>{
if (err) throw err;
console.log(result)
})
connection.end() // 커넥션 끊기
만약 connection.end( )를 작성하지 않는다면 계속해서 DB Server와 연결된 상태를 유지하고 있게 된다. 이를 확인해보기 위해서는 터미널에서 mysql에 접속한 다음 아래의 구문을 입력해보도록 하자. 다음과 같이 맺어진 커넥션의 개수를 확인해 볼 수 있다.
--SQL 구문--
SHOW STATUS LIKE 'Threads_connected';
'MySQL' 카테고리의 다른 글
Node.js - MySQL (6) 환경변수 설정하기 (.env) (2) | 2022.03.01 |
---|---|
Node.js - MySQL (5) 커넥션 풀 (Connection Pool) (0) | 2022.02.28 |
Node.js - MySQL (3) 테이블 생성하기 (0) | 2022.02.18 |
Node.js - MySQL (2) SQL 구문 정리 (0) | 2022.02.17 |
Node.js - MySQL (1) 환경설정 (0) | 2022.02.17 |