Bibi's DevLog ๐Ÿค“๐ŸŽ

[TIL] JDBC์™€ DB ์—ฐ๊ฒฐ - JDBC๋กœ Docker์˜ MySQL ์—ฐ๊ฒฐ (์‚ฝ์งˆ ๋งŽ์Œ) ๋ณธ๋ฌธ

TIL

[TIL] JDBC์™€ DB ์—ฐ๊ฒฐ - JDBC๋กœ Docker์˜ MySQL ์—ฐ๊ฒฐ (์‚ฝ์งˆ ๋งŽ์Œ)

๋น„๋น„ bibi 2021. 1. 30. 23:53

[210130]

๋ฐ”์œ ์ผ๊ณผ๋ฅผ ๋๋‚ด๊ณ  ์ €๋…์— ์กฐ๊ธˆ์ด๋ผ๋„ ๊ณต๋ถ€ํ•˜๋ ค๊ณ  ์ฑ…์ƒ์— ์•‰์•˜๋‹ค.
์–ด์ œ ๋ชป ๋๋‚ธ JDBC - MySQL ์—ฐ๊ฒฐ์„ ์œ„ํ•ด..

ํ•œ ์‹œ๊ฐ„ ์ •๋„ ์‚ฝ์งˆํ•˜๊ณ  ๋“œ๋””์–ด ์„ฑ๊ณตํ–ˆ๋‹ค!! ๐ŸŽ†
์˜ค๋Š˜ TIL์—๋Š” ๋‚˜์˜ ์‚ฝ์งˆ๋‚ด์—ญ์„ ๊ณต์œ ํ•˜๋ ค๊ณ  ํ•œ๋‹ค.


TIL

๋‚ด๊ฐ€ ๊ณ„์† ๋งˆ์ฃผ์นœ ์˜ค๋ฅ˜๋Š”
java.sql.SQLException: Access denied for user 'ID'@'localhost' (using password : YES) ์˜€๋‹ค.

๊ตฌ๊ธ€๋ง ๊ฒฐ๊ณผ ์œ„ ์˜ค๋ฅ˜๋Š” ์•„๋ž˜์˜ ๋‘ ๊ฒฝ์šฐ ๋ฐœ์ƒํ•œ๋‹ค๊ณ  ํ•œ๋‹ค.

  1. MySQL์„œ๋ฒ„์— ์‚ฌ์šฉํ•˜๋ ค๋Š” ์‚ฌ์šฉ์ž(ID)์˜ ํŒจ์Šค์›Œ๋“œ๊ฐ€ ํ‹€๋ฆฐ ๊ฒฝ์šฐ - ํŒจ์Šค์›Œ๋“œ ํ™•์ธ ํ•„์š” (์ถœ์ฒ˜)
  2. ํ•ด๋‹น ip์ฃผ์†Œ๋กœ์˜ ์ ‘๊ทผ์ด ์ œํ•œ๋œ ๊ฒฝ์šฐ - ๊ถŒํ•œ ๋ถ€์—ฌ ํ•„์š” (์ถœ์ฒ˜)

๋ถ„๋ช…ํžˆ ๋‚˜๋Š” MySQL์— ํ•ด๋‹น ์•„์ด๋””๋ฅผ ๋งŒ๋“ค์–ด ๋‘๊ณ , ip์ฃผ์†Œ๋„ ๋™์ผํ•˜๊ฒŒ ์ง€์ •ํ•ด ๋‘๊ณ , ๊ถŒํ•œ๋„ ๋ถ€์—ฌํ•ด ๋†“์•˜๋Š”๋ฐ
์™œ ์ € ์˜ค๋ฅ˜๊ฐ€ ๊ณ„์† ๋œจ๋Š”์ง€ ๋‹ต๋‹ตํ–ˆ๋‹ค.

๊ทธ๋ž˜์„œ

  1. MySQL ์‚ฌ์šฉ์ž ์กฐํšŒ, ์ถ”๊ฐ€ ๊ถŒํ•œ๋ถ€์—ฌ ๋„ ํ•ด ๋ณด์•˜๋‹ค.
  • ์‚ฌ์šฉ์ž ์กฐํšŒ : USE mysql; - select user, host from user;
  • ์‚ฌ์šฉ์ž ์ถ”๊ฐ€ : mysql -u root -p mysql๋กœ ์ ‘์† ํ›„,
    create user 'USER_ID'@'ip์ฃผ์†Œ' identified by 'USER_PASSWORD';
  • ์‚ฌ์šฉ์ž ๊ถŒํ•œ๋ถ€์—ฌ : grant all privileges on DATABASE_NAME.* to USER_ID@'ip์ฃผ์†Œ';
    • 'ip์ฃผ์†Œ'์— '%' ์ž…๋ ฅ์‹œ ์™ธ๋ถ€์—์„œ๋„ ์ ‘์† ๊ฐ€๋Šฅ.
  1. ํ˜น์‹œ๋‚˜ ํ•ด์„œ MySQL ๋น„๋ฐ€๋ฒˆํ˜ธ ๋ณ€๊ฒฝ๋„ ํ•ด ๋ณด์•˜๋‹ค.
  • ์‚ฌ์šฉ์ž ๋น„๋ฐ€๋ฒˆํ˜ธ ๋ณ€๊ฒฝ : mysql -u root -p mysql๋กœ ์ ‘์† ํ›„,
    USE mysql; - UPDATE user set password=password('๋น„๋ฐ€๋ฒˆํ˜ธ') WHERE user='์‚ฌ์šฉ์ž';

๊ทธ๋ž˜๋„ ์•ˆ ๋๋‹ค.๐Ÿ˜ญ

๊ทธ๋Ÿฐ๋ฐ ๋ฌธ๋“..

  1. ๋‚ด๊ฐ€ ๋‚ด ์ปดํ“จํ„ฐ์— ์˜ค๋ž˜ ์ „์— ์ƒํ™œ์ฝ”๋”ฉ DATABASE๊ฐ•์˜๋ฅผ ๋“ค์œผ๋ฉด์„œ,
    ์‹ค์Šต์šฉ์œผ๋กœ Bitnami๋ฅผ ํ†ตํ•ด MySQL์„ ์„ค์น˜ํ•œ ์ ์ด ์žˆ๋‹ค๋Š” ์‚ฌ์‹ค๊ณผ..
  2. ์ง€๊ธˆ Docker์˜ MySQL์ปจํ…Œ์ด๋„ˆ์— ์—ฐ๊ฒฐํ•˜๋ ค ํ•˜๊ณ  ์žˆ๋‹ค๋Š” ์‚ฌ์‹ค...

์„ ๊นจ๋‹ซ๊ฒŒ ๋˜์—ˆ๋‹ค.

  1. ์„ ๊นจ๋‹ซ๊ณ  ํ—๋ ˆ๋ฒŒ๋–ก Bitnami์— ๋“ค์–ด๊ฐ€ ๋ณด์•˜๋‹ค.

bitnami

์ด๋ž˜์„œ localhost๋กœ ์•„๋ฌด๋ฆฌ ์ ์–ด๋„ ์—ฐ๊ฒฐ์ด ์•ˆ ๋˜์—ˆ๊ตฌ๋‚˜.. ์‹ถ์–ด์„œ ์–ผ๋ฅธ Stop ํ•˜๊ณ , ๋‹ค์‹œ ์‹คํ–‰ํ•ด ๋ณด๋‹ˆ

์•„๊นŒ์™€ ๋‹ค๋ฅด๊ฒŒ

java.sql.SQLException: Access denied for user 'bibi'@'172.17.0.1' (using password: YES)

๋ผ๋Š” ์˜ค๋ฅ˜ ๋ฉ”์‹œ์ง€๊ฐ€ ๋–ด๋‹ค.

IP์ฃผ์†Œ๊ฐ€ ๋ฐ”๋€Œ์—ˆ๋‹ค. 172.17.0.1์„ ์‚ฌ์šฉํ•œ ์ ์ด ์—†๋Š”๋ฐ ๋ฌด์Šจ ์ฃผ์†Œ์ผ๊นŒ?

์‹ถ์–ด์„œ ๊ฒ€์ƒ‰ํ•ด ๋ณด๋‹ˆ..

Docker์˜ ์ธํ„ฐํŽ˜์ด์Šค๊ฐ€ ๋™์ž‘ํ•  ๋•Œ IP๊ฐ€ ์ž๋™์œผ๋กœ 172.17.0.1 ๋กœ ๋ฐฐ์ •๋œ๋‹ค. ๊ณ  ํ•œ๋‹ค.

์„ธ์ƒ์—.. ๊ทธ๊ฒƒ๋„ ๋ชจ๋ฅด๊ณ  localhost๋กœ ์—ฐ๊ฒฐํ•˜๋ฉด์„œ ์™œ ์•ˆ๋ผ!! ํ•˜๊ณ  ์žˆ์—ˆ๋‹ค๋‹ˆ..

์ •๋ง ๋‚จ ๋ณด๊ธฐ ๋ถ€๋„๋Ÿฝ์ง€๋งŒ ๊ทธ๋ž˜๋„ ์ด๋ ‡๊ฒŒ ๊ณต์œ ํ•ด ๋ณธ๋‹ค. ๋ˆ„๊ตฐ๊ฐ€์—๊ฒŒ๋Š” ๋„์›€์ด ๋  ์ˆ˜๋„ ์žˆ๊ฒ ์ง€..

๊ฒฐ๋ก 

๊ฒฐ๊ตญ ๋‚˜์˜ ๊ฒฝ์šฐ ๋ฌธ์ œ๋Š”

  • ์ด๋ฏธ ๋กœ์ปฌ(๋‚ด ์ปดํ“จํ„ฐ)์— ์„ค์น˜๋œ MySQL์ด ์žˆ์—ˆ๊ณ , ๋กœ์ปฌ MySQL์— ๋Œ€ํ•ด ์˜ฌ๋ฐ”๋ฅด์ง€ ์•Š์€ ID์™€ ๋น„๋ฐ€๋ฒˆํ˜ธ๋กœ ์ ‘๊ทผ์„ ์‹œ๋„ํ–ˆ๋‹ค.
  • Docker์— ์„ค์น˜ํ•œ MySQL์— ์ ‘์†ํ•˜๋ ค๊ณ  ํ•˜๋ฉด์„œ IP์ฃผ์†Œ๋ฅผ 172.17.0.1 ์ด ์•„๋‹Œ localhost๋กœ ์ ‘์†ํ•˜๋ ค ํ–ˆ๋‹ค.

์˜€๊ณ ,

ํ•ด๊ฒฐ์ฑ…์€

  • Bitnami๋ฅผ ํ†ตํ•ด ๋กœ์ปฌ MySQL์„ ์ข…๋ฃŒํ–ˆ๋‹ค
  • Docker MySQL์—์„œ 172.17.0.1์˜ ip์ฃผ์†Œ๋ฅผ ๊ฐ–๋Š” ์‚ฌ์šฉ์ž๋ฅผ ์ƒ์„ฑํ•˜๊ณ , ๊ถŒํ•œ์„ ๋ถ€์—ฌํ•˜๊ณ , ๊ทธ ์‚ฌ์šฉ์ž๋กœ ๋‹ค์‹œ ์—ฐ๊ฒฐ์„ ์‹œ๋„ํ–ˆ๋‹ค.

์˜€๋‹ค.

์•„๋ž˜๋Š” ๋‚ด๊ฐ€ ์‹ค์Šตํ•œ ์ „์ฒด ์ฝ”๋“œ์ด๋‹ค.

JDBC

.. ์–ด์ œ์ž TIL์— ์ด์–ด์„œ ..

*์ด ์˜ˆ์ œ๋Š” ์—ฌ๊ธฐ๋ฅผ ์ฐธ๊ณ ํ•˜๋ฉฐ ๋”ฐ๋ผํ–ˆ์Šต๋‹ˆ๋‹ค.

(์ค€๋น„) MySQL๊ธฐ์ค€, ๋‚ด ํ”„๋กœ์ ํŠธ ์™ธ๋ถ€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์— mysql-connector-java-๋ฒ„์ „ ๋ฒˆํ˜ธ.jar ๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” ๋ฐ์— ์„ฑ๊ณตํ–ˆ๋‹ค๋ฉด ์•„๋ž˜๋ฅผ ์ด์–ด์„œ ์ง„ํ–‰ํ•œ๋‹ค.

(์ค€๋น„) ์—ฐ๊ฒฐ์„ ์›ํ•˜๋Š” MySQL ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค testdb๊ฐ€ ์กด์žฌํ•˜๊ณ , ์‚ฌ์šฉ์ž IDID(๋น„๋ฐ€๋ฒˆํ˜ธ PWPW) ๊ฐ€ ์กด์žฌํ•ด์•ผ ํ•œ๋‹ค.

// (์ค€๋น„)mysql-connector-java-๋ฒ„์ „-bin.jar ํŒŒ์ผ์ด ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์— ์žˆ์–ด์•ผ ํ•จ.

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
// import ํ•ด์•ผ ํ•˜๋Š” ์„ธ ํด๋ž˜์Šค๋“ค

public class UseMySQL {
    public static void main(String[] args) {
        // Connection๊ฐ์ฒด๋ฅผ ์ž๋™์™„์„ฑ์œผ๋กœ importํ•œ๋‹ค. java.sql.Connection
        Connection conn = null;

        try {
            Class.forName("com.mysql.jdbc.Driver"); // (MySQL์˜ ๋“œ๋ผ์ด๋ฒ„ ํด๋ž˜์Šค ๊ฐ€์ ธ์˜ค๊ธฐ)
            // 1. ๋“œ๋ผ์ด๋ฒ„(์ธํ„ฐํŽ˜์ด์Šค)๋ฅผ ๊ตฌํ˜„ํ•œ ํด๋ž˜์Šค๋ฅผ ๋กœ๋”ฉ. ๊ฐ DB๋งˆ๋‹ค ํด๋ž˜์Šค๋ช…์ด ๋‹ค๋ฆ„. ์œ„๋Š” MySQL์˜ ๊ฒฝ์šฐ.

            String url = "jdbc:mysql://localhost:3306/testdb";
            // 2. ์—ฐ๊ฒฐํ•˜๊ธฐ - ๋“œ๋ผ์ด๋ฒ„ ๋งค๋‹ˆ์ €์—๊ฒŒ Connection๊ฐ์ฒด๋ฅผ ๋‹ฌ๋ผ๊ณ  ์š”์ฒญ.
            // Connection์„ ์–ป๊ธฐ ์œ„ํ•ด ํ•„์š”ํ•œ url๋„ ๊ฐ DB๋งˆ๋‹ค ๋‹ค๋ฆ„.
            // ์œ„๋Š” MySQL์˜ ๊ฒฝ์šฐ - jdbc:mysql://localhost/์‚ฌ์šฉํ•  db์ด๋ฆ„.

            conn = DriverManager.getConnection(url, "IDID", "PWPW");
            // 3. DB(MySQL)์— ์—ฐ๊ฒฐํ•˜๊ธฐ ์œ„ํ•œ ์ปค๋„ฅ์…˜ ์ •๋ณด ์ž…๋ ฅ (url, user, password).
            // getConnection() ์˜ ๋ฆฌํ„ด๊ฐ’์ธ Connection๊ฐ์ฒด๋ฅผ ํ†ตํ•ด ์ฟผ๋ฆฌ๋ฅผ ๋‚ ๋ฆฌ๋Š” statement๋ฅผ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค.
            // (SELECTํ•  ๋–„๋Š” createStatement(), INSERT์—์„œ๋Š” prepareStatement() .. ํ˜ธ์ถœ
            System.out.println("์—ฐ๊ฒฐ ์„ฑ๊ณต");

        } catch (ClassNotFoundException e) {
            System.out.println("๋“œ๋ผ์ด๋ฒ„ ๋กœ๋”ฉ ์‹คํŒจ");
        } catch (SQLException e) {
            System.out.println("์—๋Ÿฌ : " + e);
        } finally {
            try {
                if (conn != null && !conn.isClosed()) {
                    conn.close();
                }
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    }
}

์„ฑ๊ณต

์—ฐ๊ฒฐ ์„ฑ๊ณต!๐ŸŽ‰

๋‚ด์ผ์€ ์ด์–ด์„œ JDBC ์‘์šฉ ์˜ˆ์ œ๋ฅผ ๋”ฐ๋ผํ•ด ๋ด์•ผ๊ฒ ๋‹ค.