1. 전체등록

package com.haenin.section01.connection;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;

public class Application1 {

    /* 목표. 해당 DBMS 경로와 계정에 맞는 Connection 객체를 생성할 수 있다.
        (feat.해당 DB Driver 라이브러리 필요) */
    public static void main(String[] args) {
        Connection con = null;

        /* 설명. mysql 드라이버 클래스의 풀 네임을 통해 드라이버 등록(메모리에 등록) */
        try {
            Class.forName("com.mysql.cj.jdbc.Driver"); // 필기. 동적 메모리 할당
            con = DriverManager.getConnection("jdbc:mysql://localhost:3306/menudb",
                    "root",
                    "mariadb");
            System.out.println("Connection 객체: " + con);
        } catch (ClassNotFoundException e) {
            throw new RuntimeException(e);
        } catch (SQLException e) {
            throw new RuntimeException(e);
        } finally {
            try {
                if(con != null) con.close();
            } catch (SQLException e) {
                throw new RuntimeException(e);
            }
        }
    }
}

2. Properties 등록


package com.haenin.section01.connection;

import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.util.Properties;

public class Application2 {
    public static void main(String[] args) {
        Connection con = null;
        Properties prop = new Properties();

        /* 설명. mysql 드라이버 클래스의 풀 네임을 통해 드라이버 등록(메모리에 등록) */
        try {
            prop.load(
                    new FileReader(
                            "src/main/java/com/haenin/section01/connection/jdbc-config.properties"));
            String driver = prop.getProperty("driver");
            String url = prop.getProperty("url");
            String user = prop.getProperty("user");
            String password = prop.getProperty("password");

            Class.forName(driver); // 필기. 동적 메모리 할당
            con = DriverManager.getConnection(url, user, password);
            System.out.println("Connection2 객체: " + con);
        } catch (ClassNotFoundException e) {
            throw new RuntimeException(e);
        } catch (SQLException e) {
            throw new RuntimeException(e);
        } catch (FileNotFoundException e) {
            throw new RuntimeException(e);
        } catch (IOException e) {
            throw new RuntimeException(e);
        } finally {
            try {
                if(con != null) con.close();
            } catch (SQLException e) {
                throw new RuntimeException(e);
            }
        }
    }
}

스크린샷 2025-08-31 오후 1.12.54.png

driver=com.mysql.cj.jdbc.Driver
url=jdbc:mysql://localhost:3306/menudb
user=root
password=mariadb

3. Template 등록

package com.haenin.section02.template;

import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.util.Properties;

public class JDBCTemplate {

    public static Connection getConnection() {
        Connection con = null;
        Properties prop = new Properties(); // 필기. 키와 벨류가 스트링인 맵
        /* 설명. mysql 드라이버 클래스의 풀 네임을 통해 드라이버 등록(메모리에 등록) */
        try {
            prop.load(new FileReader(
                    "src/main/java/com/haenin/section01/connection/jdbc-config.properties"));
            String driver = prop.getProperty("driver");
            String url = prop.getProperty("url");
            String user = prop.getProperty("user");
            String password = prop.getProperty("password");

            Class.forName(driver);
            con = DriverManager.getConnection(url, user, password);

            System.out.println("Connection 객체: " + con);
        } catch (ClassNotFoundException e) {
            throw new RuntimeException(e);
        } catch (SQLException e) {
            throw new RuntimeException(e);
        } catch (FileNotFoundException e) {
            throw new RuntimeException(e);
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
        /* 설명. Connection 객체를 닫으면 안됨 */
        // 필기. 닫혀있지 않는 connection 객체를 넘겨준다.
        return con;
    }
    public static void close(Connection con) {
        if(con != null) {
            try {
                con.close();
            } catch (SQLException e) {
                throw new RuntimeException(e);
            }
        }

    }
}

package com.haenin.section02.template;

import java.sql.Connection;

import static com.haenin.section02.template.JDBCTemplate.getConnection;
import static com.haenin.section02.template.JDBCTemplate.close;
// 필기. JDBCTemplate을 모듈화 하였다
// 필기. 메소드명까지 임포트
// 필기. 메소드일때는 static메소드랑 임포트할때도 static이어야 가능
public class Application {
    public static void main(String[] args) {
        /* 설명. main 로직에서 Connection 객체가 필요한 순간에 한줄 코딩으로 받아내기*/
//        Connection con = JDBCTemplate.getConnection();
        Connection con = getConnection();
        // 필기. close가 메소드안에있기 그걸 지우고 떄문에 닫는거는 내가해야한다
        System.out.println("con = " + con);

        // 필기. connection 객체를 활용한 구문(SQL문을 통해 DB와의 CURD)
        close(con);

    }
}