[SQL์‘์šฉ]JDBC API

์˜ˆ์ง€์„ฑ์ค€ยท2024๋…„ 5์›” 22์ผ
0

JDBC(Java DataBase Connectivity) API

๐Ÿ“•API(Application Programming Interface)

  • ์ž๋ฐ” ๋ฐ์ดํ„ฐ ๋ฒ ์ด์Šค ์—ฐ๊ฒฐ ๊ธฐ์ˆ  ๋ช…์„ธ์„œ: ์ธํ„ฐํŽ˜์ด์Šค๋กœ ๊ตฌ์„ฑ
  • ๊ตฌํ˜„์ฒด๋Š” ๊ฐ DB์—…์ฒด๊ฐ€ ๊ตฌ์„ฑ(๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๋“œ๋ผ์ด๋ฒ„)

java.sql ํŒจํ‚ค์ง€ -> JDBC API
java.sql ๋ฌธ์„œ


  • ๋„์ปค ๋„˜ ๋ฌด๊ฑฐ์›Œ์„œ ์ด๋ฏธ์ง€ ์ƒˆ๋กœ ๋งŒ๋“ค๊ธฐ

  • ์ปจํ…Œ์ด๋„ˆ ๋งŒ๋“ค๊ธฐ
    docker run --name oracle-xe -d -p 1521:1521 -e ORACLE_PASSWORD=oracle gvenzl/oracle-xe:18

-d: ๋ฐฑ๊ทธ๋ผ์šด๋“œ ์‹คํ–‰
-p: ํฌํŠธ 1521
--name: ๋ช…์นญ ๋ฐ”๊พธ๊ธฐ

์ปจํ…Œ์ด๋„ˆ ๋งŒ๋“ค์–ด์กŒ๋‹ค ~~

์–˜๋Š” ์Šค์ฝง์€ ์—†๋‹ค! ์—ฐ์Šตํ• ๋•Œ๋Š” ์›๋ž˜ ์“ฐ๋˜๊ฑฐ๋กœ ์‚ฌ์šฉํ•˜๊ธฐ

  • debeaver์—ฐ๋™ํ•˜๊ธฐ

๋งŒ๋“ค์—ˆ๋˜ study๊ณ„์ • ์—ฐ๊ฒฐ

#study์—์„œ ํ…Œ์ด๋ธ” ์ถ”๊ฐ€
--ํ…Œ์ด๋ธ” ์ƒ์„ฑ
CREATE TABLE MEMBER (
	USER_NO NUMBER(10) PRIMARY KEY,
	USER_ID VARCHAR2(30) UNIQUE NOT NULL,
	USER_PW VARCHAR2(65) NOT NULL,
	USER_NM VARCHAR2(40) NOT NULL,
	MOBILE VARCHAR2(15),
	REG_DT DATE DEFAULT SYSDATE,
	MOD_DT DATE 
);

--์‹œํ€€์Šค ๊ฐ์ฒด ๋งŒ๋“ค๊ธฐ
CREATE SEQUENCE SEQ_MEMBER;

Oracle JDBC ๋“œ๋ผ์ด๋ฒ„ ์„ค์น˜

ojdbc11.jar -> ์˜์กด์„ฑ์— ์ถ”๊ฐ€ํ•˜๊ธฐ

Ojdbc11 ยป 23.4.0.24.05 ๋ฒ„์ „
gradle(short)
implementation 'com.oracle.database.jdbc:ojdbc11:23.4.0.24.05'

dependencies {
    runtimeOnly 'com.oracle.database.jdbc:ojdbc11:23.4.0.24.05' //๋™์ ๋กœ๋”ฉํ˜•ํƒœ
    testImplementation platform('org.junit:junit-bom:5.10.0')
    testImplementation 'org.junit.jupiter:junit-jupiter'
}

ํ•œ๊ธ€๊นจ์ง€๋Š” ์˜ค๋ฅ˜ ํ•ด๊ฒฐ์„ ์œ„ํ•ด

lombok๋„ ์ถ”๊ฐ€

dependencies {
    runtimeOnly 'com.oracle.database.jdbc:ojdbc11:23.4.0.24.05'
    implementation 'com.oracle.database.nls:orai18n:23.4.0.24.05'
    compileOnly 'org.projectlombok:lombok:1.18.32'
    annotationProcessor 'org.projectlombok:lombok:1.18.32'
    testImplementation platform('org.junit:junit-bom:5.10.0')
    testImplementation 'org.junit.jupiter:junit-jupiter'
}

DriverManager ํด๋ž˜์Šค -> Connection
DataSource ์ธํ„ฐํŽ˜์ด์Šค -> Connection: ์ปค๋„ฅ์…˜ ํ’€(์—ฐ๊ฒฐ ๊ฐ์ฒด ์ €์žฅ์†Œ)

์—ฐ๋™ ๊ณผ์ •

1) java.sql.* ํŒจํ‚ค์ง€ ์ž„ํฌํŠธ

2) JDBC ๋“œ๋ผ์ด๋ฒ„ ๋กœ๋”ฉ

  • Class.forName(..) -> ojdbc11.jar
    oracle.jdbc.driver.OracleDriver
    • ๋™์ ๋กœ๋”ฉ

3) ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ ‘์†์„ ์œ„ํ•œ Connection๊ฐ์ฒด ์ƒ์„ฑ
DriverManager : ์ ‘์†์„ ํ• ๋•Œ๋งˆ๋‹ค Connection ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑ -> ํšจ์œจ์„ฑX, ์„ฑ๋Šฅ X
ย ย ย  Connection getConnection()
ย ย ย  Connection getConnection(String url, String user, String password)

  • url: jdbc:oracle:this:@localhost:1521:XE

DataSource ์ธํ„ฐํŽ˜์ด์Šค: ์ปค๋„ฅ์…˜ ํ’€์„ ์ œ๊ณตํ•˜๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๊ตฌํ˜„์ฒด๊ฐ€ ์žˆ๋‹ค.
ย ย ย ย ย ย ย (Tomcat JDBC, HikariCP)
Connection getConnection() - Connection๊ฐ์ฒด๊ฐ€ ๋ฐ˜ํ™˜๊ฐ’

4) ์ฟผ๋ฆฌ๋ฌธ์„ ์‹คํ–‰ํ•˜๊ธฐ ์œ„ํ•œ
๐ŸŒผ
Statement/PreparedStatement/CallableStatement ๊ฐ์ฒด ์ƒ์„ฑ

5) ์ฟผ๋ฆฌ ์‹คํ–‰

6) ์ฟผ๋ฆฌ ์‹คํ–‰ ๊ฒฐ๊ณผ ๊ฐ’(int, ResultSet) ์‚ฌ์šฉ

7) ์‚ฌ์šฉ๋œ ๊ฐ์ฒด(ResultSet, Statement/PreparedStatement/CallableStatement, Connection) ์ข…๋ฃŒ

JDBC ๋“œ๋ผ์ด๋ฒ„ ๋กœ๋”ฉ ๋ฐ DBMS ์ ‘์†

1) JDBC ๋“œ๋ผ์ด๋ฒ„ ๋กœ๋”ฉํ•˜๊ธฐ

๐Ÿ”ผ๋“œ๋ผ์ด๋ฒ„ ๋กœ๋”ฉ

2) Connection ๊ฐ์ฒด ์ƒ์„ฑํ•˜๊ธฐ

3) ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์—ฐ๊ฒฐ ๋‹ซ๊ธฐ

Connection ์ธํ„ฐํŽ˜์ด์Šค์—๋Š” ์—ฐ๊ฒฐ ์ข…๋ฃŒ๋ฅผ ์œ„ํ•œ AutoCloseable์„ ์ƒ์†๋ฐ›๊ณ ์žˆ๋‹ค.
์ž์› ์ž๋™ํ•ด์ œ์˜ ๊ธฐ์ค€์— ๋ถ€ํ•ฉํ•˜๋‹ค.
try with resource๋ฌธ -> ์ž์› ์ž๋™ํ•ด์ œ

๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ฟผ๋ฆฌ ์‹คํ–‰

1. Statement ๊ฐ์ฒด๋กœ ๋ฐ์ดํ„ฐ ์ ‘๊ทผํ•˜๊ธฐ

Connection
ย ย ย Statement createStatement();

1) ๐Ÿ”–ResultSet executeQuery(String sql)

  • ์กฐํšŒ๋ฅผ ํ•˜๋Š” ์ฟผ๋ฆฌ ์ˆ˜ํ–‰
    • SELECT(์กฐํšŒ)
  • ๋ฐ˜ํ™˜๊ฐ’: ResultSet -> ์กฐํšŒํ•œ ๋ ˆ์ฝ”๋“œ์˜ ์กฐํšŒ ์‹œ์ž‘ ์ฃผ์†Œ๊ฐ’, ์ปค์„œ์ด๋™ ๋‹ค์Œํ–‰์„ ์กฐํšŒ

2) ๐Ÿ”–int executeUpdate(String sql)

  • ๋ณ€๊ฒฝ์„ ๊ฐ€ํ•˜๋Š” ์ฟผ๋ฆฌ ์ˆ˜ํ–‰
    • INSERT, UPDATE, DELETE( ์ถ”๊ฐ€, ์ˆ˜์ •, ์‚ญ์ œ)
  • ๋ฐ˜ํ™˜๊ฐ’: ๋ฐ˜์˜๋œ ๋ ˆ์ฝ”๋“œ ๊ฐœ์ˆ˜

db์— ์—…๋กœ๋“œ ์ž˜ ๋˜์—ˆ๋‹น

3) close()


๐Ÿ’ป์ „์ฒด test ์ฝ”๋“œ

package exam01;

import org.junit.jupiter.api.Test;

import java.sql.*;
import java.time.LocalDateTime;

public class Ex01 {
    @Test
    void test1(){
        try{
            Class.forName("oracle.jdbc.driver.OracleDriver");
        }catch (ClassNotFoundException e){
            e.printStackTrace();
        }

        String url = "jdbc:oracle:thin:@localhost:1521:XE";//๊ฐ™์€ ์œ„์น˜์— ์žˆ์œผ๋ฉด localhost
        //ํ˜„์žฌ ๊ฐ™์€ ์„œ๋ฒ„์— ์กด์žฌํ•˜๋‹ˆ๊นŒ localhost, ๊ธฐ๋ณธํฌํŠธ 1521, ์—ฐ์Šต์šฉ ๊ณ„์ • ์‚ฌ์šฉ์‹œ EE
        //๋‹ค๋ฅธ ์„œ๋ฒ„์— ์žˆ์œผ๋ฉด ip์ฃผ์†Œ๋‚˜ ๋„๋ฉ”์ธ ์ฃผ์†Œ ์ž…๋ ฅ ex)3.100.2.111

        String user = "STUDY";
        //์—ฐ์Šต์šฉ ๊ณ„์ •์€ SCOTT
        String password = "oracle"; // SCOTT์€ tiger

//        try{
//            Connection conn = DriverManager.getConnection(url, user, password);
//            //db์— ์—ฐ๊ฒฐํ•  ์ˆ˜ ์žˆ๋Š” ํ•ต์‹ฌ์ ์ธ ๋ฉ”์„œ๋“œ์ด๋‹ค.
//            System.out.println(conn);//์ ‘์†ํ™•์ธ
//        }catch (SQLException e){
//            e.printStackTrace();
//        }
        try(Connection conn = DriverManager.getConnection(url, user, password);
            Statement stmt = conn.createStatement()){//Statement ๊ฐ์ฒด๋กœ sql๋ฌธ ์‹คํ–‰ ํ• ์ˆ˜์žˆ๋‹ค.

            String sql = "INSERT INTO MEMBER (USER_NO, USER_ID, USER_PW, USER_NM, MOBILE) VALUES (SEQ_MEMBER.NEXTVAL, 'USER01', '123456', '์‚ฌ์šฉ์ž01', '01000000000')";

            int cnt = stmt.executeUpdate(sql);
            System.out.println(cnt);

        }catch (SQLException e){
            e.printStackTrace();
        }



    }

    @Test
    void test2(){
        try {
            // ์˜ค๋ผํด ๋“œ๋ผ์ด๋ฒ„ ๋™์  ๋กœ๋”ฉ
            Class.forName("oracle.jdbc.driver.OracleDriver");
        }catch (ClassNotFoundException e){
            e.printStackTrace();
        }

        String url = "jdbc:oracle:thin:@localhost:1521:XE";
        String user = "STUDY";
        String password = "oracle";

        try(Connection conn = DriverManager.getConnection(url, user, password);
            Statement stmt = conn.createStatement()) {
            String keyword = "์‚ฌ์šฉ์ž";
            //ํ‚ค์›Œ๋“œ๊ฐ€ ํฌํ•จ๋˜์—ˆ๋Š”์ง€ ์•ˆ๋˜์—ˆ๋Š”์ง€๋กœ ํŒ๋‹จ
            String sql = "SELECT * FROM MEMBER WHERE USER_NM LIKE '%"+keyword+"%'";
            //String sql = "SELECT * FROM MEMBER";
            ResultSet rs = stmt.executeQuery(sql);
            //์กฐํšŒ ๊ฒฐ๊ณผ ์—ฌ๊ธฐ์„œ ํ•œํ–‰์”ฉ ์ฐพ์•„์„œ ๊ฐ€์ ธ์˜ด
            while (rs.next()){
                long userNo = rs.getLong("USER_NO"); //์ปฌ๋Ÿผ๋ช… ์ง์ ‘ ๋ช…์‹œํ•ด์•ผ ์ˆœ์„œ๊ฐ€ ๋ฐ”๋€Œ์–ด๋„ ๋ฌธ์ œ๊ฐ€ ์—†๊ฒŒ ๋œ๋‹ค.
                String userId = rs.getString("USER_ID");
                String userPw = rs.getString("USER_PW");
                String userNm = rs.getString("USER_NM");
                String mobile = rs.getString("MOBILE");
                //๋‚ ์งœ์™€ ์‹œ๊ฐ„ ๊ฐ€์ ธ์˜ค๊ธฐ
                LocalDateTime regDt = rs.getTimestamp("REG_DT").toLocalDateTime();
                System.out.printf("USER_NO: %d, USER_ID: %s, USER_PW: %s, USER_NM: %s, MOBILE: %s%n, REG_DT: %s%n", userNo, userId, userPw, userNm, mobile, regDt);
            }
            rs.close();
        }catch (SQLException e){
            e.printStackTrace();
        }
    }
}

๋ณด์•ˆ์ ์ธ ์ธก๋ฉด์ด๋‚˜ ์„ฑ๋Šฅ์„ ๋”ฐ์กŒ์„๋•Œ PreparedStatement ์‚ฌ์šฉํ•˜๋Š”๊ฒƒ์ด ๋” ์ข‹๋‹ค!


2. ๐ŸŒŸPreparedStatement ๊ฐ์ฒด๋กœ ๋ฐ์ดํ„ฐ ์ ‘๊ทผํ•˜๊ธฐ

  • statement ๋Œ€์‹ ์“ฐ๊ธฐ
  • ์•…์˜์ ์ธ๊ฑฐ ๊ฑธ๋Ÿฌ์คŒ,,

1) ๋™์ ์ธ ์ฟผ๋ฆฌ์— ์‚ฌ์šฉ

2) ํ•˜๋‚˜์˜ ๊ฐ์ฒด๋กœ ์—ฌ๋Ÿฌ ๋ฒˆ์˜ ์ฟผ๋ฆฌ๋ฅผ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ๋™์ผํ•œ ์ฟผ๋ฆฌ๋ฌธ์„ ํŠน์ • ๊ฐ’๋งŒ ๋ฐ”๊พธ์–ด์„œ ์—ฌ๋Ÿฌ ๋ฒˆ ์‹คํ–‰ํ•ด์•ผ ํ•  ๋•Œ, ๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ ๋งŽ์•„์„œ ์ฟผ๋ฆฌ๋ฌธ์„ ์ •๋ฆฌํ•ด์•ผ ํ•  ๋•Œ ์œ ์šฉ

  • ๊ฐ’์„ ? ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ๋ฏธ๋ฆฌ ์ •์˜, ๊ฐ’์„ set์ž๋กœํ˜• ๋ฉ”์„œ๋“œ๋กœ ์ง€์ •
  • SQL์ฃผ์ž…(Injection)์„ ๋ฐฉ์ง€

Connection
ย ย ย PreparedStatement prepareStatement(String sql);

  • ๊ฐ’์ด ํ• ๋‹น๋  ๋ถ€๋ถ„์€ SQL์— ?๋กœ ๊ธฐ์ž…

set ์ž๋ฃŒํ˜•(int ?์˜ ์œ„์น˜๋ฒˆํ˜ธ, ๊ฐ’);

๐Ÿ”–ResultSet executeQuery() : SELECT
๐Ÿ”–int executeUpdate(): INSERT, UPDATE, DELETE
-> statement์™€ ์ฐจ์ด์ ์€ ๋งค๊ฐœ๋ณ€์ˆ˜์— sql์— ๋“ค์–ด๊ฐ€์ง€์•Š๋Š”๋‹ค. prepareStatement(String sql)์—์„œ ๋ฏธ๋ฆฌ ์ค€๋น„ํ•˜๊ธฐ๋•Œ๋ฌธ

package exam01;

import org.junit.jupiter.api.BeforeAll;
import org.junit.jupiter.api.Test;

import java.sql.*;
import java.time.LocalDateTime;

public class Ex02 {

    private String url = "jdbc:oracle:thin:@localhost:1521:XE";
    private String user = "STUDY";
    private String password = "oracle";

    @BeforeAll //๋ชจ๋“  ํ…Œ์ŠคํŠธ ๋ฉ”์„œ๋“œ ํ˜ธ์ถœ ์ „์— ๋‹จ ํ•œ๋ฒˆ์‹คํ–‰ - ๊ณตํ†ต ์ดˆ๊ธฐํ™”
    static void init(){ //๊ณตํ†ต ์ดˆ๊ธฐํ™” ํ•œ๋ฒˆ ์‹คํ–‰
        try {
            Class.forName("oracle.jdbc.driver.OracleDriver");
        }catch (ClassNotFoundException e){
            e.printStackTrace();
        }
    }
    @Test
    void test1(){

        String keyword = "์‚ฌ์šฉ์ž";
        String sql = "SELECT * FROM MEMBER WHERE USER_NM LIKE ?"; //๋ณ€์ˆ˜๊ฐ€ ๊ต์ฒด ๋  ๋ถ€๋ถ„์€ ?๋กœ ์ž‘์„ฑ
        // ๋‚ด๋ถ€์ ์œผ๋กœ ๋ณด์•ˆ์ ์œผ๋กœ ์ทจ์•ฝํ•œ ๋ถ€๋ถ„์€ ์ œ์™ธํ•˜๊ณ  ๊ฐ’์„ ๋„ฃ์–ด์คŒ

        //์กฐํšŒ
        try(Connection conn = DriverManager.getConnection(url,user,password);
            PreparedStatement pstmt = conn.prepareStatement(sql)){

            //๋ฌผ์Œํ‘œ์˜ ์œ„์น˜๋Š” 1๊ฐœ๋ฐ–์— ์—†๋‹ค ํ˜„์žฌ๋Š” ํ•˜๋‚˜๋ฐ–์—์—†์œผ๋‹ˆ...
            pstmt.setString(1,"%"+keyword+"%");
            
            // ํ•œ์นธ์”ฉ ์ปค์„œ์ด๋™ํ•˜๋ฉด์„œ ๋ฐ์ดํ„ฐ ์กฐํšŒ
            ResultSet rs = pstmt.executeQuery();
            while (rs.next()){
                long userNo = rs.getLong("USER_NO"); 
                String userId = rs.getString("USER_ID");
                String userPw = rs.getString("USER_PW");
                String userNm = rs.getString("USER_NM");
                String mobile = rs.getString("MOBILE");

                LocalDateTime regDt = rs.getTimestamp("REG_DT").toLocalDateTime();
                System.out.printf("USER_NO: %d, USER_ID: %s, USER_PW: %s, USER_NM: %s, MOBILE: %s%n, REG_DT: %s%n", userNo, userId, userPw, userNm, mobile, regDt);
            }
            rs.close();
        }catch (SQLException e){
            e.printStackTrace();
        }

    }
}



Connection
ย ย ย PreparedStatement prepareStatement(String sql, String[] columnNames);
-> columnsNames: ์ฆ๊ฐ๋ฒˆํ˜ธ ๊ธฐ๋ณธํ‚ค๋ฅผ ๋ช…์‹œ
ResultSet getGeneratedKeys()๋ฅผ ํ†ตํ•ด์„œ ๊ธฐ๋ณธํ‚ค ์กฐํšŒ

์‚ฌ์šฉ์ž 04

#STUDY ์Šคํฌ๋ฆฝํŠธ
CREATE OR REPLACE PROCEDURE REGISTER_MEMBER(
	P_USER_ID VARCHAR2,
	P_USER_PW VARCHAR2,
	P_USER_NM VARCHAR2,
	P_MOBILE VARCHAR2
)
IS
BEGIN
	INSERT INTO MEMBER (USER_NO, USER_ID, USER_PW, USER_NM,MOBILE)
		VALUES(SEQ_MEMBER.NEXTVAL, P_USER_ID, P_USER_PW,P_USER_NM, P_MOBILE);
END REGISTER_MEMBER;


SELECT * FROM USER_ERRORS;

CallableStatement

  • ํ”„๋กœ์‹œ์ € ํ˜ธ์ถœ์šฉ

3. CallableStatement ๊ฐ์ฒด๋กœ ๋ฐ์ดํ„ฐ ์ ‘๊ทผํ•˜๊ธฐ

1) ํ”„๋กœ์‹œ์ € ์‹คํ–‰์‹œ ์‚ฌ์šฉ

  1. ์ฟผ๋ฆฌ๋ฌธ ์‹คํ–‰ ๊ฒฐ๊ณผ ๊ฐ’ ๊ฐ€์ ธ์˜ค๊ธฐ
    1) ResultSet ๊ฐ์ฒด์˜ ๋ฉ”์„œ๋“œ

boolean next(): ๋‹ค์Œ ํ–‰์œผ๋กœ ์ด๋™, ๋‹ค์Œ ํ–‰์ด ์žˆ์œผ๋ฉด true, ์—†์œผ๋ฉด false

์ž๋ฃŒํ˜• get์ž๋ฃŒํ˜•(int ์ปฌ๋Ÿผ ์ˆœ์„œ๋ฒˆํ˜ธ);

์ž๋ฃŒํ˜• get์ž๋ฃŒํ˜•(String ์ปฌ๋Ÿผ๋ช…);

String getString(): ๋ฌธ์žํ˜• ๋ฐ์ดํ„ฐ(CHAR, VARCHAR2, CLOB..)
int getInt() long getLong(): ์ •์ˆ˜ํ˜• ๋ฐ์ดํ„ฐ
float getFloat() double getDouble(): ์‹ค์ˆ˜ํ˜• ๋ฐ์ดํ„ฐ

java.sql.Time: ์‹œ๊ฐ„ - getTime()
java.sql.Date: ๋‚ ์งœ - getDate()
java.sql.Timestamp: ๋‚ ์งœ + ์‹œ๊ฐ„ - getTimestamp()

๊ฐ€๊ณตํ•˜๊ธฐ ํŽธํ•œ java TimeํŒจํ‚ค์ง€ ์ด์šฉ

๐Ÿ”ฝtest2 ์‹คํ–‰๊ฒฐ๊ณผ


๐Ÿ”ธ๊ฒ€์ƒ‰ ๊ธฐ๋Šฅ ์ถ”๊ฐ€

test2์‹คํ–‰์‹œ ์‚ฌ์šฉ์ž01 ์กฐํšŒ ์„ฑ๊ณต


์ปค๋„ฅ์…˜ ํ’€

Tomcat JDBC
์˜์กด์„ฑ: tomcat-jdbc

gracle(short) ์˜์กด์„ฑ ์ถ”๊ฐ€

dependencies {
    runtimeOnly 'com.oracle.database.jdbc:ojdbc11:23.4.0.24.05'
    implementation 'com.oracle.database.nls:orai18n:23.4.0.24.05'
    compileOnly 'org.projectlombok:lombok:1.18.32'
    annotationProcessor 'org.projectlombok:lombok:1.18.32'
    implementation 'org.apache.tomcat:tomcat-jdbc:10.1.24'
    testImplementation platform('org.junit:junit-bom:5.10.0')
    testImplementation 'org.junit.jupiter:junit-jupiter'
}


HikariCP

Gradle short ์˜์กด์„ฑ ์ถ”๊ฐ€

profile
๊ฝ๊ฝ ์–ผ์–ด๋ถ™์€ ํ•œ๊ฐ• ์œ„๋กœ ๐Ÿ˜บ

0๊ฐœ์˜ ๋Œ“๊ธ€