본문 바로가기
리눅스 (Linux)

MariaDB와 Node JS를 사용하여 로그인, 회원가입 만들기

by 멸치김밥 2021. 12. 23.

WSL을 이용한 가상 우분투 환경에서

node js를 이용해서 로컬호스트에 웹페이지를 띄우고

웹페이지에서 회원가입을 하면 마리아DB에 저장하고 로그인할 때 DB를 이용할 수 있도록 만들어보았다.

zerocho 님의 강의내용과 코드를 가져다가 사용하였다.

 

https://github.com/ZeroCho/nodejs-book/tree/master/ch9/9.5/nodebird

 

GitHub - ZeroCho/nodejs-book

Contribute to ZeroCho/nodejs-book development by creating an account on GitHub.

github.com

사용한 zerocho 님의 코드 내용 깃허브 주소

 


  • 개발 환경
$ lsb_release -a
No LSB modules are available.
Distributor ID: Ubuntu
Description:    Ubuntu 20.04.3 LTS
Release:        20.04
Codename:       focal
$ node -v
v17.2.0
MariaDB [(none)]> select version();
+----------------------------------+
| version()                        |
+----------------------------------+
| 10.3.32-MariaDB-0ubuntu0.20.04.1 |
+----------------------------------+
1 row in set (0.001 sec)

모든 과정은 root 계정으로 진행하였다.


  • node js 세팅

위와 같이 디렉토리와 파일들을 구성해둔다.

 

$ npm i

npm 으로 package.json 에 입력되어있는 패키지들을 설치해두면 준비가 끝난다.

 

DB와 연결만 되면 안에 구현되어있는 기능들은 모두 정상적으로 작동할 것이다.


  • 마리아DB 설치하기

우분투에 mysql 기반으로 만들어졌다는 마리아db를 설치한다.

 

찾다보니 설치하는 방법은 기본틀은 같고 옵션들이 여러가지로 사람마다 차이가 있었는데

몇번을 설치하고 지우고를 반복하다가 성공한 방법으로 기재한다.

삭제할 때에도 완전히 다 지우려면 또 방법이 다르다고 한다.

여러번 설치삭제를 반복하며 삭제한 방법도 적어두었다.

 

mariaDB 완전히(?) 삭제하기

mariaDB 를 사용하다가 뭔가 잘못된것같은데 돌이키거나 해결할 방법을 모르겠을 때 삭제하고 새로 설치하는 경우가 있는데 그냥 삭제했을 때는 뭔가 남는게 있어서 새로 설치해도 기존에 남아있

slimgimbab.tistory.com

 

 

$ sudo apt update && sudo apt-get -y upgrade

apt, apt-get을 최신으로 업데이트, 업그레이드 한다

 

$ sudo apt-get install -y mariadb-server

mariadb-server 를 설치한다.

-y 는 설치중에 yes나 no를 묻는게 나올때 y를 자동으로 입력하는 것이라고 한다

mariadb-client 도 있는데 서버만 받아도 사용하는데 지장이 없어 서버만 설치했다.

 

 

설치가 완료되면 

mariaDB 서비스를 시작해준다.

이는 mongoDB 의 서버를 실행하는 mongod 같은 역할을 한다.

$ service mysql start
 * Starting MariaDB database server mysqld                           
 * Starting MariaDB database server mysqld                   [ OK ] 또는 [fail]

정상적으로 서버가 실행된다면 [ OK ] 가 뜰 것이고 문제가 있다면 [fail] 이 출력될 것이다.

만약 mysql 및 mariaDB의 기본 포트인 3306번 포트를 사용하고 있지 않다면 문제없이 진행될 것이다.

필자는 [fail] 이 출력되었었고 기존에 사용중인 mysql이 포트를 이미 사용중이기에 실패한것이다.

mariaDB의 사용할 포트번호를 3307로 변경하여 작업해보았다가 실패하여

윈도우에서 사용중이던 mysql을 종료시켜 우분투에서 3306번 포트를 사용할 수 있도록 조치하였다.

이와 관련된 해결방법을 별도로 정리해두었다.

 

mariaDB - service mysql start 명령 실패

WSL를 이용한 우분투에서 mariaDB를 사용하기 위해 설치하고 실행시켰지만 실패하였다. $ service mysql start * Starting MariaDB database server mysqld [fail] 필자의 경우 윈도우에서 mysql의 기본 포트번호..

slimgimbab.tistory.com

 

mariadb가 실행 됐으면

mariadb 를 입력한다

$ mariadb
Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MariaDB connection id is 51
Server version: 10.3.32-MariaDB-0ubuntu0.20.04.1 Ubuntu 20.04

Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

MariaDB [(none)]>

$ mysql -u root -p 을 입력하고 비밀번호를 입력해도 똑같이 진행된다. (처음엔 비밀번호 설정 안했으니 그냥 진입 됨)

$ mysql -u root -p
Enter password:
Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MariaDB connection id is 52
Server version: 10.3.32-MariaDB-0ubuntu0.20.04.1 Ubuntu 20.04

Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

MariaDB [(none)]>

처음 진입하면 MariaDB [ 이곳 ] 에 (none) 이라고 나오며

특정db를 사용하기로 하면 그 db명이 (none) 자리에 들어가게 된다.

 

먼저 데이터베이스 목록을 보자

MariaDB [(none)]> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
+--------------------+

처음 설치하고 나면 위 세개의 db가 있다.

비밀번호와 plugin을 바꾸기 위해 mysql db를 사용한다.

플러그인에 따라 암호화 방식이 다른데 경우에 따라 접속에 제한이 생기기도 한단다.

MariaDB [(none)]> use mysql
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
MariaDB [mysql]>

 

 

그리고 플러그인 상태를 보기 위해 다음을 입력한다.

MariaDB [mysql]> SELECT User, Host, plugin FROM mysql.user;
+------+-----------+-------------+
| User | Host      | plugin      |
+------+-----------+-------------+
| root | localhost | unix_socket |
+------+-----------+-------------+
1 row in set (0.000 sec)

처음 설치해서 계정은 root@localhost 하나만 나왔고

계정의 플러그인은 unix_socket 이다.

 

root 계정의 비밀번호를 지정해준다

비밀번호는 nodejs에서 config.json 에 서 사용할 비밀번호와 동일하도록 1234로 하였다.

MariaDB [mysql]> set password for 'root'@'localhost' = password('1234');
Query OK, 0 rows affected, 1 warning (0.003 sec)

 

다시 플러그인을 보면 unix_socket 에서 mysql_native_password 로 바뀐것을 확인할 수 있다.

MariaDB [mysql]> SELECT User, Host, plugin FROM mysql.user;
+------+-----------+-----------------------+
| User | Host      | plugin                |
+------+-----------+-----------------------+
| root | localhost | mysql_native_password |
+------+-----------+-----------------------+
1 row in set (0.000 sec)

 

이제 nodejs로 가서 config.json 에 설정된대로 db를 만들어달라고 하자.

$ npx sequelize db:create

Sequelize CLI [Node: 17.2.0, CLI: 6.3.0, ORM: 6.12.1]

Loaded configuration file "config/config.json".
Using environment "development".
Database nodebird created.

 

 

 

MariaDB [mysql]> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| nodebird           |
| performance_schema |
+--------------------+
4 rows in set (0.001 sec)

MariaDB나 워크벤치에서

nodebird 라는 이름의 db가 생성된 것을 확인할 수 있다

 

 

 

 

nodejs에서 npm start 를 입력한다

$ npm start

> nodebird@0.0.1 start
> nodemon app

[nodemon] 2.0.15
[nodemon] to restart at any time, enter `rs`
[nodemon] watching path(s): *.*
[nodemon] watching extensions: js,mjs,json
[nodemon] starting `node app.js`
8001 번 포트에서 대기중
Executing (default): CREATE TABLE IF NOT EXISTS `users` (`id` INTEGER NOT NULL auto_increment , `email` VARCHAR(40) UNIQUE, `nick` VARCHAR(15) NOT NULL, `password` VARCHAR(100), `provider` VARCHAR(10) NOT NULL DEFAULT 'local', `snsId` VARCHAR(30), `createdAt` DATETIME NOT NULL, `updatedAt` DATETIME NOT NULL, `deletedAt` DATETIME, PRIMARY KEY (`id`)) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE utf8_general_ci;
Executing (default): SHOW INDEX FROM `users` FROM `nodebird`
Executing (default): CREATE TABLE IF NOT EXISTS `posts` (`id` INTEGER NOT NULL auto_increment , `content` VARCHAR(140) NOT NULL, `img` VARCHAR(200), `createdAt` DATETIME NOT NULL, `updatedAt` DATETIME NOT NULL, `UserId` INTEGER, PRIMARY KEY (`id`), FOREIGN KEY (`UserId`) REFERENCES `users` (`id`) ON DELETE SET NULL ON UPDATE CASCADE) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE utf8mb4_general_ci;
Executing (default): SHOW INDEX FROM `posts` FROM `nodebird`
Executing (default): CREATE TABLE IF NOT EXISTS `hashtags` (`id` INTEGER NOT NULL auto_increment , `title` VARCHAR(15) NOT NULL UNIQUE, `createdAt` DATETIME NOT NULL, `updatedAt` DATETIME NOT NULL, PRIMARY KEY (`id`)) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE utf8mb4_general_ci;
Executing (default): SHOW INDEX FROM `hashtags` FROM `nodebird`
Executing (default): CREATE TABLE IF NOT EXISTS `Follow` (`createdAt` DATETIME NOT NULL, `updatedAt` DATETIME NOT NULL, `followingId` INTEGER , `followerId` INTEGER , PRIMARY KEY (`followingId`, `followerId`), FOREIGN KEY (`followingId`) REFERENCES `users` (`id`) ON DELETE CASCADE ON UPDATE CASCADE, FOREIGN KEY (`followerId`) REFERENCES `users` (`id`) ON DELETE CASCADE ON UPDATE CASCADE) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE utf8_general_ci;
Executing (default): SHOW INDEX FROM `Follow` FROM `nodebird`
Executing (default): CREATE TABLE IF NOT EXISTS `PostHashtag` (`createdAt` DATETIME NOT NULL, `updatedAt` DATETIME NOT NULL, `PostId` INTEGER , `HashtagId` INTEGER , PRIMARY KEY (`PostId`, `HashtagId`), FOREIGN KEY (`PostId`) REFERENCES `posts` (`id`) ON DELETE CASCADE ON UPDATE CASCADE, FOREIGN KEY (`HashtagId`) REFERENCES `hashtags` (`id`) ON DELETE CASCADE ON UPDATE CASCADE) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE utf8mb4_general_ci;
Executing (default): SHOW INDEX FROM `PostHashtag` FROM `nodebird`
데이터베이스 연결 성공

app.js 에서 설정해준 8001번 포트에 연결 되었다는 문구와 models 폴더에 만들어둔

테이블들이 nodebird DB에 생성되었다

 

생성된 테이블은 MariaDB에서 확인할 수 있다.

MariaDB [mysql]> use nodebird
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
MariaDB [nodebird]> show tables;
+--------------------+
| Tables_in_nodebird |
+--------------------+
| Follow             |
| PostHashtag        |
| hashtags           |
| posts              |
| users              |
+--------------------+
5 rows in set (0.000 sec)

 

회원가입을 하면 컬럼도 ㅈㄹ 들어가 있는것을 확인할 수 있다.

암호화된 password가 길어서 표가 어긋나보이지만 잘 되고있다.

 

로컬호스트 8001번으로 접속해보면

정상적으로 잘 출력 되었고

로그인, 회원가입 기능도 정상적으로 작동하는것을 볼 수 있다.

 

 

 

 

 

 

 


  • 하면서 발생한 이슈들..

원래 처음엔 윈도우에서 mysql이 3306포트를 사용하고 있으니 wsl에서는 대신 3307번 포트로 사용하려 했는데

nodejs와 연결할 때 3306으로만 연결하는듯 하여 어떻게 해결하지 못하고 그냥 윈도우의 mysql을 종료하여 wsl에서 3306번 포트를 사용하여 진행 하였었는데

 

지금와서 한번 여기저기 뒤적여보니

sequelize 패키지에서 해답을 찾을 수 있었다.

node_modules/sequelize/dist/lib/dialects/mysql/connetion-manager.js 파일에서 3306포트를 사용한다는 코드를 발견하였다.

마리아db의 포트번호도 3307로, 

이 코드도 3307로 바꿔 연동시켜보니 잘 되었다.

아마 sequelize 가 mysql 의 기본 포트번호를 따라가도록 유동적이게 설정된것이 아니고

3306번 포트를 고정적으로 설정되어 있는건가보다.

 

 

 

 

$ npx sequelize db:create

Sequelize CLI [Node: 17.2.0, CLI: 6.3.0, ORM: 6.12.1]

Loaded configuration file "config/config.json".
Using environment "development".

ERROR: Access denied for user 'root'@'localhost'

 

 

불러온 config.json 에서 "development" 부분을 사용했다고 한다.

정상적으로는  "database": 에 해당하는

"nodebird" 라는 db를 생성해주어야 하는데

root 계정의 접근이 거부되었다고 나온다.

찾아보니 플러그인 때문이라고 한다.

 

mariaDB를 설치하고 비밀번호를 설정할 때

찾아보니 방법이 여러가지가 있는데

버전에 따라 다른것 같긴 한데.. 

제각각 플러그인이 다르기도 하고 없기도 하다

 

 

 

 

authentication_string은 기존의 mysql의 password가 5.7버전부터 명칭이 바뀐것이라고 한다.

그리고 10.3버전은 플러그인 사용에 제한이 있다. mysql_native_password 와 mysql_old_password 두가지만 있다고 한다.

10.4버전부터는 별도의 명령어를 통해 다른 플러그인을 사용할 수 있다고 한다.

마리아db 공식 홈페이지에서 말하길

unix_socket 플러그인을 통해 인증하는 사용자의 경우 SET PASSWORD가 무시된다고 한다.

플러그인이 없거나 unix_socket 인 경우 아래처럼 authentication_string 이 비어있다.

MariaDB [mysql]> SELECT User, Host, plugin, authentication_string FROM mysql.user;
+------+-----------+-------------+-----------------------+
| User | Host      | plugin      | authentication_string |
+------+-----------+-------------+-----------------------+
| root | localhost | unix_socket |                       |
+------+-----------+-------------+-----------------------+
1 row in set (0.000 sec)

MariaDB [mysql]> SELECT User, Host, plugin, authentication_string FROM mysql.user;
+------+-----------+--------+-----------------------+
| User | Host      | plugin | authentication_string |
+------+-----------+--------+-----------------------+
| root | localhost |        |                       |
+------+-----------+--------+-----------------------+
1 row in set (0.000 sec)

이런 상태로 nodejs와 연동하려고 하면

$ npx sequelize db:create

Sequelize CLI [Node: 17.2.0, CLI: 6.3.0, ORM: 6.12.1]

Loaded configuration file "config/config.json".
Using environment "development".

ERROR: Access denied for user 'root'@'localhost'

root 계정에 접근할 수 없다고 나왔다.

아마 nodejs에서 보안이 걸린 비밀번호여야 받아주게 되어있는게 아닐까 싶다.

 

반면 set password for 'root'@'localhost' = password('1234');

이방법으로 비밀번호를 변경하였더니 플러그인은 mysql_native_password 가 되었고 

비밀번호도 복잡한 문자열이 되었다.

MariaDB [mysql]> SELECT User, Host, plugin, authentication_string FROM mysql.user;
+------+-----------+-----------------------+-------------------------------------------+
| User | Host      | plugin                | authentication_string                     |
+------+-----------+-----------------------+-------------------------------------------+
| root | localhost | mysql_native_password | *A4B6157319038724E3560894F7F932C8886EBFCF |
+------+-----------+-----------------------+-------------------------------------------+
1 row in set (0.000 sec)

이 상태로 nodejs와 연동하니 정상적으로 작동 되었다.

 

 

근데 이 과정을 하고 나면 왜인지 $ service mysql stop 이 실패한다.

$ service mysql stop
 * Stopping MariaDB database server mysqld               [fail]

그래서 wsl를 껐다가 다시 켜는 걸로 마리아db 서버를 끄게 되었다.

한번 켜면 꺼지지를 않는데 이유를 모르겟다..

 

 

다 되기까지 마리아db를 몇번을 재설치 한건지 모르겠다.

댓글