MySQL 원격 연결 에러 및 해결 (feat. GCP 인바운드)
배경
운영 환경을 구축하는 과정에서 스프링 서버, MySQL 서버를 각각 VM으로 구축했다.
그리고 스프링 서버를 띄워봤는데 아래와 같이 MySQL에 연결이 안 되는 오류가 발생했다.

그리고 이를 해결하는 과정에 대해서 정리해봤다.
분석
[로컬 접속 확인]
우선 스프링 서버를 도커에 띄웠기 때문에 도커의 보안 설정 때문인지 확인하기 위해서 로컬에서 MySQL에 접속해 봤다.

하지만 로컬에서도 위와 같이 접속이 불가능했다.
따라서 도커 설정 문제가 아니라는 것을 인지했고 MySQL 설정에 관한 문제일 것이라 짐작했다.
[MySQL 설정 확인]
MySQL 설정 시 mysqld 설정 파일에서 접속 가능한 ip를 정의해 줄 수 있다.
그래서 아래 명령어로 Bind Address를 확인해 봤다.
sudo vim /etc/mysql/mysql.conf.d/mysqld.cnf

기본적으로는 127.0.0.1로 되어 있을 것이다. 그러면 localhost에서만 접속이 가능하다.
하지만 나의 경우에는 0.0.0.0으로 모든 ip에 대해 접속이 허용되어 있었다.
따라서 문제가 없었다.
[유저 host 확인]
MySQL은 유저마다 접속 가능한 host를 지정해야 한다. 만약 따로 지정하지 않았다면 기본적으로 localhost일 것이다. 즉, MySQL 로컬에서만 접속이 가능하다.
해당 설정은 아래 명령어로 확인할 수 있다.
SELECT host FROM mysql.user WHERE user = '유저 이름';

확인해 보니 localhost로 되어 있었다.
따라서 아래 명령어로 localhost → %로 모든 ip에 대해서 접속이 가능하도록 허용했다.
RENAME USER '유저 이름'@'localhost' TO '유저 이름'@'%';
FLUSH PRIVILEGES;

아무래도 보안적으로 MySQL에서 막아둔 것 같다. 별도의 유저를 생성해서 host를 %로 지정해야 한다.
그러나 여전히 로컬에서 MySQL에 접속이 안 됐다..
[네트워크 연결 확인]
MySQL에서 유저 host도 바꿔주었는데 여전히 연결이 안 되는 것을 보고 요청이 아예 도달하지 못하는건지 의심하게 되었다. 따라서 로컬에서 아래 명령어로 요청이 가는지 확인했다.
telnet [mysql 서버 ip] 3306

확인 결과 timed out이 나왔다. 즉, 요청이 아에 도달하지 못하고 있었다.
[ufw 확인]
MySQL VM에서 방화벽으로 막혀있는지 우선 확인했다.
sudo ufw status

ufw는 비활성화되어 있었다. 따라서 원인이 아니었다.
해결
[✅ VM 자체 방화벽 확인]
그래서 VM의 인바운드 규칙을 확인해 봤다.
그 결과, 인바운드 규칙이 설정이 안 되어 있었다. 기본적으로 인바운드를 막아둔 것이었다.
그래서 아래와 같이 인바운드 규칙으로 모든 IP에 대해 접속을 허용하도록 변경해 주었다.
(보안을 위해선 특정 IP 범위에 대해 허용하도록 바꾸는 것이 더 좋다)

나는 GCP로 VM을 구축했기 때문에 위와 같이 설정했다.
그리고 다시 MySQL에 접속해 봤다. 결과는 성공적이었다.

그리고 다시 서버를 띄우니 더 이상 DB 접속 에러가 발생하지 않았다.