상황
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로 바꾼 뒤 실행

성공!
비유적으로 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 공식 문서에도 host: 'localhost'라고 되어있다
ChatGPT에 다시 물어봤을 땐
일반적으로 localhost는 시스템의 호스트 파일에 등록된 IP주소를 사용하지만
일부 운영체제나 네트워크 구성에서는 localhost가 ::1을 가리킬 수도 있다고 한다
결론은 Sequelize 에서 localhost로 사용한 건 127.0.0.1로 변환되기 때문인데 어째서인지 내 노트북(m1)에선 IPv6인 ::1로 변환이 되고 MySQL에서는 권한 에러가 발생한다는 점이다.
연결 거부 에러가 발생한다면 어떤 주소로 연결을 했는지 확인하자
'에러 해결' 카테고리의 다른 글
os.system() 실행 경로에 띄어쓰기가 있어서 생기는 오류 (0) | 2023.08.16 |
---|---|
Flutter DioError SocketException: Failed host lookup 에러 (0) | 2023.07.31 |
pyside GUI 버튼 클릭 시 에러 없이 창이 꺼짐 (0) | 2023.07.28 |
SetProcessDpiAwarenessContext failed 에러 (0) | 2023.07.27 |
selenium.common.exceptions.WebDriverException: Message: unknown error: Chrome failed to start: crashed. 에러 (0) | 2023.01.15 |
댓글