📝ERROR NOTE/SPRINGBOOT

[SpringBoot] MySQL 연동 오류

coldNoodlePigeon 2023. 10. 2.

나는... 너무 많은 것을 까먹었다 

 

당연하다 스프링부트가 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

 

[Spring] DB(MySQL) 연결

spring gradle - MySQL - JPA 연결

velog.io

요 글을 기본적으로 참고하면서 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

 

[IntelliJ /SpringBoot] Cannot resolve class or package 'mysql'

발생 상황 [DB연동 관련] application.yml > datasource 추가 및 db 관련 build.gradle 설치가 된 환경에도 에러 발생 == application.yml 추가 == # database 연동 설정 spring: datasource: driver-class-name: com.mysql.cj.jdbc.Driver ur

turnaroundwoo.tistory.com

요 위의 글 해결방법을 참고하였다. 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

 

[Error] Hibernate ddl auto 오류 - Chaelin's Blog

이전에 교육에서 수행했던 프로젝트를 뜯어 고치는 작업을 올 초부터 해오고 있는데, 그 땐 프로젝트 기간이 워낙 짧고(최종 프로젝트인데 1박 2일 정도 기간 밖에 안 줬습니다…) 명목은 프론트

chaelin1211.github.io

위의 링크 해결방법을 참고하여 해결했다. 

 

 

3. com.mysql.jdbc.Driver deprecated 

dbtest라는 class를 생성해서 MySQL이 제대로 연동되었는지 확인하는 코드를 작성했었다. 

https://whitepaek.tistory.com/18

 

[IntelliJ] JDBC 연동, Java MySQL 연결

Java MySQL 연결하기, JDBC 연동방법!자바에서 데이터베이스를 연결하여 사용하기 위해서는 JDBC가 필요합니다.JDBC는 Java Database Connectivity의 약자로써 Java에서 데이터베이스를 접속할 수 있게 해주는

whitepaek.tistory.com

코드는 위의 글을 참고하여 작성하였다. 

 

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 서버를 껐다 켰다 막 하고 강제로 프로세스를 종료시키는 과정에서 발생한 문제다. 

https://hoon93.tistory.com/9

 

MySQL 접속 에러 / ERROR 2003 (HY000): Can't connect to MySQL server on 'localhost' (10061)

MySQL 접속 에러 ERROR 2003 (HY000): Can't connect to MySQL server on 'localhost' (10061) 로컬에서 root계정으로 MySQL접속을 시도했는데 DB Server에 접속되지 않는 에러가 발생했다. 위의 에러를 해석해보면 'localhost'(

hoon93.tistory.com

요글을 참고하여 해결할 수 있었다.

원인은 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

 

MySQL 연동 에러 Access denied for user '유저아이디'@'localhost' (using password: YES)

MySQL 데이터베이스를 연결하기 위해,MySQL Workbench에서 아래 명령어를 입력하여 유저를 생성하였다.root 계정으로 yj라는 유저 생성을 완료했다.모든 권한도 부여하였는데..자꾸만 에러가 난다..아,

velog.io

 

요 글을 통해 해결 가능했다. 

이유는 정확하게 모르겠지만... 나같은 경우 root 계정으로 하고 있었으므로

root 계정의 비밀번호를 변경하여 진행했다.

기존에는 1234같은 단순한 숫자로만 이루어진 비밀번호를 사용했었는데

영어와 같은 문자를 추가한 새로운 비밀번호로 바꾸어 다시 접속했더니 성공했다. 

mysql의 비밀번호를 바꾸는 방법은 https://pigeon-blog.tistory.com/207

 

[MySQL] 비밀번호를 까먹었을때 재설정 하는 법 ERROR 1045 (28000): Access denied for user 'root'@'localhost' (usin

프로젝트 개발을 하려고 mysql을 실행하는데 바보같이 mysql 비밀번호를 까먹어서 mysql -u root -p 실행에 애를 먹고 있었다 (;;) https://one-step-a-day.tistory.com/141 Windows MySQL root 비밀번호 변경하기 mysql uroo

pigeon-blog.tistory.com

요 글을 참고! 

 

그리고 나서 다시 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했을때 마주친 에러였다.. 

https://voidfunction-e.tistory.com/entry/mysql-%EC%9E%84%EC%8B%9C%EB%B9%84%EB%B0%80%EB%B2%88%ED%98%B8-%EC%95%94%ED%98%B8-%EB%A7%8C%EB%A3%8C-%EC%97%90%EB%9F%AC-%ED%95%B4%EA%B2%B0

 

mysql 임시비밀번호 에러 Your password has expired. To log in you must change it using a client that supports expired pa

Your password has expired. To log in you must change it using a client that supports expired passwords. You must reset your password using ALTER USER statement before executing this statement. 해결방법 ALTER USER 'root'@'localhost' IDENTIFIED BY '새

voidfunction-e.tistory.com

위의 링크를 참고하여 다시 비밀번호를 변경함으로써 해결 가능했다. 

댓글