Node.js(Express)와 MySQL 연동

Jiyoung·2021년 2월 16일
1

이번 스프린트에서는 데이터베이스와 서버가 어떻게 연동되고, 클라이언트의 요청을 서버에서 어떤 논리로 처리하는지 그 과정이 잘 이해가 안되어 많은 어려움을 겪었지만 여러번 고민해보고 다양한 자료를 가지고 공부하면서 어느정도 감을 잡을 수 있었다. 스프린트 하는 동안의 이해도가 10%였다면, 완성하고나선 90%정도 이해한 것 같다. 실제 스프린트에서는 MVC패턴에 따라 코드를 작성했지만, 전체 코드를 다 가져올 수 없어서 스프린트 코드 일부와 다른 사이트의 예시 코드를 활용하여 흐름만 간단히 작성하고자 한다. 참고자료.

모듈 설치

express와 mysql 모듈을 설치한다.

$ npm install express mysql

Schema(스키마) 작성

schema.sql 파일을 작성하고 $ mysql -u root -p < server/schema.sql명령어를 실행하면, 작성된 스키마를 기반으로 데이터베이스에 테이블이 생성된다.
$ mysql -u root -p < server/schema.sql명령어는 'root 계정으로 mysql에 접속 한뒤에 schema.sql 파일에 저장되어 있는 SQL statement를 실행하는 명령'으로 이해할 수 있다.

DROP DATABASE IF EXISTS chat;
CREATE DATABASE chat;
USE chat;

CREATE TABLE users (
  `id` INT NOT NULL AUTO_INCREMENT,
  `username` VARCHAR(255),
  PRIMARY KEY(id)
);

서버(Node.js)와 데이터베이스(MySQL) 연결

createConnection 메소드의 인자로 전달되는 객체에 자신의 데이터베이스 정보를 입력한다. 여기서 비밀번호는 환경변수로 두고 터미널에서 export DATABASE_SPRINT_PASSWORD='비밀번호 입력' 명령어를 export해서 설정하였다(터미널마다 설정하는 것이므로 새 터미널을 실행할때마다 재설정이 필요함). 따라서 데이터베이스 정보에서 비밀번호를 입력할 때 password 변수를 사용하였다. 그리고 최종적으로 연결 객체를 export하면 된다.

const mysql = require("mysql");

const password = process.env.DATABASE_SPRINT_PASSWORD;

const host = "localhost";

let connection = mysql.createConnection({
    host     : 'localhost', //실제로 연결할 데이터베이스의 위치
    user     : 'root',
    password : password,
    database : 'chat' //데이터베이스 이름
  });

  connection.connect();

  module.exports = connection;

Route 작성

아래의 예시코드처럼 클라이언트 요청에 대응하는 route를 설정한다. query()에 SQL문을 작성하여 데이터베이스에 원하는 정보를 요청할 수 있다. query함수의 첫 번째 인자로 SQL문이 오고, 두 번째 인자로는 SQL문을 실행한 결과가 콜백 함수로 들어온다. 콜백 함수의 첫 번째 인자는 error, 두 번째 인자는 SQL문의 결과가 된다.

const express    = require('express');
const mysql      = require('mysql');
const db 		 = require("./db/index.js");

const app = express();

app.set('port', process.env.PORT || 3000);

app.get('/', (req, res) => {
  res.send('Root');
});

app.get('/users', (req, res) => {
  db.connection.query('SELECT * from users', (err, results) => {
    if (err) throw error;
    console.log('User info is: ', results);
    res.send(results);
  });
});

app.listen(app.get('port'), () => {
  console.log('Express server listening on port ' + app.get('port'));
});
profile
경계를 넘는 삶

0개의 댓글