해당 내용을 구현해 보려면 JDBC에 대한 선수 지식이 필요하여
JDBC 개념에 대한 내용도 약 3편 정도로 나누어 진행해 볼 예정입니다.
해당 글은 MySQL을 기반으로 작성되었습니다.
JDBC란?
JDBC는 Java Database Connectivity로
직역하면 자바 데이터베이스 연결이다.
자바로 데이터 베이스를 연결할 수 있다는 거라고 생각했다.
그런데 데이터베이스를 누구는 oracle, 누구는 mysql, mariaDB, SQLServer등에 연결하고 싶다면 어떻게 할까?

우리의 멋진 자바는 인터페이스를 만들어서 어떤 드라이버를 끼우냐에 따라 다른 DB와 통신할 수 있게 만들었다.
맞는 표현일진 모르겠지만 생각해 보면 우리 모두 c타입 충전기를 쓰지만, 충전이 되는 폰은 다 다르지 않은가?


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 파일에서 따로 관리한다.
다음 시간에 같이 알아보자