본문 바로가기

프로그래밍

MariaDB 설치 및 spring 연결(mac M1)

최근에 넘겨받게 된 프로젝트가 하나 있다.
그 전에 DB라곤 H2 밖에 써본적 없기에 안에 아키텍쳐를 눈으로 보고 싶어도 실행이 안되는 상황이었다.

아는 분께 여쭤보니 DB 연동문제라는 답을 받고 난 후,


라는 인수인계서의 내용을 풀기 위해 3번이 의미하는 바가 무엇인지는 모르지만 설정을 하였다.

DB연동이 무서워서 일단 실행해본 결과, 당연히 오류가 났고 실행은 안됐다.

DB 설치 관련해서 워낙 설정도 달라서, 이를 해결하는데 어려움을 겪어 내가 해결한 방법을 복기하고자, 나아가 도움이 될 수 있다면 도움이 되고자 정리해본다. 제목의 내용을 알아보자.

 


MariaDB 설치 및 spring 연결(mac M1) 

 

일단 MariaDB 설치를 먼저 해주어야한다.

 

Mac HomeBrew가 설치되어 있고, 최신화 되어있다는 가정하에 아래 task 진행

- mariaDB 설치

brew install mariadb → mariadb 설치 명령어

brew services start mariadb → 설치 후 마리아디비 실행 명령어

sudo mysql → 마리아디비 서비스 접근 명령어

 

- 설치 확인

설치가 완료되면, 커맨드 라인(명령 프롬프트, 터미널 등)을 열고 mariadb --version을 입력하여 정상적으로 설치되었는지 확인

 

MariaDB를 설치한 후, 데이터베이스와 사용자를 설정해야 한다.

  1. MariaDB 접속: 커맨드 라인에서 mariadb -u root -p 명령어를 사용해 MariaDB에 로그인
  2. 데이터베이스 생성: 새 데이터베이스를 생성합니다. 예: CREATE DATABASE mydatabase;
  3. 사용자 생성 및 권한 부여: 프로젝트용 사용자를 생성하고, 생성한 데이터베이스에 대한 권한을 부여한다.
    1.  
CREATE USER 'newuser'@'localhost' IDENTIFIED BY 'password';
GRANT ALL PRIVILEGES ON mydatabase.* TO 'newuser'@'localhost';
FLUSH PRIVILEGES;

 

 

이제 Spring Boot 프로젝트의 application.yml 파일을 수정하여 MariaDB에 연결할 수 있다.

  1. JDBC URL 설정: jdbc-url을 MariaDB 인스턴스에 맞게 설정한다. 예: jdbc:mariadb://localhost:3306/mydatabase
  2. 사용자 이름 및 비밀번호 설정: 앞서 생성한 데이터베이스 사용자의 이름과 비밀번호를 설정한다.
  3. 드라이버 클래스 이름 확인: driver-class-name이 org.mariadb.jdbc.Driver로 설정되어 있는지 확인한다.
  4. 추가 설정: 필요에 따라 다른 설정들을 추가합니다. 예를 들어, mapper-locations 설정은 MyBatis 등의 ORM 프레임워크를 사용할 때 지정하는 SQL 매퍼 파일 위치이다.
  5. 애플리케이션 재시작: 이 변경 사항을 적용하기 위해 Spring Boot 애플리케이션을 재시작한다.

 

여기서 의문점 한가지

JDBC URL 설정: jdbc-url을 MariaDB 인스턴스에 맞게 설정한다. 예: jdbc:mariadb://localhost:3306/mydatabase

여기서 설정해야 하는 나의 MariaDB url은 어떻게 알 수 있을까?
 
 
MariaDB JDBC URL은 데이터베이스에 접근하기 위한 주소를 의미합니다. 이 주소를 구성하는 요소에는 호스트명(또는 IP 주소), 포트 번호, 그리고 사용할 데이터베이스 이름이 포함됩니다. 일반적인 형식은 다음과 같다
 
jdbc:mariadb://[호스트명 또는 IP 주소]:[포트 번호]/[데이터베이스 이름]
 
 
 
예를 들어, localhost에 설치된 MariaDB 서버에서 3306 포트를 사용하고, mydatabase라는 이름의 데이터베이스를 사용하는 경우, JDBC URL은 다음과 같이 된다.

예) jdbc:mariadb://localhost:3306/mydatabase

 

 


 

근데 아직 오류가 발생했다.

 

Caused by: java.sql.SQLInvalidAuthorizationSpecException: Could not connect to address=(host=localhost)(port=3306)(type=master) : (conn=7) Access denied for user 'localhost'@'localhost' (using password: YES) Current charset is UTF-8. If password has been set using other charset, consider using option 'passwordCharacterEncoding' at org.mariadb.jdbc.internal.util.exceptions.ExceptionFactory.createException(ExceptionFactory.java:66) at org.mariadb.jdbc.internal.util.exceptions.ExceptionFactory.create(ExceptionFactory.java:197) at org.mariadb.jdbc.internal.protocol.AbstractConnectProtocol.connectWithoutProxy(AbstractConnectProtocol.java:1394) at org.mariadb.jdbc.internal.util.Utils.retrieveProxy(Utils.java:635) at org.mariadb.jdbc.MariaDbConnection.newConnection(MariaDbConnection.java:150) at org.mariadb.jdbc.Driver.connect(Driver.java:89) at com.zaxxer.hikari.util.DriverDataSource.getConnection(DriverDataSource.java:138) at com.zaxxer.hikari.pool.PoolBase.newConnection(PoolBase.java:364) at com.zaxxer.hikari.pool.PoolBase.newPoolEntry(PoolBase.java:206) at com.zaxxer.hikari.pool.HikariPool.createPoolEntry(HikariPool.java:476) at com.zaxxer.hikari.pool.HikariPool.checkFailFast(HikariPool.java:561) at com.zaxxer.hikari.pool.HikariPool.<init>(HikariPool.java:115) at com.zaxxer.hikari.HikariDataSource.getConnection(HikariDataSource.java:112) at org.hibernate.engine.jdbc.connections.internal.DatasourceConnectionProviderImpl.getConnection(DatasourceConnectionProviderImpl.java:122) at org.hibernate.engine.jdbc.env.internal.JdbcEnvironmentInitiator$ConnectionProviderJdbcConnectionAccess.obtainConnection(JdbcEnvironmentInitiator.java:181) at org.hibernate.resource.transaction.backend.jdbc.internal.DdlTransactionIsolatorNonJtaImpl.getIsolatedConnection(DdlTransactionIsolatorNonJtaImpl.java:44) ... 36 common frames omitted Caused by: java.sql.SQLInvalidAuthorizationSpecException: (conn=7) Access denied for user 'localhost'@'localhost' (using password: YES) Current charset is UTF-8. If password has been set using other charset, consider using option 'passwordCharacterEncoding' at org.mariadb.jdbc.internal.util.exceptions.ExceptionFactory.createException(ExceptionFactory.java:66) at org.mariadb.jdbc.internal.util.exceptions.ExceptionFactory.create(ExceptionFactory.java:192) at org.mariadb.jdbc.internal.protocol.AbstractConnectProtocol.authenticationHandler(AbstractConnectProtocol.java:772) at org.mariadb.jdbc.internal.protocol.AbstractConnectProtocol.createConnection(AbstractConnectProtocol.java:558) at org.mariadb.jdbc.internal.protocol.AbstractConnectProtocol.connectWithoutProxy(AbstractConnectProtocol.java:1389) ... 49 common frames omitted Process finished with exit code 1

 

오류는 대충이런..

 

 

해결방법은 몇가지 스텝을 따른다.

 

오류 메시지에 따르면, 문제는 데이터베이스에 접근할 때 "Access denied for user 'localhost'@'localhost'"라는 메시지가 나타나고 있습니다. 이는 일반적으로 다음과 같은 원인들로 인해 발생할 수 있다:

  1. 잘못된 사용자 이름 또는 비밀번호: 지정한 사용자 이름('localhost'@'localhost')과 비밀번호가 MariaDB에 설정된 값과 일치하지 않다.  여기서 앞 localhost에 내가 설정한 username 이 들어가야 한다.
  2. 사용자 권한 부여 문제: MariaDB에서 해당 사용자에게 필요한 권한이 부여되지 않았거나, 사용자가 생성되지 않았을 수 있다.
  3. 문자 인코딩 문제: 비밀번호가 UTF-8 이외의 다른 문자 인코딩으로 설정되었을 수 있습니다. 이 경우, 문자 인코딩 문제가 발생할 수 있다.

해결 방법

  1. 사용자 이름과 비밀번호 확인:
    • application.yml 파일에서 username과 password 값을 확인.
    • MariaDB에서 해당 사용자가 존재하는지 확인. (SELECT User, Host FROM mysql.user;)
    • 해당 사용자의 비밀번호를 다시 설정해 볼 수 있다. (SET PASSWORD FOR 'user'@'localhost' = PASSWORD('newpassword');)
  2. 사용자 권한 확인 및 재설정:
    • 해당 사용자에게 올바른 데이터베이스에 대한 접근 권한이 있는지 확인.
    • 필요한 경우, 사용자에게 데이터베이스 접근 권한을 다시 부여한다.
  3. 문자 인코딩 확인 및 설정 변경:
    • application.yml에서 passwordCharacterEncoding=UTF-8 설정을 추가하여, 비밀번호 인코딩 문제를 해결.
    • 예: jdbc:mariadb://localhost:3306/mydatabase?passwordCharacterEncoding=UTF-8

 

여기서 사용자 권한 확인 및 재설정에 대해 좀 더 자세히 보자,

 

사용자 접근 권한 확인

MariaDB에서 사용자의 데이터베이스 접근 권한을 확인하기 위해 다음의 SQL 명령어를 사용할 수 있다

 

해당 사용자에 대한 권한을 조회.
예를 들어, 사용자 이름이 'yourusername'이고 데이터베이스 이름이 'yourdatabase'인 경우, 다음 명령어를 사용한다.

 

SHOW GRANTS FOR 'yourusername'@'localhost';

 

해봤는데 대충 아무 권한이 없다는 뜻이 아닐까..

 

사용자 접근 권한 재설정

해당 사용자에게 필요한 권한이 없다면, 다음과 같은 방법으로 권한을 부여할 수 있다:

  1. 사용자에게 특정 데이터베이스에 대한 모든 권한을 부여하려면, 다음과 같은 SQL 명령어를 사용한다.예) GRANT ALL PRIVILEGES ON yourdatabase.* TO 'yourusername'@'localhost';
  2. 하고 적용 FLUSH PRIVILEGES;

 

 

 

이렇게 하면 웬만해선 문제가 해결된다! 아직 오류가 나고 있다면 비밀번호를 재설정하고 실행해보거나 gpt에게 물어보는게..