Infra

Ubuntu에 있는 MySQL을 로컬 Windows JDBC와 연결하기(Eclipse)

yerinpark 2023. 12. 12. 18:32

VirtualBox에서 Linux 환경을 구성하고 MySQL을 설치했다. 로컬 PC의 Windows 환경에서 JDBC 연결이 잘 되지 않아 헤맨 내용을 바탕으로 해결한 내용을 포스팅한다.
 
현재 DBeaver에는 root 계정과 user01 계정이 있다.
 

alter user 'root'@'localhost' identified with mysql_native_password

 

flush privileges;

 

grant all privileges on . to 'root'@'localhost' with grant option

 

use mysql;

 

select user,host from user;

 
결국에는 위의 내용과 같이 권한을 주어서 해결하는 것 같은데 root는 연결 성공하고 user01은 되지 않는 문제점이 발생했다. 
 
 
 

해결 방법

1. MySQL 접속 설정 변경하기

해당하는 데이터베이스 우클릭 > Edit Connection > Driver Properties 탭 > allowPublicKeyRetrieval 항목을
false에서 true로 변경해주어야 한다.

 
2. bind-address 변경
리눅스 명령어를 사용하여 MySQL 관련 파일을 수정한다.
 
아래의 명령어와 같이 mysqld.cnf 파일을 열어 수정해주었다.

username@servername:~$ ls /etc/
username@servername:~$ ls /etc/m            # m누르고 tab 누르면 m으로 시작하는 것만 보여줌.
machine-id      manpath.config  mime.types      modules         multipath/
magic           mdadm/          mke2fs.conf     modules-load.d/ multipath.conf
magic.mime      mecabrc         modprobe.d/     mtab            mysql/

username@servername:~$ ls /etc/m
username@servername:~$ ls /etc/mysql/mysql.conf.d/
mysql.cnf  mysqld.cnf

username@servername:~$ sudo vi /etc/mysql/mysql.conf.d/mysqld.cnf     # 꼭 sudo로 들어가기
[sudo] password for username:

Ubuntu 접속 URL 설정으로 MySQL 통신을 위한 작업을 한다.
(파일을 외부에서 접속 가능하게 ip를 오픈하기 위해 0.0.0.0 값으로 변경한다.)
 
bind-address = 127.0.0.1 을 0.0.0.0으로 수정한다.
 
리눅스 명령어 참고)
1. vi 명령어로 파일 진입 시 i 를 눌러 insert 모드로 전환한다.
2. 127.0.0.1을 0.0.0.0 으로 수정한 후
3. esc 키를 누른 후 :wq! (저장하고 종료)를 입력하여 편집기를 빠져나온다.
 

 
3. mysql 재시작

username@servername:~$ sudo service mysql restart
username@servername:~$ sudo systemctl status mysql
● mysql.service - MySQL Community Server
     Loaded: loaded (/lib/systemd/system/mysql.service; enabled; vendor preset: enabled)
     Active: active (running) since Wed 2023-12-13 00:57:24 UTC; 19s ago
    Process: 20094 ExecStartPre=/usr/share/mysql/mysql-systemd-start pre (code=exited, status=0/SUCCESS)
   Main PID: 20102 (mysqld)
     Status: "Server is operational"
      Tasks: 38 (limit: 4559)
     Memory: 369.4M
        CPU: 1.179s
     CGroup: /system.slice/mysql.service
             └─20102 /usr/sbin/mysqld

Dec 13 00:57:24 servername systemd[1]: mysql.service: Deactivated successfully.
Dec 13 00:57:24 servername systemd[1]: Stopped MySQL Community Server.
Dec 13 00:57:24 servername systemd[1]: mysql.service: Consumed 7min 48.989s CPU time.
Dec 13 00:57:24 servername systemd[1]: Starting MySQL Community Server...
Dec 13 00:57:24 servername systemd[1]: Started MySQL Community Server.
username@servername:~$

 
4. 이클립스 코드

package step01;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;
	
public class JDBC1Basic {
	// MySQL
	public static void main(String[] args) {
		// driver 로딩
		try {
			Class.forName("com.mysql.cj.jdbc.Driver"); // vendor specific

			// 접속
			Connection con = DriverManager.getConnection(
					"jdbc:mysql://127.0.0.1:8777/fisa?useSSL=false&allowPublicKeyRetrieval=true", "user01", "user01");
			System.out.println(con);

			// sql 문장 실행 객체 생성
			Statement stmt = con.createStatement();

			// 검색 결과는 결과 집합 구조의 table 형식 - result set이라고 표현
			ResultSet rs = stmt.executeQuery("select * from dept");

			// 결과 활용
			while (rs.next()) {
				System.out.println(rs.getInt(1) + " " + rs.getString("dname"));
			}

			// 자원 반환(접속 해제)
			/*
			 * ResultSet -> Statement -> Connection 순으로 자원 반환
			 */
			rs.close();
			stmt.close();
			con.close();
		} catch (Exception e) { // 발생되는 모든 예외 상위 타입으로 처리 선언
			e.printStackTrace();
		}
	}
}

 
 
getConnection의 parameter로 jdbc api로 직접 접속 제어할 때 통신 규약을 준다.

  1. 127.0.0.1:8777/fisa : mysql vendor가 지정할 설정값
  2. ?useSSL=false&allowPublicKeyRetrieval=true: db 버전 등에 따른 설정
"jdbc:mysql://127.0.0.1:8777/fisa?useSSL=false&allowPublicKeyRetrieval=true", "[id]", "[pw]"

 
 
 
 
참고로 포트 포워딩은 VirtualBox에서 다음과 같이 설정해주었다.

 
Windows : application으로 접속(고유 ip)
Linux : MySQL(고유 ip)
 
- private network : 외부 access 시에 vb의 nat으로 private ip : public ip 매핑
- Windows에서 127.0.0.1:8777 접속 시도 시
 
*MySQL은 3306 기본 port 제공