요약
1. MySql 8.3버전 이하라면 1번 항목. 패스워드 타입을 mysql_native_password로 변경한다.
2. MySql 8.4버전 이상이라면 4번 항목. mysql-native-password=ON 속성을 추가해준다.
로컬환경에서 docker를 이용할 땐 잘 올라왔지만
서버에서 .jar파일을 실행할 때 제목과 같은 에러가 발생했습니다.
시도해본 절차는 다음과 같습니다.
참고
https://oziguyo.tistory.com/36
https://stackoverflow.com/questions/28068155/access-denied-for-user-rootlocalhost-using-password-yes-after-new-instal
페스워드를 기존 caching_sha2_password 타입에서 mysql_native_password 타입으로 변경해주는 방법입니다.
기존
mysql> SELECT User, Host, plugin FROM mysql.user;
+------------------+-----------+-----------------------+
| User | Host | plugin |
+------------------+-----------+-----------------------+
| root | % | caching_sha2_password |
| mysql.infoschema | localhost | caching_sha2_password |
| mysql.session | localhost | caching_sha2_password |
| mysql.sys | localhost | caching_sha2_password |
| root | localhost | caching_sha2_password |
+------------------+-----------+-----------------------+
5 rows in set (0.17 sec)
쿼리수행
mysql> update user set plugin='mysql_native_password' where user='root';
Query OK, 2 rows affected (0.04 sec)
Rows matched: 2 Changed: 2 Warnings: 0
이후
mysql> select user, host, plugin from user;
+------------------+-----------+-----------------------+
| user | host | plugin |
+------------------+-----------+-----------------------+
| root | % | mysql_native_password |
| mysql.infoschema | localhost | caching_sha2_password |
| mysql.session | localhost | caching_sha2_password |
| mysql.sys | localhost | caching_sha2_password |
| root | localhost | mysql_native_password |
+------------------+-----------+-----------------------+
5 rows in set (0.00 sec)
Plugin 'mysql-native-password' is not loaded와 같은 에러가 발생했습니다.
설치된 mysql의 설정정보를 변경해야 할 것 같은데
가상환경에서 실행하다보니 직접 설정을 건드리기에는 조금 부담스러웠고,
native-password를 쓰지말라고 기본값으로 설정해놨는데, 이걸 우회하는 방법이 그다지 마음에 들지 않았습니다. (root 계정을 쓰며...)
다른방법은 없을지 고민해보았습니다.
참고
https://happymemoryies.tistory.com/69
https://csksoft.tistory.com/69
사실 제목에는 ...'root@'@'localhost'이라고 적었지만
콘솔창에서의 정확한 오류는 'root@'@'127.17.0.1'출력됐었습니다.
오류를 서칭하는 중
docker에서는 도메인을 localhost가 아니라 Docker의 가상 IP로 지정해주어야 한다는 글을 발견했습니다.
mysql> CREATE USER 'root'@'172.17.0.1' IDENTIFIED BY 'sample_password';
Query OK, 0 rows affected (0.02 sec)
mysql> GRANT ALL PRIVILEGES ON *.* TO 'root'@'172.17.0.1' WITH GRANT OPTION;
Query OK, 0 rows affected (0.03 sec)
mysql> flush privileges;
Query OK, 0 rows affected (0.01 sec)
mysql> exit;
Bye
... 여전히 Access denied for user 'root@'@'localhost' 라는 에러가 해결되지 않았습니다.
참고글에서는 docker shell에 vim을 설치해서 설정파일을 바꾸셨는데
docker shell에 sudo 권한 줘야하고...
계정생성도 root@localhost가 아닌, root로 생성하였기 때문에, 해당 설정을 통해서 과연 문제를 해결할 수 있을까? 에 대한 의문이 들어서
이쯤해보고 다른 방법을 찾아보기로 하였습니다.
이 방법을 채택하고 싶진 않았지만.....
판단의 근거는 아래와 같습니다.
- 실제로 운영할 서버가 아니다.
맨날 localhost에서만 개발을 하다보니까 반쪽자리 개발을 하는기분이 들어서
한번 서버에 띄워보는것이 목적이었습니다.- 프리티어에 OnPremiss 환경으로 구축하여 RDS를 따로 사용하지 않았다.
심지어 mysql을 설치하지도 않고, docker를 통해서 컨테이너를 생성하고,
mysql을 띄우기만 했으므로, 제대로 DB환경을 구축하지 않은 채
버전만 내리면 해결될 것 같은 문제를 몇일동안 붙잡고 있는것은 비효율적이라고 생각했습니다.- docker의 이미지만 바꾸면 되므로 버전을 변경하는데 부담이 없었다.
- 원인이나 해결방법이 대략적으로 파악이 되었다.
문제 해결을 위해선 MySQL을 직접 설치하거나,
Docker를 좀 더 능숙하게 다룰 수 있는 능력이 필요했습니다.

버전을 내리고 1번 계정의 패스워드 타입 변경 방식을 통해서 서버를 DB를 정상적으로 연결시킬 수 있었습니다.

참고
https://www.wirebiters.com/mysql-8-4-0-with-docker-compose/
https://dev.mysql.com/doc/relnotes/mysql/8.4/en/news-8-4-0.html
https://dev.mysql.com/doc/refman/8.4/en/native-pluggable-authentication.html
뭐든 최신버전 사용시 좀 안된다 싶으면 공식문서부터 확인하자.... 메모...x100
Mysql 8.4버전 ReleaseNote의 일부분입니다.
Important Change가 눈에 띕니다.

Important Change: The deprecated mysql_native_password authentication plugin is now disabled by default. It can be enabled by starting MySQL with the new --mysql-native-password=ON server option, or by adding mysql_native_password=ON to the [mysqld] section of your MySQL configuration file.
For more information, see Native Pluggable Authentication. (Bug #36337893)
MySql 8.4버전의 주요 변경점으로
mysql_native_password가 deprecated 되었다고 합니다..
1번방식에서 패스워드 타입을 mysql_native_password 로 변경하였으나
기본 플러그인으로 제공하지 않는 타입이므로 에러가 발생하는 것이였습니다.
문제에 대한 해결방법 역시 공식문서에서 제공하고 있었습니다.
https://dev.mysql.com/doc/refman/8.4/en/native-pluggable-authentication.html
도커 이미지를 받을때나, MySql 서버를 실행할 때 --mysql-native-password=ON 옵션을 주어 해결할 수 있을것으로 보입니다.
ps
전docker pull mysql....뒤에-mysql-native-password=ON해봤는데 안되더라구요... ( •ᴗ• ;)
결국 옵션주는걸 못해서.. 그냥 버전 내렸어요... ( •ᴗ• ;)