Untitled_Blue

[JAVA] JAVA + DB = JDBC 본문

Programming Language/JAVA

[JAVA] JAVA + DB = JDBC

Untitled_Blue 2023. 6. 18. 21:23
반응형

안녕하세요. 이번 글은 JDBC에 대한 설명입니다.

- JDBC란?

  • Java DataBase Connectivity의 약자이며 자바를 데이터베이스에 연결할 수 있도록 도와주는 라이브러리이다.
  • JAVA에서 SQL 쿼리 문법을 실행함으로써 데이터베이스 내 자료를 관리하기 위한 API

JDBC의 전체적인 구조는 상단의 이미지와 같다. 자바와 데이터베이스 사이에 JDBC가 있는데 이를 통해 자바에서 데이터베이스를 다룰 수 있다.

- JAVA와 DB를 연결하는 과정

  • 필자는 IntelliJ IDEA Ultimate 2023.01 + JAVA 17 + Oracle SQL Developer (19.3.0 버전)을 사용하고 있으며 세팅 또한 이를 기준으로 하겠다.

https://www.oracle.com/kr/database/technologies/appdev/jdbc-downloads.html

 

JDBC and UCP Downloads page | Oracle 대한민국

죄송합니다. 검색 내용과 일치하는 항목을 찾지 못했습니다. 원하시는 정보를 찾는 데 도움이 되도록 다음을 시도해 보십시오. 검색에 사용하신 키워드의 철자가 올바른지 확인하십시오. 입력

www.oracle.com

먼저 사용하는 DBMS에 맞는 JDBC 드라이버를 다운받아야 한다. 오라클을 사용하는 사람들은 상단 링크를 방문해서 다운받으면 된다. 다운로드 받으면 파일 확장자가 .jar일 것이다. 이때 파일이 여러 버전으로 준비되어 있는 것을 확인할 수 있는데 본인이 사용하는 JAVA와 SQL 버전에 맞는 것으로 사용해야 한다. (cmd 실행 : 윈도우 + R 클릭 후 cmd 입력)

  • JAVA 버전 확인 : cmd 창에서 java -version 입력 후 확인
  • DBMS 버전 확인 : cmd 창에서 sqlplus를 통해 로그인 후 select * from V$VERSION; 입력 후 확인

다운받았으면 인텔리제이에 접속한 후 한국어 기준으로 파일 -> 프로젝트 구조를 클릭한다.

이후 좌측에 있는 프로젝트 설정 내 라이브러리를 클릭한 후 바로 옆쪽의 상단에 있는 + 버튼을 클릭한다. 그러면 라이브러리 파일 선택하라는 창이 나올 것이다. 여기서 다운받은 JDBC 드라이버 파일을 선택한 후 확인 버튼을 클릭한다.

확인 버튼을 누르고 다시 확인해보면 다음과 같이 드라이버 파일이 정상적으로 반영되었음을 확인할 수 있다. 이후 확인 버튼을 누름으로써 JDBC 환경 설정이 모두 끝난다.

- 클래스와 인터페이스의 상관구조

JDBC는 DriverManager를 시작으로 진행된다. 먼저 DriverManager 클래스는 드라이버를 로드하는 역할을 담당한다. 안에 getConnection()을 사용해서 드라이버와 연결할 데이터베이스의 정보를 Connection 클래스의 객체에 전달한다. 이후 객체를 바탕으로 Statement, PreparedStatement, CallableStatement를 sql문과 함께 사용해서 쿼리문을 읽고 실행한다.

읽은 데이터를 객체에 다시 저장하고 ResultSet의 객체를 통해 데이터를 읽을 수 있다.

 

+ sql에 관련된 클래스 및 인터페이스에 대한 설명

  • DriverManager : JDBC 드라이버를 관리하며 연결 정보를 통해 Connection 객체를 반환 형식으로 생성
  • Connection : 인터페이스이며 DriverManager을 통해 연결 정보를 받아오면서 SQL문을 실행하기 위한 필수 도구 담당
  • Statement : DDL, DML을 실행할 때 사용되며 세부적으로 3개의 서브 클래스가 있다.
  • ResultSet : Statement의 객체를 통해 작동되며 데이터를 읽을 때 사용

+ Statement의 종류

  • Statement : 쿼리문 실행 시 사용되며 Statement 중 가장 기본이 되고 있다.
  • PreparedStatement : 쿼리문 실행 시 사용되며 Statement에 비해 편의성과 보안성이 좋다. (추천)
  • CallableStatement : 데이터베이스 내 함수와 프로시저 호출할 때 사용

- JAVA에서 DB 테이블 조회하기

package classes;

import java.sql.*;

public class JDBC_Practice {
    public static void main (String[] args) throws ClassNotFoundException, SQLException {
        System.out.println("This is JDBC with Oracle :)");

        Class.forName("oracle.jdbc.driver.OracleDriver");

        Connection conn = DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:orcl", "hr", "hr");

        String sql = "SELECT * FROM DEPARTMENTS";
        PreparedStatement pstmt = conn.prepareStatement(sql);
        ResultSet rs = pstmt.executeQuery();
        System.out.println("success");

        while(rs.next()) {
            System.out.println(rs.getString(1)+ " " + rs.getString(2)+ " " + rs.getString(3) + " " + rs.getString(4));
        }

        rs.close();
        pstmt.close();
        conn.close();
    }
}

밑에 더 있지만 너무 길어서 생략했다.

상단의 소스코드를 통해 JDBC를 통해 데이터베이스 내 테이블의 데이터를 출력할 수 있다. 소스코드 안에는 여러 가지의 과정이 들어있는데 지금부터 이들을 하나하나 분석할 것이다.

1) 드라이버를 메모리에 적재하고 DB 연결

// JDBC 드라이버를 메모리에 로딩
Class.forName("oracle.jdbc.driver.OracleDriver");

// 드라이버를 통한 데이터베이스 서버와 연결
Connection conn = DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:orcl", "hr", "hr");
  • Class.forName(String className) : JDBC 드라이버를 메모리에 적재하기 위한 클래스의 메서드
  • DriverManager.getConnection(String url, String user, String pw) : JDBC 드라이버를 관리하기 위한 집합인 DriverManager의 메서드이며 데이터베이스에 대한 연결을 시도하는 메서드 (정적인 Connection 클래스 형식으로 반환되며 이를 Connection의 객체에 별도로 저장해둔다.)

이때 url의 뒷부분인 orcl은 DB명을 의미하는데 이는 어떤 버전을 설치했냐에 따라 다를 수 있다. 이를 확인하는 방법은 cmd에서 sqlplus를 sysdba로 접속한 후 SELECT name FROM GV_$DATABASE; 실행하면 설치한 DBMS에 대한 url 주소를 확인할 수 있다. 그것이 url이 된다.

String sql = "SELECT * FROM DEPARTMENTS"; // SQL 쿼리문
PreparedStatement pstmt = conn.prepareStatement(sql); // 쿼리문을 실행하기 위해 PreparedStatement 사용
ResultSet rs = pstmt.executeQuery(); // 데이터를 읽기 위한 코드
  • conn.prepareStatement(String sql) : SQL 쿼리를 생성하며 반환된 결과를 가져오게 될 작업영역 제공
  • pstmt.executeQuery() : 데이터를 읽을 때 사용하며 반환형은 ResultSet에 대한 객체이다. Select 할 때 사용되며 나머지 DML 쿼리 작업은 executeUpdate()를 사용한다.
while(rs.next()) {
  System.out.println(rs.getString(1)+ " " + rs.getString(2)+ " " + rs.getString(3) + " " + rs.getString(4));
}

rs.close();
pstmt.close();
conn.close();

다음 코드에서 while 반복문 부분은 sql문에 대한 데이터가 저장된 객체를 기반으로 데이터베이스에 대한 결과를 보여주기 위한 구간이다. next() 메서드를 통해 다음 부분에 아무것도 없을 때까지 반복함으로써 객체에 대한 값을 모두 출력한다.

  • .close() : 객체에 대한 사용을 마치고 관련된 리소스를 모두 해지하는 메서드 

- 데이터 수정, 삭제, 추가 작업

package classes;

import java.sql.*;
import java.util.Scanner;

public class JDBC_Practice {
    public static void main (String[] args) throws ClassNotFoundException, SQLException {
        Class.forName("oracle.jdbc.driver.OracleDriver");
        Connection conn = DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:orcl", "scott", "scott");

        String sql = "select * from STUDENT_INFO";
        PreparedStatement pstmt = conn.prepareStatement(sql);
        ResultSet rs = pstmt.executeQuery();

        while (rs.next()) {
            System.out.println(rs.getString(1) + " " + rs.getString(2) + " " + rs.getString(3) + " " + rs.getString(4)
                    + " " + rs.getString(5));
        }

        Scanner sc = new Scanner(System.in);
        System.out.print("단과대학을 수정할 학생의 이름 >> ");
        String name = sc.nextLine();

        System.out.print("수정할 단과대학 입력 >> ");
        String collage = sc.nextLine();

        String sql02 = "update STUDENT_INFO set STU_COLLAGE=? where STU_NAME=?";

        PreparedStatement pstmt2 = conn.prepareStatement(sql02);
        pstmt2.setString(1, collage);
        pstmt2.setString(2, name);

        int cnt = pstmt2.executeUpdate();

        if (cnt != 0) {
            System.out.println("정상적으로 수정이 완료되었습니다 !");
        }
        else {
            System.out.println("수정 실패");
        }
    }
}

다음 코드는 데이터베이스 내의 데이터 일부를 수정하는 기능을 구현하고 있다. select할 때와 다르게 DML은 executeUpdate() 메서드를 사용한다. 이에 대한 반환값은 int 정수형이며 해당 숫자를 통해 정상적으로 쿼리문을 작동시킨 결과가 몇 개나 되는지를 보여준다. 또한 select할 때는 getString()을 사용하였으나 DML 문을 실행할때는 setString()을 사용한 점을 확인할 수 있다. setString()을 통해 SQL문에서 ?이 들어간 곳에 어떤 값이 들어갈 지를 지정할 수 있다.

좌측 : 하예진 학생의 소속 단과대학 수정 전 우측 : 하예진 학생의 소속 단과대학 수정 후

다음과 같이 JAVA에서 데이터를 수정할 수 있음을 확인할 수 있다. 여기서는 수정 작업만 진행하였지만 나머지 추가 및 삭제 작업도 SQL문과 setString() 메서드만 알맞게 수정하면 정상적으로 CRUD 작업을 진행할 수 있다.

 

감사합니다. 지금까지 JDBC에 대한 설명이었습니다 !

반응형