이번 포스팅에서는 DBMS의 한 종류인 MySQL에 대해 알아보고 WSL 환경에서 MySQL을 설치하는 작업을 해보려고 한다.
< 목차 >
- DB?? DBMS?? 그리고 MySQL??
- WSL에서 MySQL 설치하기
- MySQL 환경설정
- MySQL 외부접속 설정
< DB?? , DBMS?? 그리고 MySQL?? >
MySQL을 다루기에 앞서 DB란 무엇인지, 그리고 DBMS란 무엇인지에 대해 간략하게 짚고 넘어가보자.
DB란 Database의 약자로 위키백과에 다음과 같이 정의되어 있다.
데이터베이스(영어: database, DB)는 여러 사람이 공유하여 사용할 목적으로 체계화해 통합, 관리하는 데이터의 집합이다. 작성된 목록으로써 여러 응용 시스템들의 통합된 정보들을 저장하여 운영할 수 있는 공용 데이터들의 묶음이다.
[출처: 위키백과]
쉽게 말해 DB란 데이터들을 저장하는 저장소라고 생각하면 된다. 그렇다면 DB를 사용해서 데이터를 저장하는 이유는 무엇일까?? 이는 데이터를 하드디스크에 저장하고 싶기 때문이라고 대답할 수 있을 것이다. 컴퓨터 메모리는 휘발성이기 때문에 메모리에 데이터를 저장하게 되면 컴퓨터를 껐다 켜는 순간 데이터들이 날라가게 된다. 반면, DB에 데이터를 저장하는 것은 비휘발성인 하드디스크에 저장하는 것이기 때문에 컴퓨터를 껐다 켜는 것만으로는 데이터가 유실되지 않고 영구적 보관이 가능하다.
우리가 다루게 될 MySQL은 이러한 DB를 관리해주는 하나의 시스템이다. MySQL과 같은 시스템을 DBMS(Database Management System)라고 하는데 말 그대로 데이터베이스 관리 시스템을 일컫는다. DBMS는 DB에 저장되어 있는 데이터에 접근하고 데이터를 가공해서 사용할 수 있도록 해주는 하나의 소프트웨어라고 생각하면 된다. 그리고 데이터베이스를 생성 및 관리하며 응용 프로그램들이 데이터베이스를 공유하며 사용할 수 있는 환경을 제공한다. 이러한 방식은 응용 프로그램들이 DB를 직접 조작하는 것이 아닌 DBMS를 통해 DB를 조작하고 관리할 수 있게끔 한다.
DBMS의 종류에는 MySQL뿐만 아니라 Oracle, MariaDB, PostgreSQL, MongoDB 등등 다양한 DBMS가 존재한다. 그 중에서 우리가 다뤄볼 것은 MySQL이다.
< WSL에서 MySQL 설치하기 >
WSL 환경에서 MySQL을 설치해 줄 것이기 때문에 Windows Terminal에 들어간 후 wsl 안에서 아래의 명령어를 입력해 apt 업데이트를 먼저 진행해 주도록 하자.
sudo apt update
sudo apt upgrade
업그레이드까지 완료했다면 다음 명령어를 입력해 mysql-server를 설치해준다.
sudo apt install mysql-server
mysql --version을 입력했을 때 위와 같이 mysql의 버전이 나온다면 제대로 설치가 되었다는 것을 확인할 수 있다. 설치가 완료되었다면 다음의 명령어를 통해 mysql을 실행시켜준다.
sudo service mysql start
실행시켜준 후 아래의 명령어와 함께 초기세팅을 진행해 주도록 하자.
sudo mysql_secure_installation
- mysql 초기 비밀번호? -> enter 입력해서 없게끔 처리
- root 계정 비밀번호? -> y (YES)
- 익명사용자 삭제 -> y (YES)
- 원격 접속 권한 Disallow -> y (YES)
- test DB 삭제 여부 -> y (YES)
- reload privilege tables now? -> y (YES)
All done!! 이 뜬다면 초기세팅이 끝난 것이다.
mysql 초기 비밀번호가 없도록 세팅해 놓은 상황이므로 sudo mysql을 통해 mysql을 실행해 보자. 아래와 같이 나온다면 mysql이 제대로 실행되고 있는 것이다.
< MySQL 환경설정 >
MySQL을 사용하기에 앞서 환경설정을 해줄 것은 크게 네가지이다.
- 루트계정의 인증 플러그인 변경
- 계정 비밀번호 변경
- 새로운 사용자 계정 생성 후 권한부여
- MySQL 접속 설정
우선 sudo mysql을 이용해 루트계정으로 mysql에 접속해준다. 혹시 루트계정에 비밀번호를 설정해놓았다면 다음과 같이 비밀번호를 입력해서 mysql에 접속해줘야 한다.
sudo mysql -uroot -p[비밀번호]
루트계정으로 접속한 후 mysql 데이터베이스를 선택한다.
USE mysql;
mysql 데이터베이스에 있는 여러 테이블 중 user 테이블에 있는 내용을 수정해 줘야 하기 때문에 user 테이블의 내용을 조회해보도록 하자.
SELECT user, host, plugin, authentication_string FROM user;
user 테이블의 User 필드 영역에서 root의 plugin을 보게되면 auth_socket 인증방식을 사용하는 것을 확인할 수 있을 것이다. 이것을 mysql_native_password 방식으로 변경하고자 한다. authentication_string 필드를 보면 패스워드가 암호화되어 있는 것을 확인할 수 있는데 이러한 암호화 방식과 관련된 것이 plugin 필드의 레코드라고 보면 된다. 즉, 패스워드를 저장할 때 사용하는 암호화 방식에 대한 내용이다. plugin 필드에 있는 caching_sha2_password 혹은 우리가 사용할 mysql_native_password와 같은 것들이 암호화를 만들어주는 개념들인 것이다. 해당 형태로 암호화를 하겠다는 내용이라고 보면된다.
환경설정을 끝마쳤을 때 최종적으로 위와 같은 상태가 되도록 하자. bitkunst라는 사용자 계정을 추가하고 root계정과 bitkunst계정의 plugin이 mysql_native_password가 되면 된다. mysql_native_password 방식의 plugin을 사용하는 이유는 향후 express를 이용해 'mysql' 라이브러리를 사용할 때 'mysql' 라이브러리가 caching_sha2_password 방식의 암호화를 해석할 수 없기 때문이다. 'mysql' 라이브러리가 해석할 수 있는 암호화 방식을 사용해줘야지만 데이터베이스 서버에 접속이 가능해진다.
☞ 계정 비밀번호 변경
plugin을 변경하기에 앞서 계정 비밀번호를 변경해보도록 하자. 아래의 방법으로 변경을 시도해주면 된다.
# root계정 패스워드 변경
ALTER user 'root'@'localhost' IDENTIFIED BY '[비밀번호]';
만약 비밀번호를 변경하는 과정에서 다음과 같은 에러가 나타난다면 이는 mysql의 패스워드 보안정책 이슈 때문이다.
▶ ERROR 1819 (HY000): Your password does not satisfy the current policy requirements
쉽게 말해 패스워드를 어렵게 만들어 달라는 뜻이다. 보안정책을 확인해보도록 하자.
SHOW variables like 'validate_password%';
위와 같은 테이블이 나오게 될 것이다. 우리가 확인해야할 것은 validate_password_length 부분과 validate_password_policy 부분이다. length는 패스워드의 길이에 대한 항목이고 policy는 패스워드의 난이도에 대한 항목이다. policy에는 LOW, MEDIUM, STRONG의 세가지 경우가 존재한다. 각각은 다음과 같다.
- LOW : 패스워드 길이가 최소 validate_password_length 이상
- MEDIUM : 패스워드에 숫자, 대문자, 소문자, 특수문자 포함
- STRONG : dictionary file이라는 것을 등록해서 사용,, (어려운 방법;;)
이제 validate_password_length 부분은 4로 validate_password_policy 부분은 LOW로 바꿔주도록 하자.
set global validate_password_policy=LOW;
set global validate_password_length=4;
위의 과정을 진행하던 도중 만약 SHOW variables like 'validate_password%'; 의 결과로 empty set이 나온다면, 다음과 같은 처리를 해주도록 하자.
install plugin validate_password soname 'validate_password.so';
select plugin_name, plugin_status from information_schema.plugins where plugin_name like 'validate%';
그리고 SHOW variables like 'validate_password%'; 를 입력하면 제대로 테이블이 나오는 것을 확인할 수 있을 것이다. 이후의 과정은 위에서 진행한 것과 같이 보안정책의 내용을 확인하고 원하는 형식으로 변경해주면 된다.
이제 root계정의 비밀번호를 변경하면 잘 변경되는 것을 확인할 수 있을 것이다.
# root계정 패스워드 변경
ALTER user 'root'@'localhost' IDENTIFIED BY '[비밀번호]';
☞ 사용자 계정 추가
root계정의 비밀번호 변경을 완료했다면 다른 사용자 계정을 추가로 생성해 보도록 하자. MySQL 시스템 안에는 계정(user)에 대한 시스템이 존재한다. 계정별로 다른 데이터를 저장하고 조회할 수 있도록 한 것이다. 앞서 살펴본 root계정은 최고관리자 계정이다. 최고관리자 계정 외에 다른 사용자 계정을 추가하여 MySQL을 이용해 보고자 한다.
다음의 명령어를 입력해 사용자 계정을 추가함과 동시에 생성될 사용자 계정의 plugin 역시 지정해주도록 하자.
CREATE user '[계정이름]'@'%' IDENTIFIED WITH mysql_native_password BY '[비밀번호]';
여기서 @ 뒤에 위치하는 내용은 user 테이블의 host 필드에 대한 내용이다. "localhost" , "ip주소" 또는 "%" 를 넣을 수 있는데 각각의 의미는 다음과 같다.
- localhost : 내컴퓨터(localhost)를 통해서만 접속 가능.
- ip주소 : 작성된 아이피 주소를 통해서만 접속 가능.
- % : 모든 아이피에서 접속 가능.
다시한번 언급하지만 express를 이용해 mysql을 연결해줄때 사용자 계정의 plugin 항목을 mysql_native_password로 지정해줘야만 한다. 새로운사용자 계정을 추가했다면 이제 root계정 역시 비밀번호를 변경함과 동시에 plugin을 mysql_native_password로 변경해주면 된다.
ALTER user 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY '[비밀번호]';
지금까지의 과정들을 모두 진행했다면 마지막으로 다음 명령어를 입력하자.
FLUSH PRIVILEGES;
git의 commit과 비슷한 명령어이다. 지금까지의 모든 변경사항들을 적용시킨다는 의미의 명령어이기 때문에 잊지말고 반드시 입력해 주도록 하자.
FLUSH PRIVILEGES; 까지 완료했다면 exit을 입력해 mysql에서 나간 후 터미널에서 mysql을 재시작해서 변경사항들이 제대로 적용되었는지 확인해주면 된다.
sudo service mysql restart
☞ 사용자 계정에 권한 부여하기
우리가 추가로 생성한 사용자 계정으로 mysql에 접속한 후 데이터베이스를 생성해보려고 하면 다음과 같은 에러가 나타날 것이다.
CREATE DATABASE example;
▶ ERROR 1044 (42000): Access denied for user 'bitkunst'@'%' to database 'example'
우리는 사용자 계정을 생성하였을 뿐, 해당 계정에 권한을 부여해주지 않았기 때문에 이러한 에러가 나타나게 된 것이다. root계정으로 mysql에 다시 접속해 우리가 생성한 사용자 계정에 권한을 부여해보도록 하자. ( 권한 부여는 root계정을 통해서만 가능하다. )
root계정으로 mysql에 접속했다면 다음의 명령어를 입력해 추가로 생성된 사용자 계정에 모든 권한을 부여해주면 된다.
grant all privileges on *.* to 'bitkunst'@'%' with grant option;
이제 'bitkunst' 계정은 root계정으로부터 모든 권한을 부여받게 되었다. 추가로 생성된 사용자 계정으로 mysql에 재접속해 데이터베이스를 생성하면 에러없이 생성되는 것을 확인할 수 있을 것이다.
< MySQL 외부접속 설정 >
우리는 현재 Windows의 WSL 안에 MySQL을 설치한 상황이다. WSL 안에 있는 Node.js( 혹은 Windows에 있는 Node.js )와 MySQL은 각각 다른 프로세스 위에서 동작하고 있는 프로그램이다. 서로 다른 프로세스들 간에는 자원을 공유할 수 없기 때문에 통신이라는 것을 사용해야 한다. 즉, 통신을 해서 서로 간에 데이터를 주고받아야 한다는 의미이다. 그렇기 때문에 내 컴퓨터 안에 설치된 프로그램들 임에도 불구하고 Node.js를 통해 만들어진 서버와 MySQL은 서로 통신을 해서 데이터를 주고 받는다.
통신이라는 것을 하기 위해서는 "포트(Port)"를 열어주는 작업이 필요하게 된다. 포트를 통해 서로간의 연결통로를 만들어줘야지만 통신이 가능해지기 때문이다. Node.js에서 express를 이용해 서버를 만들었다면 express와 MySQL이 통신할 수 있게끔 해주는 라이브러리를 설치해서 사용해줘야만 한다. 이때 사용하는 것이 npm에 있는 'mysql' 라이브러리이다. 그리고 MySQL에서는 외부접속을 허용할 수 있게끔 하는 세팅 작업을 진행해줘야만 한다.
우선 우리가 설치한 MySQL에서 외부접속을 허용할 수 있게끔 하는 세팅을 진행해주도록 하자.
Windows Terminal을 통해 WSL에 들어가서 다음의 명령어를 입력해주자.
sudo apt install net-tools
WSL에서 netstat을 보기 위해 net-tools를 설치해주는 것이다. (netstat을 통해 Active Internet connections(only servers)를 볼 수 있다.) 설치가 완료되었다면 다음의 명령어를 통해 netstat을 확인해보자. 파이프라인( | )을 이용해서 grep mysqld를 작성해준 것은 각각의 프로세스(PID) 위에서 돌아가고 있는 프로그램들 중 program name이 mysqld인 것만을 보겠다는 뜻이다. ( grep mysqld <- "mysqld"라는 텍스트가 있는 것만 출력하겠다는 의미 )
sudo netstat -ntlp | grep mysqld
127.0.0.1은 localhost의 ip주소를 의미하고 0.0.0.0은 모든 ip주소를 의미한다. 위와 같이 3306번 포트를 통해 모든 ip주소에서 mysql에 접속할 수 있게끔 설정해주기 위해 다음의 과정을 진행해주면 된다. ( 0.0.0.0:3306 으로 변경해서 모든 IP주소를 허용할 수 있게 해준다. )
cd /etc/mysql/mysql.conf.d
터미널에 위의 명령어를 입력해 해당 디렉토리로 이동하도록 하자.
여기서 mysqld.cnf 파일을 수정해줘야 한다.
sudo vi mysqld.cnf
vi 에디터를 이용해 mysqld.cnf 파일을 열어서 bind-address 부분을 다음과 같이 수정해주도록 하자.
초기에는 bind-address 부분이 127.0.0.1 되어있을 것이다. 해당 부분을 주석으로 처리하고 bind-address = 0.0.0.0 을 작성해준다. 그리고 저장한 후 에디터를 종료해 터미널로 나오면 된다. ( :wq! )
이제 mysql을 재시작하고 다시 확인해보자.
sudo service mysql restart
sudo netstat -ntlp | grep mysqld
0.0.0.0:3306 으로 바뀐 것을 확인할 수 있을 것이다.
☞ Node.js에서 외부접속 확인하기
이제 MySQL이 외부접속을 허용하고 있는지 Node.js에서 확인해보도록 하자.
일단 WSL의 IP주소를 알아야하기 때문에 터미널에서 ifconfig를 입력해 IP주소를 확인해주면 된다. 확인한 IP 주소가 예를 들어 172.23.11.131 이라고 하자.
vsCode(Visual Studio Code)를 실행해 javascript 파일을 생성한 후 터미널에 npm init과 npm install mysql --save를 입력해 'mysql' 라이브러리를 설치해주고 다음의 코드를 작성해주자.
( Node.js에서 MySQL에 통신을 할 수 있는 라이브러리를 설치하는 작업을 진행해준 것이다. )
connection이라는 변수를 생성해 mysql에서 createConnection( )이라는 메소드를 실행해준다. createConnection( ) 메소드의 인자값으로는 객체가 들어가게 되는데 객체 안에는 다음의 정보들이 들어간다.
{
host: "호스트정보(IP주소)",
user: "사용자명",
password: "비밀번호",
database: "접속할 데이터베이스명"
}
host 속성값으로 들어가는 IP주소는 어떤 MySQL에 접속할 것인지를 나타낸다. 만약, host: "localhost"라면 내컴퓨터에 있는 MySQL에 접속하겠다는 의미이고 외부서버에 있는 MySQL에 접속하고자 한다면 해당 서버가 있는 IP주소를 입력해주면 된다. 현재 우리는 WSL 안에 MySQL을 설치해 놓은 상태이기 때문에 WSL IP주소인 172.23.11.131을 host의 속성값으로 입력한 것이다.
마지막으로 connection.connect( )를 실행시켜서 MySQL에 접속해주면 된다. 콜백함수 안에 console.log("db connected")를 작성해 놓았기 때문에 콘솔창에 "db connected"가 출력된다면 에러없이 MySQL에 잘 접속하고 있다는 것을 확인할 수 있다.
이로서 WSL 환경에서 MySQL을 사용할 모든 환결설정을 마쳤다.
'MySQL' 카테고리의 다른 글
Node.js - MySQL (6) 환경변수 설정하기 (.env) (2) | 2022.03.01 |
---|---|
Node.js - MySQL (5) 커넥션 풀 (Connection Pool) (0) | 2022.02.28 |
Node.js - MySQL (4) MySQL 연결하기 (개념) (0) | 2022.02.28 |
Node.js - MySQL (3) 테이블 생성하기 (0) | 2022.02.18 |
Node.js - MySQL (2) SQL 구문 정리 (0) | 2022.02.17 |