DATABASE Sprint
시작부터 난관이었던 과제.
React과제를 함께한 페어분 도움으로 해결했는데 기억을 되새겨서 기록해본다 😺
dbDiagram.io로 chatterbox에 필요한 데이터간의 관계를 Table로 정의하고 Table간의 관계를 _id로 1 : * 관계로 연결한다.
database sprint의 testcase를 보면 chat데이터베이스에 tablename이 messages인 표를 만들고, 하나의 메시지 구성은 username, text, roomname으로 되어있다는 것을 알 수 있었다.
// 1 : *
Table messages as M {
id int [pk, increment] // auto-increment
text varchar(255)
user_id int
room_id int
}
Table user {
id int [pk, increment] // auto-increment
username varchar(30)
}
Table room {
id int [pk, increment] // auto-increment
roomname varchar(255)
}
// user는 여러개의 메시지를 가질 수 있다.(한 사람은 여러 메시지를 작성할 수 있다.)
Ref: "user"."id" < "messages"."user_id"
Ref: "room"."id" < "messages"."room_id"
// 한가지의 room으로 작성된 여러 메시지가 있을 수 있다.(작성된 메시지에 room이 중복될 수 있다.)
dbDiagram에서 완성된 코드는 export MySQL를 눌러서 메모장에 추출되면 스키마.sql파일에 복붙한다.
파일의 과제안내 주석에 터미널에서 mysql -u root < server/schema.sql를 실행시키라고 되어있는데
터미널에서 해당 작업 파일 디렉토리로 이동하고
mysql을 실행시킬 때처럼 < 앞은 그대로 쓰고,
< 뒤의 디렉토리 path를 현재 디렉토리에서 .sql파일이 있는 위치까지 경로를 적어준다.
sudo /usr/bin/mysql -u root -p < server/schema.sql
나는 이렇게 명령을 날리고 password를 입력했고 에러없이 수행되고나면
SHOW DATABASES;명령어를 입력해서 chatdatabase가 잘 불러와진 것을 확인할 수 있다.
.sql파일을 MySQL로 불러올 때 에러가 생기는 경우는
schema.sql에 작성한 table간의 연결이 잘못되어있거나, 파일경로지정을 잘못 한 경우인 듯 했다.
mysql> use chat
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A
Database changed
mysql> show tables;
+----------------+
| Tables_in_chat |
+----------------+
| messages |
| room |
| user |
+----------------+
3 rows in set (0.00 sec)
mysql> describe messages;
+---------+--------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+---------+--------------+------+-----+---------+----------------+
| id | int(11) | NO | PRI | NULL | auto_increment |
| text | varchar(255) | YES | | NULL | |
| user_id | int(11) | YES | MUL | NULL | |
| room_id | int(11) | YES | MUL | NULL | |
+---------+--------------+------+-----+---------+----------------+
4 rows in set (0.00 sec)
mysql> describe room;
+----------+--------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+----------+--------------+------+-----+---------+----------------+
| id | int(11) | NO | PRI | NULL | auto_increment |
| roomname | varchar(255) | YES | | NULL | |
+----------+--------------+------+-----+---------+----------------+
2 rows in set (0.00 sec)
mysql> describe user;
+----------+-------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+----------+-------------+------+-----+---------+----------------+
| id | int(11) | NO | PRI | NULL | auto_increment |
| username | varchar(30) | YES | | NULL | |
+----------+-------------+------+-----+---------+----------------+
2 rows in set (0.00 sec)
db폴더의 index.js를 보면 mysql모듈을 require해온 것을 알 수 있다.
npm mysql 공식문서
db디렉토리의 index.js에서 database와 server의 연결을 만들어야 한다.
이 연결을 통해서 다른 디렉토리의 파일들에서 db의 데이터를 get, post할 수 있게 된다.
var mysql = require('mysql');
const password = process.env.DATABASE_SPRINT_PASSWORD;
const host = "localhost";
var connection = mysql.createConnection({
// connection변수는 mysql연결할 때 사용 되는 정보를 담고 있다
host : host,
user : 'root',
password : password, //환경변수에 설정한 pw
database : 'chat' // database sprint에서 정해준 데이터베이스명
});
connection.connect();
NodeJS가 MySQL서버에 접속하려면
접속하기 위한 정보({host:...,})들을 MySQL로 전달해야 인증되기 때문에 위의 과정으로 연결을 만들어 주는 것이다.
터미널에서
export DATABASE_SPRINT_PASSWORD=따옴표없이비밀번호(MySQL과동일하게하는게좋음)입력
하고
env를 눌러서
내가 설정한 비밀번호가 잘 설정되었는지 확인해본다.
잘 찾아보면 DATABASE_SPRINT_PASSWORD=내가설정한비밀번호 로 적혀 있다.
그 다음 npm start로 node server에 연결해본다.
연결이 되면 npm test로 testcase 조건을 만족시켜가면서 과제를 진행하면 된다.
🌟 작동시킬 터미널마다 환경변수 비밀번호를 설정한 후에 서버를 켜고 테스트 실행해야 한다.
이걸 해야하는지, 왜 해야하는지 몰라서 삽질 오억번 했다...🌟
npm start시에 만약 이런 에러가 난다면
throw err; // Rethrow non-MySQL errors
다른 터미널 창에서 MySQL접속 후
mysql> ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'mysql비밀번호'; 를 해보고
App.js파일과 server-spec.js 파일에 있는 port넘버들을 전부 3000에서 4000으로 바꿔서 node터미널에서 재접속본다.
(4000이든 뭐든 상관없음)
MySQL을 \q나 exit으로 종료하고 다시 서버연결을 시도해보는 것도 좋다.
server-spec.js 파일에 beforeEach안의 함수에서 user, password, database 프로퍼티 값들이 db/index.js 파일에서 설정한 connection이 갖는 값들과 일치하는지 확인해보고 수정한 것도 도움이 되었다.
하나의 터미널에서 npm start로 노드서버를 연결해두고
다른 터미널창에서 npm test로 과제 진행상황을 테스트해볼 수 있다.