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