WSL을 이용한 가상 우분투 환경에서
node js를 이용해서 로컬호스트에 웹페이지를 띄우고
웹페이지에서 회원가입을 하면 마리아DB에 저장하고 로그인할 때 DB를 이용할 수 있도록 만들어보았다.
zerocho 님의 강의내용과 코드를 가져다가 사용하였다.
https://github.com/ZeroCho/nodejs-book/tree/master/ch9/9.5/nodebird
사용한 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를 설치한다.
찾다보니 설치하는 방법은 기본틀은 같고 옵션들이 여러가지로 사람마다 차이가 있었는데
몇번을 설치하고 지우고를 반복하다가 성공한 방법으로 기재한다.
삭제할 때에도 완전히 다 지우려면 또 방법이 다르다고 한다.
여러번 설치삭제를 반복하며 삭제한 방법도 적어두었다.
$ 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가 실행 됐으면
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)
회원가입을 하면 컬럼도 ㅈㄹ 들어가 있는것을 확인할 수 있다.
로컬호스트 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를 몇번을 재설치 한건지 모르겠다.
'리눅스 (Linux)' 카테고리의 다른 글
mariaDB - service mysql start 실패 (0) | 2021.12.23 |
---|---|
mariaDB 완전히(?) 삭제하기 (0) | 2021.12.23 |
산술연산 관련 명령어들 (expr, bc, awk) (0) | 2021.12.22 |
C++ 로 구구단 만들어 G++로 변환하고 출력하기 (0) | 2021.12.22 |
Shell Script에 대한 정리 잘된 블로그 (0) | 2021.12.22 |
댓글