DecordRay

JDBC란? 본문

공부/웹

JDBC란?

DecordRay 2023. 3. 7. 16:23
728x90
반응형

1. JDBC(Java Database Connectivity) 개요

 

1. 1 JDBC(Java Database Connectivity) 개념

특정 DBMS와의 비종속적인 데이터베이스 연동 프로그램 개발을 위해 제공되는 자바 표준 API

-> 쉽게 말해 데이터베이스가 변경되어도 자바 프로그램을 수정할 필요가 없다는 것.


1.2 JDBC 구조 및 프로그램 절차

클래스 기능
DriverManager DBMS에서 제공하는 Driver를 관리한다.
DriverManger를 통해 Connection 객체를 얻을 수 있다.
Connection Connection은 특정 DBMS와 연결된 객체다.
Statement 작성된 SQL 명령어를 DBMS에 전달해주는 객체로서,
Connection으로부터 획득한다.
ResultSet SELECT 명령어의 실행 결과인 검색 결과가 저장되는 객체로서,
Statement의 executeQuery() 메소드를 통해 획득한다.

JDBC 프로그램

 

JDBC 프로그램 절차

JDBC 프로그램은

JDBC 드라이버 메모리에 로딩 -> Connection 획득 -> DB 연동 -> Connection을 해제 순으로 진행 된다. 

 

JDBC 드라이버 로드

JDBC 프로그램에서 가장 먼저 작성하는 코드가 JDBC Driver 로딩이다.

JDBC Driver를 메모리에 로딩하는 방법

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


DB Connection 연결

특정 DBMS로부터 Connection을 획득하기 위해서는 DriverManager 클래스의 getConnection() 메소드를 사용하는데 매개변수로 JDBC URL과 DBMS로부터 부여 받은 계정 정보가 필요.

Connection 연결 방법

try {

        String url = "jdbc:oracle:thin:@localhost:1521:xe";

        Connection conn = DriverManager.getConnection(url, "hr", "hr");

} catch (SQLException e){

         e.printStackTace();

}

 

여기서 "jdbc:oracle:thin:@localhost:1521:xe"를 해석해보자.

jdbc 프로토콜을 이용하여

oracle 이라는 DBMS

thin Driver를 통해

localhost 라는 서버

1521 번 포트

xe 라는 데이터베이스에 접속을 요청한다.

 

물론 위 url의 경우 oracle DBMS이기 때문에 저렇게 해석한 것이고,

다른 DBMS를 쓰면 url 규칙은 달라진다.

 

DBMS에 따른 JDBC URL 정보

Driver URL
JDBC-ODBC Bridge jdbc:odbc:[;=]
Oracle jdbc:oracle:thin:<userid>/<password>@<host>:<dbname>
MySQL jdbc:mysql://<hostname>:<port>/<dbname>
SyBase jdbc:sybase:Tds:<ip>:<port>
Informix jdbc:informix-sqli://<ip>:<port>/<dbname>:INFORMIXSERVER
Postgres jdbc:postgresql://<ip>:<port>/<dbname>

 


Statement 생성 및 실행

Statement 객체는 Connection의 createStatement() 메소드로부터 얻을 수 있으며, 

문자열 형태의 SQL 명령어를 DBMS에 전송하기 위한 다양한 메소드를 제공한다.

 

Statement 객체를 이용하여 INSERT 명령어를 DB에 전송하는 예제 코드의 일부를 확인해보자.

Statement stmt = conn.createStatement();

String sql = "insert into board(seq, title, writer, content) values(1, '첫 글', '홍길동', '안녕?')";

int count = stmt.executeUpdate(sql);

System.out.println(count + "건 등록 성공");

 

 

Statement를 이용하여 SQL 명령어를 DBMS에 전송하기 위해 사용하는 메소드

메소드 기능
executeQuery(String sql) SELECT 명령어를 전송하고 ResultSet 객체를 리턴한다.
executeUpdate(String sql) INSERT, UPDATE, DELETE 명령어를 전송한다.
execute(String sql) SELECT, INSERT, UPDATE, DELETE 명령어를 전송한다.
실행된 명령어가 SELECT면 true, INSERT, UPDATE, DELETE면 false를 리턴한다.

 

PreparedStatement 생성 및 실행

PreparedStatement - Statement보다 효율적이고 빠르게 SQL 명령어를 처리하기 위한 것

  • 동적인 SQL문을 실행할 수 있는 방법을 제공 -> 동일한 SQL문 반복 사용 시 Statement보다 유용

예시 코드 

String sql = "insert into board(seq, title, writer, content) values(?, ?, ?, ?)";
// values(?,?,?,?)로 미리 값들을 할당하였기 때문에 
// 기존 Statement를 사용할 때보다 sql 셋팅이 빠르다.

PreparedStatement stmt = conn.prepareStatement(sql)

stmt.setInt(1, 17);

stmt.setString(2, "열 일곱 번째 제목");

stmt.setString(3, "채규태");

stmt.setString(4, "두 번째 내용");

int count = stmt.executeUpdate();

System.out.println(count + "건 등록 성공");

 

즉, 실행 절차는 Connection -> PreparedStatement -> sql문 -> execute 순으로 이루어 진다.


결과값(ResultSet) 받기

ResultSet

  • 데이터 베이스에 JDBC Driver를 이용하여 SQL 수행을 요청하고 SQL 수행으로 얻어진 결과를 리턴받아 저장한다. 
  • SELECT SQL 문장의 경우 조회되는 테이블 결과가 리턴된다.
  • Statement 객체의 executeQuery() 메소드의 수행 결과로 생성할 수 있다.

PreparedStatement의 executeQuery() 메소드를 이용하여 ResultSet을 얻는 코드

PreparedStatement stmt = conn.prepareStatement("select * from board order by seq desc");
ResultSet rs = stmt.executeQuery();
while(rs.next()){	
    int seq = rs.getInt("SEQ");
    String title = rs.getString("TITLE");
    String writer = rs.getString("WRITER");
    String content = rs.getString("CONTENT");
    System.out.println(seq + "\t" + title + "\t" + writer + "\t" + content);
}

연결자원 해제

DBMS와 연결 후 필요한 작업을 모두 처리했다면 사용됐던 자원들은 모두 해제해야 한다.

why? - 한정된 자원인 Connection 객체는 반드시 해제해야 Connection 부족으로 인한 문제를 예방할 수 있다.

try {
// 생략
}finally{
    try{
        if(rs!=null) rs.close();
    } catch(Exception e){
        rs = null;
    }
    try{
    	if(stmt!=null) stmt.close();
    } catch(Exception e){
        stmt = null;
    }
    try{
    	if(conn!=null && !conn.isClose()) conn.close();
    } catch(Exception e){
        conn = null;
    }
}
728x90
반응형

'공부 > ' 카테고리의 다른 글

[웹]소프트웨어 아키텍처  (0) 2023.03.30
[웹]Web Server와 WAS의 차이  (0) 2023.03.20
Comments