본문 바로가기
에러 해결

[mysql] Connetion RefusedError(Sequelize 설정)

by Devry 2023. 11. 24.

상황

MySQL, Node.js, Sequelize 기반 프로젝트를 6개월 만에 리팩토링을 하는데 시작부터 DB에서 오류가 생겼다

Express 서버에서 Sequelize를 통해 DB를 읽어와야 하는데 거부되었다는 오류 메시지가 뜸

원인 분석 및 시도

서버나 sequelize문이 아닌 mysql의 권한 문제로 생각하였다

생각해 보니 초기 설정할 때 mysql에서 권한 설정하는 명령어를 쳤던 것 같다

GRANT ALL PRIVILEGES ON "프로젝트명" TO 'root'@'localhost';
FLUSH privileges; // 권한 적용

해당 프로젝트에 대한 root 사용자의 모든 권한을 주는 명령어이다

하지만 여전히 작동하지 않았다

🔑해결

이틀 동안 헤매다가 에러 메시지에 주목하였다

인터넷에 다른 사람의 에러메시지엔 127로 시작하는 IP주소가 있던데 왜 나는 ::1:3306이지?

3306은 일단 MySQL에서 사용하는 기본 포트이고 앞부분은 내가 설정한 경로일 텐데

.env파일에서 DB_HOST = localhost라고 설정했는데 혹시나 해서 127.0.0.1로 바꾼 뒤 실행

성공!

127.0.0.1 과 localhost의 차이

비유적으로 localhost:3000는 www.naver.com이고
127.0.0.1은 125.209.222.141(네이버 ip주소)

 

차이는 어느정도 알게 되었지만 여전히 에러가 생기는 이유는 알 수 없다

 

ChatGPT에게 물어보자

요약하자면 에러에 등장했던 ::1 은 IPv6에서 로컬호스트를 뜻한다. 127.0.0.1은 IPv4 로컬호스트 주소를 나타낸다고 한다.

그럼 localhost를 사용하면 IPv6를 따르기 때문에 IPv4를 기본으로 사용하는 MySQL에서는 안 되는 것일까?

 

 

Sequelize Getting Started

Sequelize 공식 문서에도 host: 'localhost'라고 되어있다

ChatGPT에 다시 물어봤을 땐

일반적으로 localhost는 시스템의 호스트 파일에 등록된 IP주소를 사용하지만

일부 운영체제나 네트워크 구성에서는 localhost가 ::1을 가리킬 수도 있다고 한다

 

결론은 Sequelize 에서 localhost로 사용한 건 127.0.0.1로 변환되기 때문인데 어째서인지 내 노트북(m1)에선 IPv6인 ::1로 변환이 되고 MySQL에서는 권한 에러가 발생한다는 점이다.

연결 거부 에러가 발생한다면 어떤 주소로 연결을 했는지 확인하자

 

댓글