Mysql&DBeaver

DBeaver)서버에서 DB 사용하려면 (nodejs 환경)

연습노트 2024. 9. 8. 23:02

실제로 데이터베이스 하나만 가지고 단독으로 뭔가 하는 경우는 거의 없습니다.

데이터베이스는 대부분 웹/앱서비스, 게임같은 다양한 프로그램들의 데이터 저장소로 사용되므로 

항상 프로그래밍언어로 DB를 조작하는 경우가 많습니다. 

 

그래서 프로그래밍 언어로 DB를 어떻게 조작할 수 있는지 알아봅시다. 

가장 쉬운 자바스크립트라는 언어를 사용해볼텐데 

나는 자바스크립트나 프로그래밍 그런거 모르면 몰라도 됩니다. 

 

 

 

 

 

 

 

 

그래서 웹서비스를 운영하는데 DB 입출력 어떻게 합니까

 

님들이 웹서비스를 운영하는데 갑자기 회원가입용 데이터베이스가 필요해진겁니다. 

거기에 회원 아이디, 이름, 비번을 저장해두고 싶은겁니다. 

그럼 고객들이 직접 데이터베이스에 아이디, 비번을 INSERT문으로 집어넣을 수 있게 만들면 되겠군요?

 

 

그러면 서비스 망하는 겁니다. 고객이 이상한 데이터를 집어넣으면 어쩔 것임 

그래서 고객이 무슨 짓을 할 지 모르기 때문에 DB를 다룰 땐 보통은 3 tier architecture 를 사용합니다.

이게 뭐냐면 우선 서버프로그램, 고객용프로그램, 데이터베이스 이렇게 3개를 각각 분리해놓고

 

데이터 저장은 고객용프로그램 -> 서버 -> DB 이런 순서로

데이터 출력은 DB -> 서버 -> 고객용프로그램 이런 순서로

진행하도록 만들어놓는 것입니다.

그냥 쉽게말하면 고객이 직접 DB에 조작을 가하면 너무 위험하니까

서버라는 중간 프로그램을 하나 두는 것일 뿐입니다. 

그리고 서버에선 데이터 입출력 전에 체크하는 코드를 작성해놓으면 됩니다. 

 

 

 

 

예를 들어 유저가 내 아이디 비번을 DB에 저장하고 싶으면

1. 유저는 고객용 프로그램을 사용해서 아이디 비번을 서버로 보내고 

2. 서버는 아이디 비번이 중복은 없는지, 적절한지 검사해본 다음에 DB에 저장

이런 순서로 진행합니다. 

 

 

 

 

 

 

 

 

서버에서 MySQL DB와 통신하려면

 

위에서 설명한 서버역할을 하는 프로그램을 하나 만들어봅시다. 

nodejs 강의 들었거나 자바스크립트 아는 분들만 들으면 됩니다. 

아니면 굳이 알필요 없습니다. 

 

여러분이 무슨 언어, 무슨 프레임워크로 서버를 만들든 간에 

DB와 연결하는 법은 똑같은데 

1. MySQL DB 접속을 도와주는 라이브러리를 검색해서 설치한다 

2. 그 라이브러리에서 설명하는 방법 그대로 복사해와서 DB 연결하는 코드 작성

3. 그 라이브러리에서 설명하는 방법 그대로 DB 입출력시작

이게 끝입니다. 

 

 

 

 

 

 

 

1. nodejs를 구글에 검색해서 LTS라고 표기된 버전을 설치해줍니다. 

 

2. VSCode 에디터로 코드짤 작업폴더를 오픈합니다. (VSCode 없으면 설치하쇼)

 

3. 작업폴더에 server.js 파일을 만듭시다.

 

4. 에디터 상단에서 Terminal을 열어서 

npm init -y 입력합니다. 프로젝트마다 1회만 하면 되는 기본 셋팅임

npm install mysql2

입력해서 MySQL조작을 도와주는 라이브러리를 설치합니다. 

mysql2 말고 mysql도 있는데 일반적으론 mysql2 설치하면 됩니다. 문법이랑 기능은 거의 똑같은데 mysql2가 더 빠를 뿐 

 

 

5. mysql2 기본셋팅

mysql2는 MySQL 쉽게 연결해주는 라이브러리입니다.

 

 

const mysql = require('mysql2');

const connection = mysql.createConnection({
host : 'localhost',  
user : 'DB접속아이디',
password : 'DB접속비번',
database : '접속원하는Database명'
});

connection.connect(function(err) {
  if (err) {
    console.error('연결실패 :' + err.stack);
    return;
  }
  console.log('연결된듯');
});

server.js에 이런 코드 작성하고

터미널에서 node server.js 실행하면 연결됩니다. 

연결실패시 err변수에 들어있는 에러메세지를 잘 출력해서 원인이 뭔지 파악해봅시다.

database : '접속원하는Database명' 은 저는 지우고 했음 

 

 

 

 

const mysql = require('mysql2');

const connection = mysql.createPool({
host : 'localhost',  
user : 'DB접속아이디',
password : 'DB접속비번',
database : '접속원하는Database명'
});

참고로 DB 쿼리문을 매우 자주 실행해야되는 서버는

pool을 써서 connection을 항상 유지시키는 방법을 쓰는게 좋을 수 있습니다. 

 

 

 

 

 

connection.query('SELECT 어쩌구', function (에러, 결과, 필드) {
  if (에러){ console.log(에러) }
  console.log('result : ', 결과);
}); 

서버 -> DB 이렇게 SQL 쿼리를 날리고 싶으면 이런 문법 쓰면 됩니다.

그래서 위 코드가 실행되면 'SELECT 어쩌구' 쿼리문을 실행한 결과를 출력해줍니다. 

저장하고 터미널에 실행되던거 ctrl + c 눌러서 종료하고 node server.js 명렁어 터미널에 다시 입력해서 실행해봅시다.

 

아무튼 이렇게 서버가 DB조작할 일이 있으면 위의 코드 실행하면 됩니다. 

 

 

 

 

 

 

 

 

SQL injection 공격

 

가장 쉽고 간단한 해킹방법이 바로 SQL injection인데 

관계형 DB를 쓰는 이상 항상 이걸 염두에 두고 코드를 짜야합니다. 

 

예를 들어봅시다.

'유저가 입력한 상품명'을 DB에서 찾아주는 기능은 어떻게 만들죠? 

 

connection.query(' SELECT * FROM table1 WHERE 상품명 = "유저가입력한상품명" ', function (에러, 결과, 필드) {
  어쩌구~
}); 

이러면 끝입니다. (따옴표는 큰따옴표도 가능) 

근데 유저가 입력한 데이터를 그대로 SQL문법 안에 넣어버리면 대참사가 발생할 수 있습니다. 

유저가 상품명 자리에

"바보"; DROP TABLE table1;

이런거 이상한걸 집어넣으면 어떻게하죠? 

 

 

connection.query(' SELECT * FROM table1 WHERE 상품명 = "바보"; DROP TABLE table1; ', function (에러, 결과, 필드) {
  어쩌구~
}); 

그럼 컴퓨터가 위 코드를 실행해주고 table1이 증발하겠군요.

이러면 여러분들의 행복했던 코딩인생도 끝나는 겁니다.

해결 방법은 escape 해주는 겁니다. 

 

 

 

 

connection.query('SELECT * FROM table1 WHERE 상품명 = ' + connection.escape('유저가입력한상품명'), function (에러, 결과, 필드) {
  
}); 

유저가 입력한 모든 자료는 connection.escape() 안에 넣거나 

 

 

 

 

connection.query('SELECT * FROM users WHERE id = ?', ['유저가입력한거'], function (error, results, fields) {

}); 

유저가 입력한 모든 자료는 [ ] 안에 넣어두면 됩니다.

그리고 쿼리문에 ? 기호를 쓰면 [ ] 안에 들어있던 자료가 escape 되어서 ? 자리에 꽂힙니다. 

escape 해준다는건 이상한걸 입력해도 안전한 문자형태로 바꿔준다는 소리입니다.