본문 바로가기
교육, 학습/멀티캠퍼스_풀 스택

JDBC - JDBC개념, 구현(자바, MySQL연동)

by 개발하는 경제학도 2022. 1. 23.

강의 소개

현재 수강하고 있는 멀티캠퍼스 k-digital 지능형 웹서비스 풀 스택 과정을 수강하며 적은 내용입니다.


 

JDBC

 

JDBC(Java DataBase Connectivity)

데이터베이스에 연결 및 작업을 하기 위한 JAVA의 표준 인터페이스이다.

다시 말하자면, 자바 프로그램이 DBMS에 일관된 방식으로 접근할 수 있도록 API를 제공하는 자바 클래스들의 모임이다.

 

- 특징

OS 종류(= 플랫폼)에 독립적이다. DB 종류에도 독립적이다.

MySQL접속 시 'mysql - u 유저 이름 -p' 등 오라클 SQL 문법과 과 다르지만, JDBC는 이런 명령어가 달라도 상관없다. 따라서 독립적이다.

어떻게 모든 DB에 독립적일까?

 

JDBC 드라이버

DB별로 문법이 다르지만 자바에서 일관되게 처리해줄 수 있는 것은 '드라이버'덕분이다.

DB 종류는 많지만 자바에서 DB별로 다르게 처리해야 하면 손이 너무 많이 간다.

따라서 DB를 일관된 방식으로 자바 프로그램에서 쉽게 접근하기 위해서 JDBC를 통해 추상화된 인터페이스를 제공하며, DB종류(ex. 오라클 SQL, MySQL) 별로 각각의 드라이버가 지원된다.

MySQL용 driver는 MySQL에 맞는 기능으로 사용할 수 있게 미리 제공되어 있다. drvier는 SQL 회사에서 만들어서 제공해준다.

어떤 DB에 연결할 것인지 정해서 그것에 맞는 driver 로드한다.

이 드라이버는 DB에 연결해주고, SQL문을 대신 전달해주며, 자바 프로그램에 SQL문에 대한 결과를 전달해준다.

 

java.sql

java.sql 은 JDBC를 돕는다.

> 사용자가 지정한 DB와의 연결을 해준다. 또한, SQL문을 실행해주며, 결과를 connection의 내용으로 반환해준다.

 

 

JDBC 구현 순서

  1. DB 연결한다.
  2. SQL쿼리를 전송한다.(자바는 SQL문을 실행할 수 없다. 따라서 연결된 DB로 SQL문을 전송한다.)
  3. 그 결과를 반환하면 받아온다.
  4. DB와 연결을 해제한다.

2,3번을 반복하다가 더 전송하고 받아올 것이 없으면 종료된다.

 

 

JDBC 구현 코드

아래는 JDBC로 select문을 구현한 코드이다.

이를 실행하기 위해서는 먼저, 스키마(DB) 내의 테이블이 있어야 함에 유의한다.

따라서 아래 예제에서 book테이블을 만들어주고 조회한다.

 

[조회할 테이블 만드는 SQL]

// 테이블 생성. 어떤 DB에 생성할 것인지는 사용자 지정.
create table book(
    bookNo char(10) primary key,
    bookTitle varchar(30),
    bookAuthor varchar(20),
    bookYear int,
    bookPrice int,
    bookPublisher char(10)
);
​
// 조회할 값 넣기
insert into book values ('B001', '자바프로그래밍', '홍길동', 2021, 30000, '서울출판사');
insert into book values ('B002', '데이터베이스', '이몽룡', 2020, 25000, '멀티출판사');
insert into book values ('B003', 'HTML/CSS', '성춘향', 2021, 18000, '강남출판사'); 
​
// book테이블의 전체 내용 조회
select * from book;

 

[JDBC 구현]

book테이블을 자바에서 조회하는 예제이다.

- 구현 순서

1) Class.forName("드라이버")

2) Connection connection

3) Driver Manager

4) Statement = connection.createStatement();

 

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

public class SelectBook {

    public static void main(String[] args) {
        try {
            // JDBC 드라이버 로드.
            Class.forName("com.mysql.cj.jdbc.Driver");

            // DB 연결.
            Connection connection =
            DriverManager.getConnection("jdbc:mysql://"jdbc:mysql://127.0.0.1:3306/"접속할 DB", "MySQL아이디", "MySQL비밀번호");
            System.out.println("mysql db 연결 성공");

            /*SQL문*/
            String selectSQL = "select * from book";

            // conn에 SQL문 전송. 즉 DB로 전달.
            Statement statement = connection.createStatement();

            // 자바에서는 SQL의 조회결과를 ResultSet형태로 반환한다.
            // executeQuery메서드: select문을 실행하는 메서드.
            ResultSet resultset = statement.executeQuery(selectSQL);          

            int cnt = 0;
            // next메서드: 조회된 결과(ResultSet)에서 행을 이동하는 메서드이다.
            while(resultset.next()) {
                
            // getxx메서드: 조회된 결과(ResultSet)에서 컬럼의 값을 가져오는 메서드. get타입("컬럼명").
                String no = resultset.getString("bookNo");
                String title = resultset.getString("bookTitle");
                String author = resultset.getString("bookAuthor");
                String year = resultset.getString("bookYear");
                String price = resultset.getString("bookPrice");
                String publisher = resultset.getString("bookPublisher");
                System.out.println(no + "\t" + title + "\t"+ author 
                	+ "\t" + year + "\t" + price + "\t" + publisher);
                cnt += 1;
            }

            resultset.close();            
            statement.close();
            // DB사용후에는 반드시 연결을 끊어줘야 한다. 그렇지 않으면 다른 쪽에서 연결불가될 수 있다.
            connection.close();
            System.out.println("mysql 연결해제 성공");
        }

        // 예외처리.
        catch(ClassNotFoundException error) {
            System.out.println("mysql driver 미설치 또는 드라이버 이름 오류");
        }
        catch(SQLException error) {
            error.printStackTrace();  // sql문법오류 일수도, DB연결 오류일수도 있다. 따라서 원인파악 필요.
        }

    }
}

 

[조회 결과]

mysql db 연결 성공
B001    자바프로그래밍    홍길동    2021    30000    서울출판사
B002    데이터베이스    이몽룡    2020    25000    멀티출판사
B003    HTML/CSS    성춘향    2021    18000    강남출판사
mysql 연결해제 성공

이 결과는 DB 연결과 해제를 제외하고

MySQL 워크벤치에서 select * from book; 한 결과와 동일하다.

 

 

- 주의사항

SQL문에서 공백 주기, 문장 끝에 ;붙이지 않는다.(자동으로 드라이버가 붙여준다.)

워크 밴치 설정과 jdbc는 별개다.

JDBC에서는 insert, delete, update, select만 권장한다. create table, drop table 등 하면 복구가 어려워 가능은 하지만 비추천한다.

항상 사용한 뒤에는 DB 연결을 끊어줘야 한다.

 

 

Connection 인터페이스

DB와 연결을 담당한다.

특정 데이터 원본에 대한 커넥션은 Connection 인터페이스가 구현된 클래스의 객체로 표현된다.

SQL문을 실행시키기 전에 반드시 Connection 객체가 생성되어 있어야 한다.

DB에 전달할 SQL 문장을 정의하고 실행시킬 수 있는 Statement 객체를 생성할 때 Connection 객체를 사용한다.

 

 

Statement 인터페이스

SQL 구문을 실행하는 역할을 한다.

자바는 스스로는 SQL문 구문 해석이 안된다. 따라서 전달 역할을 한다.

SQL 관리 담당이며, 연결 정보를 담고 있지는 않다.

 

- executeUpdate메서드, executeQuery메서드

  1. executeUpdate메서드

insert, update, delete사용 시 SQL문을 실행해준다. 조회 결과를 int 타입으로 반환한다.

  • executeQuery메서드

select 사용시 실행해준다. 조회 결과를 테이블 구조인 ResultSet으로 리턴한다.

조회 결과는 행별로 읽어올 수 있는데 이때, next() 메서드로 행 이동한다. 이동했는데 행에 데이터가 없으면 flase/ 데이터 있으면 true가 반환된다.

만약 3개의 열이 있는 테이블이 조회 결과로 반환되었다면

while(rs.next()) {
int id = rs.getInt(1); // 1번컬럼에 가장 왼쪽에 있는 값 가져온다. 
// int id = rs.getInt("컬럼이름"); 도 동일하다.
rs.getString(2);  // 위와 마찬가지로 컬럼의 인덱스를 사용하든, 컬럼명을 쓰던 상관없다.
rs.getDouble(3); 
}

 

 

 

PreparedStatement 인터페이스

Statement 객체의 기능을 향상한 것이다.

동일 구문을 반복하는 코드인 경우 같은 구문은 2번 parsing 할 필요가 없다.

따라서 구문을 parsing 해둔다면 실행 속도가 훨씬 빨라진다.

같은 SQL문을 반복할 때는 매번 parsing 해야 하는 Statement보다 훨씬 효율적이다.

댓글