Nestjs + MySQL Docker 연동시 에러 해결

따라하면서 배우는 NestJS 를 보면서 게시판 로직을 구현 했다.

이 강의는 postgresDB를 사용했고, 나는 Docker에 MySQL를 올리고 사용하고 싶었기 때문에, 수정이 필요했다.

docker에 mysql 이미지를 설치하고 컨테이너를 실행.
MySQLWorkbench를 설치 후 db를 연결했다.

그리고 프로젝트 config폴더의 default.yaml파일에서 db의 정보들을 mysql에 맞게 바꾸고 야심차게 서버를 켜보았지만, 결과는 에러....

프로젝트 내부에 mysql 모듈을 설치하지 않아서 나오는 에러였다.

npm install mysql --save

다시 서버를 켜보았지만 또 다시 에러.. 절망 ^_ㅠ

ER_NOT_SUPPORTED_AUTH_MODE: 
Client does not support authentication protocol requested by server; 
consider upgrading MySQL client

현재 mysql이 기본 인증 플러그인으로 사용하고있는 'caching_sha2_password'를 nestjs에서 소화하지 못해서 생기는 오류였다.

이럴때는 클라이언트에서 사용할 수 있도록 인증 플러그인을 예전 방식인 'mysql_native_password'로 바꿔주거나, nestjs에서 mysql2플러그인을 사용하면 된다.

나는 'mysql_native_password'로 바꿔주는 방법을 택했다.

  1. 터미널을 켜고 docker의 mysql에 접속
$ docker exec -it [컨테이너명] /bin/bash
# mysql -u root -p
  1. mysql의 비밀번호 플러그인을 확인해보자(내가 사용중인 user가 'caching_sha2_password'이기 때문에 에러가 난 것)
mysql> select host, user, plugin, authentication_string from mysql.user;
+-----------+------------------+-----------------------+------------------------------------------------------------------------+
| host      | user             | plugin                | authentication_string                                                  |
+-----------+------------------+-----------------------+------------------------------------------------------------------------+
| %         | root             | caching_sha2_password | *81F5E21E35407D884A6CD4A731AEBFB6AF209E1B                              |
| localhost | mysql.infoschema | caching_sha2_password | $A$005$THISISACOMBINATIONOFINVALIDSALTANDPASSWORDTHATMUSTNEVERBRBEUSED |
| localhost | mysql.session    | caching_sha2_password | $A$005$THISISACOMBINATIONOFINVALIDSALTANDPASSWORDTHATMUSTNEVERBRBEUSED |
| localhost | mysql.sys        | caching_sha2_password | $A$005$THISISACOMBINATIONOFINVALIDSALTANDPASSWORDTHATMUSTNEVERBRBEUSED |
| localhost | root             | caching_sha2_password | $A$005$[Z.gmzOJn	FxOXSoIicHhcXSS0TUf2HGDHf8HcEXvmKZK9jjnIQYh8XI3 |
+-----------+------------------+-----------------------+------------------------------------------------------------------------+
  1. DDL을 이용하여 플러그인 방식을 바꿔준다.
mysql> ALTER USER '[username]'@'%' IDENTIFIED WITH mysql_native_password by '[비밀번호]';

이렇게 하고 다시 플러그인을 확인해보면 'mysql_native_password'로 잘 바뀐 것을 알 수 있다.

+-----------+------------------+-----------------------+------------------------------------------------------------------------+
| host      | user             | plugin                | authentication_string                                                  |
+-----------+------------------+-----------------------+------------------------------------------------------------------------+
| %         | root             | mysql_native_password | *81F5E21E35407D884A6CD4A731AEBFB6AF209E1B                              |
| localhost | mysql.infoschema | caching_sha2_password | $A$005$THISISACOMBINATIONOFINVALIDSALTANDPASSWORDTHATMUSTNEVERBRBEUSED |
| localhost | mysql.session    | caching_sha2_password | $A$005$THISISACOMBINATIONOFINVALIDSALTANDPASSWORDTHATMUSTNEVERBRBEUSED |
| localhost | mysql.sys        | caching_sha2_password | $A$005$THISISACOMBINATIONOFINVALIDSALTANDPASSWORDTHATMUSTNEVERBRBEUSED |
| localhost | root             | caching_sha2_password | $A$005$[Z.gmzOJn	FxOXSoIicHhcXSS0TUf2HGDHf8HcEXvmKZK9jjnIQYh8XI3 |
+-----------+------------------+-----------------------+------------------------------------------------------------------------+
  1. 권한을 변경하였으니 privilege를 flush하여 반영해준다.
    (FLUSH PRIVILEGES 명령어는 grant 테이블을 reload함으로서 변경사항을 즉시 반영하도록 해준다.)
mysql> FLUSH PRIVILEGES;

여기까지하고 다시 서버를 구동시켜보니 'Application running on port 3000'으로 잘 뜨는 것을 확인했다 :-)

좋은 웹페이지 즐겨찾기