자바/JDBC

JDBC 공부 1편

parkhesse7 2025. 5. 21. 23:58
반응형

 

 

해당 내용을 구현해 보려면 JDBC에 대한 선수 지식이 필요하여

JDBC 개념에 대한 내용도 약 3편 정도로 나누어 진행해 볼 예정입니다.

 

해당 글은 MySQL을 기반으로 작성되었습니다.

 

JDBC란?

 

JDBC는 Java Database Connectivity로

직역하면 자바 데이터베이스 연결이다.

자바로 데이터 베이스를 연결할 수 있다는 거라고 생각했다.

 

그런데 데이터베이스를 누구는 oracle, 누구는 mysql, mariaDB, SQLServer등에 연결하고 싶다면 어떻게 할까?

 

JDBC 인터페이스 출처: 이것이 자바다 (한빛 미디어)

 

우리의 멋진 자바는 인터페이스를 만들어서 어떤 드라이버를 끼우냐에 따라 다른 DB와 통신할 수 있게 만들었다.

맞는 표현일진 모르겠지만 생각해 보면 우리 모두 c타입 충전기를 쓰지만, 충전이 되는 폰은 다 다르지 않은가?

 

JDBC 드라이버 이것이 자바다 (한빛 미디어)

 

JDBC 통신 이것이 자바다 (한빛 미디어)

 

JDBC Interface 규격에만 맞추고, 원하는 DBMS(Database Management System)를 연결하면 그

DBMS와 입출력이 가능하다.

 

 

 

 

이렇게 Class.forName 안에 매개변수로 원하는 드라이버를 등록하면, 우리의 멋진 자바는 

 

Connection conn = new com.mysql.cj.jdbc.ConnectionImpl(...);
PreparedStatement pstmt = new ClientPreparedStatement(...);

 

내부적으로 이런 MySQL 전용 객체들을 만들어준다.

 

JDBC 데이터베이스 연결

mysql workbench에서

CREATE DATABASE jdbc_ex;

데이터베이스 준비

 

CREATE USER 'scoula'@'%' IDENTIFIED BY '1234';
 GRANT ALL PRIVILEGES ON jdbc_ex.* TO 'scoula'@'%';
 FLUSH PRIVILEGES

사용자 준비를 해준다.

 

scoula라는 사용자 계정으로 % (어느 IP든) 접속하게 해준다.

비밀번호는 1234

 

scoula에게 거의 모든 권한을 부여한다. jdbc_ex 테이블 모든 것에 대해

 

인텔리제이 프로젝트 생성

프로젝트 생성

외부 라이브러리를 다운로드하기에는 Gradle이 편해서 Gradle을 Build system으로 선택했고,

도메인 특화 언어로 Groovy 선택 했다.

 

build.gradle 파일을 Groovy라는 언어로 작성을 한다고 보면 될 것 같다

 

 

Advanced Setting를 열어서 base pacakge를 Groud Id에 작성하고,

artifact에는 산출 물명을 쓴다.

 

외부 라이브러리 다운로드

 

build.gradle

    implementation 'com.mysql:mysql-connector-j:8.3.0'
    compileOnly 'org.projectlombok:lombok:1.18.30'
    annotationProcessor 'org.projectlombok:lombok:1.18.30'

    testCompileOnly 'org.projectlombok:lombok:1.18.30'
    testAnnotationProcessor 'org.projectlombok:lombok:1.18.30'

 

이후 mysql, lombok 라이브러리를 외부에서 다운로드해오는 코드를 작성하고 sync한다.

JUnit으로 test에서도 lombok을 쓸 거기 때문에 아래 두 개의 라이브러리도 설치했다.

 

프로젝트 설정에서 Annotation Processing도 활성화해준다.

 

 

DataSource

인텔리제이 상용 버전

 

이후 DataSource를 연결해 줘야 하는데 인텔리제이 상용 버전을 지원받고 있어서 편하게 작업할 수 있었다.

만약 무료 버전을 쓰고 있다면, workbench, debeaver나 DB Brower(플러그인)을 설치해서 써보면 좋을 것 같다.

 

MySQL을 누르고 target database를 연결해 준다.

 

비번은 1234를 넣으면 된다. Host에는 ip 주소인데 현재 내 컴퓨터에 깔려있기 때문에 localhost이다.

 

Database는 jdbc_ex로 되어있는데 use database jdbc_ex 쿼리와 같은 것이다.

언제든지 바꿀 수 있다.

 

이후 아래 Test Connection을 눌러 테스트해보고 ok 하자.

 

데이터 준비

 

Tx: Auto는

auto commit이 된다는 것을 의미한다.

쿼리문 실행 시 자동 commit이 되고 있다는 것을 인지하자.

 use jdbc_ex;

 CREATE TABLE USERS (
 ID VARCHAR(12) NOT NULL PRIMARY KEY,
 PASSWORD VARCHAR(12) NOT NULL,
 NAME VARCHAR(30) NOT NULL,
 ROLE VARCHAR(6) NOT NULL
 );
 
 INSERT INTO USERS(ID, PASSWORD, NAME, ROLE)
 VALUES('guest', 'guest123', '방문자', 'USER');
 
 INSERT INTO USERS(ID, PASSWORD, NAME, ROLE)
 VALUES('admin', 'admin123', '관리자', 'ADMIN');
 
 INSERT INTO USERS(ID, PASSWORD, NAME, ROLE)
 VALUES('member', 'member123', '일반회원', 'USER');
 
 SELECT * FROM USERS;

 

출처: 이것이 자바다 (개정판)

 

DriverManager가 MySQL과 Connection을 맺어주고,

query를 실행할 수 있는 Statement나 PreparedStatement로 진행을 한다.

 

Select 문은 쿼리 테이블을 반환하는 데 이것을 ResultSet으로 받아서 이터 레이터로 처리한다.

Update Insert Delete의 반환 값은 Integer이다.

 

출처: 이것이 자바다 (개정판)

 

 

데이터베이스 연결 테스트

package org.scoula.jdbc_ex.test;

import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Test;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;

public class ConnectionTest {

    @Test
    @DisplayName("jdbc_ex 데이터베이스에 접속한다.")
    public void testConnection() throws ClassNotFoundException, SQLException {
        Class.forName("com.mysql.cj.jdbc.Driver");
        String url = "jdbc:mysql://127/0/0/1:3306/jdbc_ex";
        String id = "scoula";
        String password = "1234";
        Connection conn = DriverManager.getConnection(url,id,password);
        System.out.println("DB 연결 성공");
        conn.close();
    }

}

 

DB 연결이 되는지 Test를 해보자.

 

Run tests using을 Gradle, IntelliJ IDEA 선택에 따라

결과가 다르게 출력되기도 한다.

 

보통 이런 연결 속성들은 바뀔 수가 있기 때문에

서버 ip, user 아이디 및 비밀번호 등을

properties 파일에서 따로 관리한다.

 

다음 시간에 같이 알아보자

반응형

'자바 > JDBC' 카테고리의 다른 글

JDBC 2편  (0) 2025.05.23