[MySQL] 로컬 MySQL DB에 도저히 연결이 안 되는데 대안이 없을까? (구름 IDE에 DB 구축하는 법)

코딩쌈밥·2022년 10월 26일
0


나는 현재 Node.js(Express) + React + MySQL 프로젝트를 진행 중인데,

로컬 MySQL DB에 연결이 되지 않는 문제가 계속 발생했다.

결국 로컬을 포기하고 다른 방법을 사용하기로 결정했다.

이 글이 나와 같은 고통을 겪고 있는 사람들에게 도움이 되길 바란다.




먼저, 나의 경우에는 아래와 같은 문제들이 발생했다.

  1. Node 서버에서 mysql2 모듈을 이용해 내 컴퓨터에 설치된 로컬 MySQL DB에 연결하려 하면 연결할 수 없다는 에러 문구 노출

  2. MySQL을 삭제했다가 재설치해도 동일(폴더 자체를 삭제 후 재설치해도 동일)

  3. MySQL 프로세스 재시작해도 동일

  4. MySQL 사용자 비밀번호를 변경하거나 권한을 변경해도 동일

  5. MySQL에 새로운 사용자를 추가해도 동일

  6. 이상하게 로컬 MySQL CMD에서는 해당 서버에 잘 연결됨




이처럼 이유를 알 수 없는 기묘한 현상들이 발생해서 온갖 사이트를 뒤져봤지만 도무지 해결책을 찾지 못했다.

그래서 결국 로컬 DB를 포기하고 가상 IDE(개발 환경)를 통해 MySQL DB를 구축하기로 했다.

(정말 매우 쉽게!! 구축할 수 있으니 절대 포기하지 말고 아래 글을 참고하시길)




내가 원하는 IDE(개발 환경)의 조건은 아래와 같았다.

1. 무료일 것(테스트용이고 적은 양의 데이터를 다루기 때문에 유료는 부담스럽다.)

2. 구축이 어렵지 않을 것(안 그래도 mysql 때문에 기분이 언짢은 상태여서 구축까지 귀찮으면 하기 싫으니까.)




이 2가지 조건을 만족하는 IDE는 구름IDE였다. (https://ide.goorm.io/)

처음 들어보는 플랫폼이었는데 다양한 곳에서 사용 중인 플랫폼이라고 해서 신뢰가 갔다.


사실 구름 IDE를 알게 되고 나서도 귀찮아서.. 한참 동안 구축을 미뤄왔다.(아무튼 MySQL 잘못임)

그런데 막상 구축을 해보니 매우매우 간단하고 다른 플랫폼들(예: AWS)에 비해 직관적이었다.




구축 순서는 아래와 같다.


1. 구름 IDE 로그인


2. 콘솔에서 컨테이너 생성

새 컨테이너 버튼을 눌러 컨테이너를 생성한다.


3. 컨테이너 이름 입력 및 소프트웨어 스택 선택

(DB만 구축할 거라면 스택은 어떤 것을 선택해도 상관 없을 것으로 보인다. 나는 Express를 선택했다.)


4. 추가 모듈/패키지에서 MySQL 설치 체크


5. 아래에 있는 생성하기 버튼 클릭


6. 생성된 컨테이너 실행

실행 버튼을 클릭해 컨테이너를 실행한다.
항상 켜두기 옵션을 사용하면 컨테이너가 계속 켜져 있도록 할 수 있다.


7. IDE 터미널에 아래 명령어 입력

구름 IDE는 우분투 OS 기반이기 때문에 리눅스 명령어를 사용해야 한다.

service mysql start


8. MySQL 접속

패스워드를 입력하지 않고 엔터 키만 쳐도 접속 가능하다.

mysql -u root -p


9. 유저에게 슈퍼 유저 권한 부여

아래 명령어를 입력해 root 사용자에게 슈퍼 유저 권한을 부여한다.

비밀번호를 따로 변경하지 않았다면 동일하게 pass일 것이다.

USE mysql;
GRANT ALL ON *.* TO root@'%' IDENTIFIED BY 'pass';
FLUSH PRIVILEGES;

위 코드에 대한 주석을 덧붙이자면 아래와 같다.

주의해야 할 것은 이 코드는 테스트용으로 작성되었다는 것이다.

root 유저의 권한을 변경하게 되면 보안 문제가 발생할 수 있다는 것을 잊지 말아야 한다.

  • 중요한 데이터를 관리하는 경우라면 새로운 유저를 만들어 필요한 만큼의 권한만 적절히 부여하는 것을 권장한다.
// mysql 데이터베이스를 사용하겠다.(유저의 권한 정보를 변경하려면 mysql 데이터베이스를 사용해야 하기 때문)
USE mysql;

// 비밀번호가 pass인 root 유저에게 모든 데이터베이스에 대한 권한을 부여한다.
// root@'%'에서 %가 의미하는 것은 host인데, %는 모든 host로부터 접근을 허용하겠다는 의미다.
// 즉, localhost뿐 아니라 외부 접근도 허용하겠다는 뜻이다.
GRANT ALL ON *.* TO root@'%' IDENTIFIED BY 'pass';

// 변경사항을 저장한다.
FLUSH PRIVILEGES;

10. mysql 관련 파일 편집

터미널에 아래 명령어를 입력해 mysqld 파일을 편집한다.

vi /etc/mysql/mysql.conf.d/mysqld.cnf

위 명령어를 입력하면 vi 모드로 전환되어 아무것도 입력되지 않을 것이다.

당황하지 않고 a 또는 i 키를 눌러 끼워넣기 모드로 전환하면 된다.

아래와 같은 부분(bind-address)을 찾아 앞에 #을 붙여 주석 처리해준다.

주석 처리해준 뒤 esc 키를 눌러 끼워넣기 모드를 종료하고 :wq를 입력해 편집을 종료한다.


11. MySQL 재시작

아래 명령어를 입력해 MySQL을 재시작한다.

service mysql restart

12. 포트포워딩을 설정한다.

상단의 [컨테이너] 메뉴의 [포트포워딩 설정] 메뉴를 클릭한다.

유형을 MySQL로 선택하고 등록한다.

IP와 외부 포트를 복사한다.

이제 서버에 DB를 연결하기만 하면 된다!


13. 본인의 서버에 DB 연결

본인 서버의 DB와 관련된 코드에 복사해둔 IP와 외부 포트를 입력하면 된다.

Node.js의 경우에는 아래와 같이 입력하면 잘 작동한다.

import mysql from "mysql2";

const pool = mysql.createPool({
  host: IP 주소,
  port: 외부 포트,
  user: user 이름,
  database: 데이터베이스 이름,
  password: user 비밀번호,
});



이렇게 아주 쉽고 간편하게 외부 MySQL DB를 구축해보았다.

구름 IDE에서 포트포워딩한 IP와 외부 포트만 있다면

로컬 MySQL Workbench에 커넥션을 추가해 DB를 원격으로 관리할 수도 있다!



단, 구름 IDE를 사용할 때 주의해야 할 점이 있다.

1. 컨테이너 실행을 중지하면 포트포워딩 IP 및 외부 포트 번호가 바뀐다.

-> 이에 따라 본인의 서버 코드에서도 DB 정보를 계속해서 변경해줘야 한다.

-> 무료 플랜이어도 하나의 컨테이너는 항상 켜두기가 가능하니 지속적으로 테스트를 할 때는 이 옵션을 켜두도록 하자.
-> 이제 무료 플랜에서는 항상 켜두기가 제공되지 않으니 유료 플랜을 구매해야 한다.(추후 무료 플랜에서 다시 기능이 제공될 수도 있음. 공지사항 참고.)


2. 무료 플랜은 무료인 만큼 제한이 있다.

-> 컨테이너 생성 개수나 공유 멤버에 제한이 있고 CPU, 메모리 성능도 좋지 않다.

-> 개인 프로젝트 테스트용이 아니라면 다른 플랜이나 다른 플랫폼을 고려하는 것이 좋아 보인다.

-> 나의 경우에는 DB만 구축해두고 간단한 테스트만 진행하기 때문에 무료 플랜으로도 만족하고 있다.




profile
코드를 쌈 싸먹자

0개의 댓글