[SpringBoot] MySQL 연동 오류
나는... 너무 많은 것을 까먹었다
당연하다 스프링부트가 3점대가 되면서 뭔가 많이 바뀌기도 했고 한동안 Flask만 만져서 MySQL을 거의 안다뤘었다. (심지어 Visual Studio랑 충돌한다고 MySQL을 삭제했었음;;)
SpringBoot 3.xx 버전으로 프로젝트를 개발하면서 MySQL을 연동하는 과정 중에 많은 삽질을 했다.
다음에도 삽질하지 않기 위해 내가 마주했던 오류들과 해결한 과정들을 기록해보겠다.
https://velog.io/@sians0209/Spring-Spring-gradle-MySQL-JPA-%EC%97%B0%EB%8F%99
요 글을 기본적으로 참고하면서 MySQL 연동을 진행하고 있었다.
그러나 버전이 업데이트 되면서 deprecated된 것들도 있어 코드의 수정이 필요했다.
1. cannot resolve class or package 'mysql' 에러
# MySQL 설정
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:<여기에포트번호입력>/<여기에연결할데이터베이스이름입력>?useSSL=false&useUnicode=true&serverTimezone=Asia/Seoul
spring.datasource.username=root
password=<여기에 비밀번호 입력>
spring.jpa.show-sql=true
spring.jpa.hibernate.hbm2ddl.auto=update
spring.jpa.properties.hibernate.format_sql=true
위의 코드를 그대로 따라쳤을때,
cannot resolve class or package 'mysql' 라는 에러 메시지가 뜨면서 com.mysql.cj.jdbc.Driver가 빨간 글씨로 변했었다.
이는 build.gradle에서 dependencies에
//mysql
implementation 'com.mysql:mysql-connector-j'
implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
를 추가하고 다시 재빌드 하면 해결되었다.
https://turnaroundwoo.tistory.com/entry/IntelliJ-SpringBoot-Cannot-resolve-class-or-package-mysql
요 위의 글 해결방법을 참고하였다. MySQL이 8점대 버전 이후부터 네이밍 가이드라인에 맞추어 groupid 및 artifactId를 바꿨기 떄문이었다.
2. spring.jpa.hibernate.ddl-auto=update invalid value
# MySQL 설정
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:<여기에포트번호입력>/<여기에연결할데이터베이스이름입력>?useSSL=false&useUnicode=true&serverTimezone=Asia/Seoul
spring.datasource.username=root
password=<여기에 비밀번호 입력>
spring.jpa.show-sql=true
spring.jpa.hibernate.hbm2ddl.auto=update
spring.jpa.properties.hibernate.format_sql=true
위에서 spring.jpa.hibernate.hbm2ddl.auto=update 는 기존의 위의 링크에 있는 코드와 다른 것을 확인 가능하다.
원래는 spring.jpa.hibernate.ddl-auto=update 요 코드였고 여기에 빨간 줄이 떴었다.
spring.jpa.hibernate.ddl-auto=update 를 spring.jpa.hibernate.hbm2ddl.auto=update 으로 바꾸면 해결되었다.
https://chaelin1211.github.io/study/2021/04/10/hibernate-error-01.html
위의 링크 해결방법을 참고하여 해결했다.
3. com.mysql.jdbc.Driver deprecated
dbtest라는 class를 생성해서 MySQL이 제대로 연동되었는지 확인하는 코드를 작성했었다.
https://whitepaek.tistory.com/18
코드는 위의 글을 참고하여 작성하였다.
package com.birdiebuddy.birdiebuddy;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
public class dbtest {
public static void main(String[] args){
Connection con = null;
String server = "localhost"; // MySQL 서버 주소
String database = ""; // MySQL DATABASE 이름
String user_name = "root"; // MySQL 서버 아이디
String password = ""; // MySQL 서버 비밀번호
// 1.드라이버 로딩
try {
Class.forName("com.mysql.cj.jdbc.Driver");
} catch (ClassNotFoundException e) {
System.err.println(" !! <JDBC 오류> Driver load 오류: " + e.getMessage());
e.printStackTrace();
}
// 2.연결
try {
con = DriverManager.getConnection("jdbc:mysql://" + server + "/" + database + "?useSSL=false", user_name, password);
System.out.println("정상적으로 연결되었습니다.");
} catch(SQLException e) {
System.err.println("con 오류:" + e.getMessage());
e.printStackTrace();
}
// 3.해제
try {
if(con != null)
con.close();
} catch (SQLException e) {}
}
}
처음에 실행했을때,
Class.forName("com.mysql.jdbc.Driver"); 원래 이코드였음!
-> 여기서 com.mysql.jdbc.Driver는 deprecated 되어서 다른 코드로 바꿨어야 했다.
Class.forName("com.mysql.cj.jdbc.Driver"); 로 수정했더니 제대로 실행되었다.
그런데 또다른 에러가 발생했다...
4. java.lang.classnotfoundexception: com.mysql.cj.jdbc.driver
이건 뭘까? 사실 여기서 삽질을 좀 했다...
https://www.youtube.com/watch?v=h6xwRwlFypM
사랑해요
요 유튜브 링크의 영상을 통해 해결했다. mysql connector java를 다운받아
.jar 파일을 위 링크에서의 방법때로 따라하여 추가했더니 해결이 되었던 것 같다.
그러나 나는 또 다른 에러를 만난다. (........)
5. error 2003 (hy000): can't connect to mysql server on 'localhost:3306' (10061)
이건 내가 mysql 서버를 껐다 켰다 막 하고 강제로 프로세스를 종료시키는 과정에서 발생한 문제다.
요글을 참고하여 해결할 수 있었다.
원인은 MySQL 서버가 켜져있지 않아서였다.
CTRL+ALT+DELETE 단축키로 작업 관리자에 들어가서, 메뉴에 서비스를 들어가
MySQL을 검색하면 중지되어있는 것을 확인 가능
우클릭을 하여 다시 실행시켜주면 된다.
6. Access denied for user '유저아이디'@'localhost' (using password: YES)
이건 정말 의아했다.
나는 제대로 비밀번호도 입력했고, 권한도 root라서 문제 없을텐데?
https://velog.io/@rladuswl/MySQL-%EC%97%B0%EB%8F%99-%EC%97%90%EB%9F%AC
요 글을 통해 해결 가능했다.
이유는 정확하게 모르겠지만... 나같은 경우 root 계정으로 하고 있었으므로
root 계정의 비밀번호를 변경하여 진행했다.
기존에는 1234같은 단순한 숫자로만 이루어진 비밀번호를 사용했었는데
영어와 같은 문자를 추가한 새로운 비밀번호로 바꾸어 다시 접속했더니 성공했다.
mysql의 비밀번호를 바꾸는 방법은 https://pigeon-blog.tistory.com/207
요 글을 참고!
그리고 나서 다시 run을 했더니
성공하였다!
+) 요건 내가 뻘짓하면서 발생한 에러인데.. 혹시나 나중에 또 마주칠까봐 부가적으로 정리한다.
mysql your password has expired. to log in you must change it using a client that supports expired passwords.
요 에러인데.. 이건 사실 MySQL Workbench에서 Users들을 확인하는 과정에서 root 계정의 비밀번호를 확인하는 과정 중에
실수로 expire password를 눌러버리고 다시 run했을때 마주친 에러였다..
위의 링크를 참고하여 다시 비밀번호를 변경함으로써 해결 가능했다.
댓글