nodejs와 mysql연결
목차
1. 모듈 설치
2. DB와 연결하기
3. 쿼리 실행하기
데이터 베이스에 저장된 데이터들을 사용자가 다루기 위해서는 사용하는 프로그램과 데이터 베이스가 연결이 되어있어야 한다. 웹 애플리케이션을 만들기 전에 데이터 베이스와 nodejs를 연결하는 방법을 알아보도록 하자.
1. 모듈 설치
nodejs에서 내부적으로 데이터베이스와의 연결을 지원하는 모듈이 없다. 그래서 mysql2라는 외부 모듈을 설치하여 연결을 할 것이다.
npm i mysql2
mysql2라는 모듈을 설치하는데 왜 1이 아닌 2를 설치할까? 가장 큰 이유는 promise지원 때문이다. 추후 알아볼 sequelize라는 ORM에서 promise 방식을 사용하기 때문에 공식 npm에서 mysq2 사용을 권장한다.
2. DB와 연결하기
모듈을 설치했다면 DB연결을 진행하는데 필요한 것을 딱 두 가지다.
- mysql 객체
- 접속할 DB의 정보
const mysql = require('mysql2');
// 접속할 DB 정보
const DBInfo = {
host:'localhost',
port:'3306',
user:'유저명',
password:'패스워드',
database:'연결할 데이터베이스'
}
// 커넥션 객체 생성
const DBConnect = mysql.createConnection(DBInfo);
nodejs에서 DB를 연결하려면 연결 객체를 만들어야하는데 createConnection메서드에 접속정보를 인자값으로 보내줬을 때 정보가 정확하다면 객체가 생성이 된다.
3. 쿼리 실행하기
연결이 되었다면 쿼리문를 실행하여 DB에 저장되어 있는 데이터를 조회하거나 추가, 삭제 등 관리를 할 수 있다.
// 쿼리에 동적으로 적용할 데이터가 없을 때
const query = "select * from table명";
DBConnect.query(query,(err,data)=>{
console.log(data);
})
// 쿼리에 동적으로 적용할 데이터가 있을 때
const query = "select * from table명 where 컬럼1 = ? and 컬럼2 = ?";
DBConnect.query(query,[데이터1,데이터2],(err,data)=>{
console.log(data);
})
다만 늘 고정적인 쿼리를 사용하는 것이 아니기 때문에 데이터도 동적으로 쿼리에 적용할 수 있어야한다. 위와 같이 '?'를 통해 어떠한 값이 동적으로 적용될 수 있음을 명시해주고 연결객체의 query메서드를 통해 쿼리가 실행될 때 데이터를 넘겨주면 된다. ?를 통해 데이터를 동적으로 처리하는 방식을 preparedStatement라고 한다.
const query = `select * from 테이블명 where 컬럼1=${값}`
위와 같이 문자열로 쿼리를 만들 수 있지만 어떤 공격자가 쿼리 가져다 그대로 실행할 경우 데이터가 유출될 수 있지만 preparedStatement방식은 '?'로인해 쿼리가 실행될 때 에러를 발생시킨다. 따라서 보안을 위해 쿼리 문자열에 검색이나 추가에 대한 데터를 포함시키는 것은 권장하지 않는다.