JDBC를 사용한 H2 데이터베이스 연결
▷ JDBC ( Java Database Connectivity )
- 자바에서 데이터베이스에 접속할 수 있도록 하는 자바 API ( Application Programming Interface )
( API : 애플리케이션 소프트웨어를 빌드하고 통합하기 위한 정의 및 프로토콜 세트인 애플리케이션 프로그래밍 인터페이스를 의미 )
- JDBC는 데이터베이스에서 자료를 쿼리하거나 업데이트하는 방법을 제공
- JDBC 표준 인터페이스
❶ java.sql.Connection : 연결
❷ java.sql.Statement : SQL을 담은 내용
❸ java.sql.ResultSet : SQL 요청 응답
→ 데이터베이스를 연결하여 테이블 형태의 자료를 참조
SQL문을 질의, 결과 처리
- JDBC 드라이버 : 위 JDBC 인터페이스를 구현해서 라이브러리로 제공
즉, 데이터베이스 종류에 따라 드라이버가 각각 존재 → 알맞은 드라이버를 연결 후 사용하자
- JDBC를 사용하면 데이터베이스를 변경하더라도 JDBC 드라이버만 변경해주면 됨
개발자는 JDBC 표준 인터페이스 사용법만 학습하면 수많은 데이터베이스에 동일하게 적용 가능
▷ JDBC를 이용한 데이터베이스 연동과정
❶ JDBC_DRIVER, DB_URL, DB_USER, DB_PASS → 4개의 멤버변수를 상수로 선언
package db.model;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
public class H2ConnectionDemoApp {
// JDBC_DRIVER
static final String JDBC_DRIVER = "org.h2.Driver";
// DB_URL
static final String DB_URL =
"jdbc:h2:/Users/dahee/Desktop/app/database/h2/java2/:Users:dahee:;MODE=MariaDB;DATABASE_TO_UPPER=false";
// DB_USER
static final String USER = "";
// DB_PASS
static final String PASS = "";
• JDBC_DRIVER : 라이브러리 파일이름
• DB_URL : H2 데이터베이스에 연결할 JDBC 프로토콜
→ JDBC URL 복사해서 사용
❷ H2 데이터베이스와 상호작용하는 자바 라이브러리( JDBC )를 자바개발도구( 라이브러리 폴더 )에 등록
① 프로젝트의 src 폴더 아래 lib 폴더 생성
② 구글에서 "H2 maven repository" 검색 → 최신 버전 다운로드
③ 프로젝트에서 오른쪽 클릭 - [ Show In ] - [ System Explorer ] → lib 폴더에 다운로드한 jar 붙여넣기
④ 클래스 오른쪽 클릭 - [ Build Path ] - [ Configure Build Path... ] 클릭
[ Libraries ] - [ Modulepath ] - [ Add External JARs... ] 클릭
lib 폴더에 있는 h2-2.1.214.jar 클릭
[ Modulepath ] 아래 생성된 것 확인 후, [ Apply ] - [ Apply and Close ]
⑤ [ Refresh ] → lib 폴더에 h2-2.1.214.jar 확인
❸ Connection 객체 및 Statement 객체 선언
public static void main(String[] args) {
// Connection 객체
Connection conn = null;
// Statement 객체
Statement stmt = null;
}
- SQL 문장을 실행시키기 전에 우선 Connection 객체가 있어야 함
- Connection 객체 : 연결 객체로, 데이터베이스 서버에 접속을 시도하여 접속이 되면 데이터베이스와 연결상태를 관리
- Statement 객체 : exequteQuery( )메서드 호출 → SQL 질의를 실행시킬 수 있음
( 메서드의 인수로는 SQL 질의 문장을 담은 String 객체를 전달)
- 객체 변수를 로컬에 선언하면 보통 null ( 가르키는 주소없음 )로 초기화함
❹ 데이터 베이스 프로그래밍은 항상 에러에 대비 → try-catch-finally 이용
try {
// ① JDBC_DRIVER 연결 - JDBC_DRIVER 라이브러리가 있는가?
Class.forName(JDBC_DRIVER);
pl("JDBC 드라이버 로딩 성공");
// ② 데이터베이스 연결
pl("DB 서버로 연결중...");
conn = DriverManager.getConnection(DB_URL, USER, PASS);
pl("DB 서버에 접속 성공");
// ③ SQL을 위한 객체 생성
stmt = conn.createStatement();
// ④ SQL 쿼리 문자열 작성 → Statement 객체가 DB서버로 전달
String createSQL =
"DROP TABLE IF EXISTS member;" +
"CREATE TABLE member (" +
" id INTEGER NOT NULL, " +
" first VARCHAR(100), " +
" last VARCHAR(100), " +
" age INTEGER, " +
" PRIMARY KEY(id) " +
");";
// ⑤ SQL 질의 결과 반환
stmt.executeUpdate(createSQL);
// ⑥ 모두 사용했으면 종료시키기
stmt.close();
conn.close();
// ⑦ catch 블럭 → 발생 가능성 있는 예외에 대한 처리
} catch(SQLException se) {
// SQLException cannot be resolved to a type
// SQL예외가 나타나지 않았는데 적어놨다고 에러줄 뜬거니까 신경쓰지 않아도 됨
// 불필요한 예외 만들지 말라는 뜻
se.printStackTrace();
} catch(Exception ex) {
ex.printStackTrace();
// 예외 발생 당시 호출스택에 있는 메서드의 정보 출력 및 에러메시지 출력
} finally {
// ⑧ finally 블럭 → 혹시 처리되지 못한 부분 처리
try {
// ⑧-1. stmt가 제대로 종료되지 않았을 경우
if(stmt != null) {
stmt.close();
}
} catch(SQLException se) {
// 최종 열림을 닫기 위한 구역이므로
// SQLException 예외 처리 안해도 됨
se.printStackTrace();
}
try {
// ⑧-2. conn가 제대로 종료되지 않았을 경우
if(conn != null) {
conn.close();
}
} catch(SQLException se) {
se.printStackTrace();
}
}
}
① JDBC_DRIVER 로드
- Class.forName( ) 메서드를 호출하여 JDBC 드라이버가 있는 파일을 JVM method area에 로딩시킴
② 데이터베이스 연결
- JDBC 드라이버가 로딩되면, DriverManager 클래스에서 연결 관리함
- DriverManager 클래스의 static 메서드인 getConnection( ) 메서드 호출
→ H2에 연결하기 위한 커넥션 정보( url, user, password ) 입력함
→ getConnection( ) 메서드 수행 결과로 Connection 객체를 반환 ( 서버와 클라이언트를 연결해주는 역할 )
∴ 변수 conn에 Connection 객체의 주소가 저장됨
③ SQL을 위한 객체 생성
- Connection 객체가 제공하는 createStatement( ) 메서드를 이용해 DB 서버에 SQL 명령어를 전달하는 객체 생성
- conn.createStatement( ); → 에러 ( java.lang.NullPointerException )
- createStatement에 마우스 올려보기
④ SQL 쿼리 문자열 작성 → Statement 객체가 DB서버로 전달
⑤ SQL 질의 결과 반환
- Statement의 executeQuery( ) 메서드 → SELECT문 실행 시 이용 : 질의 결과로 테이블 형태의 결과 반환
- Statement의 executeUpdate( ) 메서드 → CREATE, DROP, INSERT, DELETE, UPDATE문 실행 시 이용 : 테이블의 내용 변경하는 문장에 사용
⑥ 모두 사용했으면 반드시 종료하기
⑦ catch 블럭 → 발생 가능성 있는 예외에 대한 처리하기
- printStackTrace( ) 메서드 : 예외 발생 당시, 호출스택에 있는 메서드에 대한 정보 및 에러 메시지 출력
⑧ finally 블럭 → 혹시 처리되지 못한 부분 처리
- stmt 및 conn이 제대로 종료되지 않았을 경우를 대비해 마지막에 다시 종료시키기
'백엔드 > JAVA' 카테고리의 다른 글
JDBC 드라이버 다운로드 및 등록 (0) | 2023.05.23 |
---|---|
H2 데이터베이스 연결 (2) (0) | 2023.05.22 |
👉🏻 에러의 종류 및 에러 처리 (0) | 2023.05.18 |
객체 지향 프로그래밍 이론(6) (0) | 2023.05.16 |
13일차 수업 기록 (0) | 2023.05.15 |