백엔드/JAVA

H2 데이터베이스 연결 (1)

두개의 문 2023. 5. 22. 23:22
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