WSL 환경의 MySQL 원격 접속 + Sequelize 연동&마이그레이션
들어가며
해당 게시물은 Sequelize 프로젝트 세팅과 WSL, mysql-server 설치완료 환경을 가정합니다.
자세한 설치 방법은 아래 두 링크를 참고해주세요.
개념
WSL과 Windows 환경의 네트워크 차이점
WSL은 가상 네트워크 인터페이스를 통해 Windows의 네트워크에 연결됩니다.
Windows와 WSL은 실제로 별도의 네트워크 공간을 공유하지 않으며, WSL은 Windows 네트워크 인터페이스를 통해 NAT(Network Address Translation) 방식으로 외부 네트워크에 접근하게 됩니다.
WSL의 IP는 내부 가상 네트워크에서 할당되며, Windows 호스트 머신과는 별도로 가상 어댑터를 통해 WSL에 IP가 부여됩니다.
Windows ipconfig와 WSL hostname -I의 IP 주소 차이
Windows의 ipconfig 명령을 통해 확인하는 IP 주소는 Windows에서 WSL에 할당한 가상 네트워크 어댑터의 IP 주소입니다.
이 IP는 Windows 호스트에서 WSL에 접근할 수 있도록 설정된 내부 네트워크 상의 주소입니다.
반면, WSL 내에서 hostname -I를 통해 확인하는 IP 주소는 WSL 인스턴스 내부에서 사용하는 가상 네트워크 인터페이스의 IP 주소로, WSL 환경 내에서 NAT 방식으로 설정된 IP입니다.
이 두 IP 주소가 다른 이유는 WSL이 실제로는 독립된 네트워크 인터페이스에서 동작하기 때문입니다. WSL의 네트워크는 Windows 네트워크와 격리되어 있으며, 이로 인해 외부에서 접근할 때는 ipconfig로 확인한 IP 주소를 사용하지만, WSL 내부에서 네트워크 관련 작업을 할 때는 hostname -I로 확인한 내부 IP를 사용하게 됩니다.
NAT(Network Address Translation)은 네트워크 주소 변환 기술로, 사설 네트워크의 IP 주소를 공인 네트워크에서 사용할 수 있는 주소로 변환하는 역할을 합니다.
주로 로컬 네트워크의 여러 장치가 공용 IP 주소를 통해 인터넷에 연결될 수 있도록 하기 위해 사용됩니다.
따라서, hostname -I로 확인되는 IP는 공인 IP가 아닌, 로컬 네트워크 내부에서만 유효한 사설 IP입니다.
hostname -I로 확인한 IP 주소 (172.18.206.56)
위치: hostname -I 명령어로 확인된 IP 주소는 WSL2 인스턴스 자체의 IP 주소입니다.
IP 주소: 172.18.206.56은 WSL2 인스턴스에 할당된 고유한 IP 주소입니다.
역할: 이 IP 주소는 WSL2가 가상 네트워크에서 사용할 IP 주소로, 다른 장치나 Windows 호스트에서 이 IP를 통해 WSL2 인스턴스에 접근할 수 있습니다.
접근 가능성: Windows 호스트에서 이 IP를 통해 WSL2 인스턴스에 접근하거나, 같은 네트워크 내의 다른 시스템에서 접근할 수 있습니다.
어댑터 IP 와 WSL 인스턴스 IP의 차이점
항목 | 어댑터 IP | WSL 인스턴스 IP |
용도 | Windows 호스트의 가상 네트워크 어댑터 IP | WSL2 인스턴스의 IP 주소 |
역할 | Windows에서 WSL로의 통신 | WSL에서 외부 네트워크와의 통신 |
접근 가능성 | WSL 인스턴스 내에서 Windows로 접근 가능 | Windows 또는 다른 네트워크 장치에서 WSL로 접근 가능 |
네트워크 연결 | Windows와 WSL 간의 내부 네트워크 통신 | 가상 네트워크에서 외부 장치와 통신 가능 |
시작하기
윈도우 IP와 어댑터 IP
$ ipconfig
CMD에서 위 명령어로 윈도우 IP와 어댑터 IP를 확인할 수 있습니다.
윈도우 IP(무선 LAN 어댑터 WI-FI 하단 IP)
이 IP 주소는 Wi-Fi 네트워크에 연결된 컴퓨터의 로컬 네트워크 주소입니다.
어댑터 IP(이더넷 어댑터 vEthernet(WSL))
이 IP 주소는 WSL(Windows Subsystem for Linux) 가상 네트워크 어댑터에 할당된 주소입니다.
WSL에서 Linux가 Windows와 네트워크를 통해 통신하기 위해 사용됩니다.
WSL에서 실행 중인 Linux 배포판이 Windows와 통신할 수 있도록 하는 가상 네트워크 주소입니다.
외부 네트워크와는 직접 연결되지 않으며, WSL 내에서만 사용됩니다.
WSL 인스턴스 IP
$ WSL
CMD에서 위 명령어를 입력해 WSL 환경(리눅스)을 실행합니다.
$ hostname -I
CMD에서 위 명령어를 입력해 WSL 인스턴스 IP를 확인합니다.
MySQL 접속
$ sudo mysql -u root -p
비밀번호 설정이 되어있지 않기 때문에 비밀번호를 입력하지 않고 엔터를 쳐도 접속이 됩니다.
MySQL 계정에 비밀번호를 추가하고 싶다면?
ALTER USER {유저 이름}@'localhost' IDENTIFIED WITH mysql_native_password BY {비밀번호};
ex) ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY '1234qwer!!';
위 명령어를 통해 비밀번호를 변경합니다.
MySQL 계정 생성
mysql> CREATE USER {계정 이름}@{접속 허용 IP} IDENTIFIED BY {계정 비밀번호};
ex ) mysql> CREATE USER 'sequelize'@'%' IDENTIFIED BY '1234qwer!!';
위 명령어를 통해 새로운 계정을 생성합니다.
해당 계정의 계정이름은 sequelize입니다. (sequelize).
해당 계정은 모든 IP에서 접속할 수 있습니다. (%)
해당 계정은 계정 비밀번호를 통해 인증합니다. (1234qwer!!)
mysql> select user,host from mysql.user;
위 명령어를 통해 계정 생성이 정상적으로 되었는지 확인합니다.
계정 권한 부여
GRANT {권한 종류} ON {권한 적용 DB}.{권한 적용 TABLE] TO 'adminuser'@'localhost';
ex1) GRANT SELECT ON my_service.products TO 'sequelize'@'%';
=> localhost접속만 허용하는 sequelize계정에게 my_service 데이터베이스의 products 테이블에 관한 SELECT 권한을 부여한다.
ex2) GRANT ALL PRIVILEGES ON *.* TO 'sequelize'@'%';
=> 모든 IP에서 접속을 허용하는 sequelize계정에게 모든 데이터베이스의 모든 테이블에 관한 모든 권한을 부여한다.
위 명령어를 통해 권한을 부여합니다.
권한의 종류 : SELECT, INSERT, UPDATE, DELETE, ALL PRIVILEGES
권한 적용 DB : 해당 이름을 갖는 데이터베이스에 대해 해당 권한의 종류들을 해당 계정에게 부여합니다.(모든 데이터베이스에 권한을 부여하려면 *(별) 입력)
권한 적용 TABLE : 해당 이름을 갖는 테이블 대해 해당 권한의 종류들을 해당 계정에게 부여합니다. (모든 테이블에 권한을 부여하려면 *(별)을 입력합니다.)
권한 부여 계정 : 해당 계정이름의 계정에게 권한을 부여합니다.
권한 부여 계정의 호스트(접속 허용 IP) : 해당 계정이 접속할 수 있는 IP를 제한합니다.( % 입력 시 모든 IP에서 접속 가능합니다.)
mysql> SHOW GRANTS FOR {계정이름}@{호스트};
mysql> SHOW GRANTS FOR 'sequelize'@'%';
위 명령어를 사용해 해당 계정의 권한 부여 상황을 확인합니다.
mysql> exit
위 명령어를 통해 MySQL을 종료합니다.
MySQL 설정 파일 수정
$ sudo nano /etc/mysql/mysql.conf.d/mysqld.cnf
$ sudo nano /etc/mysql/my.cnf
위 명령어 둘 중 하나를 사용하여 MySQL 설정 파일에 접근합니다.
키보드 방향키 또는 찾기(Ctrl + W) 를 통해 bind-address를 찾아 0.0.0.0 으로 변경합니다.
변경이 완료되었다면 저장(Ctrl + O 이후 Enter) 후 나가기(Ctrl + X) 합니다.
찾기: Ctrl + W
저장: Ctrl + O 이후 Enter
나가기: Ctrl + X
되돌리기 (Undo): Alt + U
다시 실행 (Redo): Alt + E
MySQL 서버 재실행
$ sudo service mysql restart
위 명령어를 통해 MySQL 서버를 재실행합니다.
$ service mysql status
위 명령어를 통해 현재 MySQL 서버의 상태를 확인합니다.
Active의 실행 시간을 확인해 서버 재시작 명령어가 제대로 작동 되었는지 확인합니다.
MySQL 원격 접속
$ mysql -u {계정이름} -p -h {원격접속할 IP}
ex ) $ mysql -u sequelize -p -h 172.18.206.56
CMD를 실행시켜 위 명령어를 통해 WSL에서 구동되고 있는 MySQL 서버에 원격접속합니다.
이 때 원격접속할 IP는 위에서 언급한 WSL 인스턴스 IP를 입력합니다.
정상적으로 원격 접속 된다면 Sequelize 연동을 할 차례입니다.
Sequelize 연동 및 마이그레이션
Sequelize 프로젝트 세팅을 마쳤다면 위와 같은 .env 파일이 있을 것입니다.
DB_HOST=172.18.206.56 # 접속 할 MySQL(SWL MySQL 서버)의 IP 주소
DB_USER=sequelize # 접속할 유저의 이름
DB_PASS=??? # 접속할 유저의 비밀번호
DB_NAME=zero_calories # 접속할 스키마의 이름
DB_DIALECT=mysql # 사용하는 DB 종류
해당 .env 파일을 개인에 맞게 수정합니다.
$ node app.js
위 명령어를 통해 서버를 실행합니다.
Error: SequelizeConnectionError: Unknown database 'zero_calories'
서버 실행 시 위와 같은 오류가 발생했다면 해당 DB가 존재하지 않는 것입니다.
mysql> CREATE DATABASE ${DB 이름};
mysql> CREATE DATABASE zero_calories;
위 명령어를 통해 WSL환경의 MySQL 환경에 해당 DB가 없다면 SQL문을 통해 생성합니다.
mysql> SHOW DATABASES;
위 명령어를 통해 데이터베이스가 잘 생성되었는지 확인합니다.
정상적으로 서버가 실행됐다면 위와 같이 작동됩니다.
$ npx sequelize-cli db:migrate
위 명령어를 통해 마이그레이션을 실행합니다.
mysql> use {데이터베이스 이름};
ex) mysql> use zero_calories;
위 명령어를 통해 해당 데이터베이스를 사용합니다.
mysql> SELECT * FROM {테이블 이름};
ex)mysql> SELECT * FROM products;
위 명령어를 통해 해당 테이블의 모든 데이터를 확인합니다.
데이터베이스 현황을 통해 마이그레이션이 정상적으로 실행되었는지 확인할 수 있습니다.
끝