[Back-End] JDBC

SHINYEJI·2023년 9월 13일
0

Back-End

목록 보기
12/24

🚩 JDBC

Java DataBase Connectivity
자바를 사용해서 관계형 데이터베이스와 통신하기 위한 기술이다.
즉, 자바 프로그래밍 언어로 만들어진 클래스와 인터페이스로 이뤄진 API로써 SQL문을 실행할 수 있는 함수 호출 인터페이스다.

🤔 왜 JDBC는 인터페이스인가❓

JDBC의 자바의 코드를 수정하지 않고 또 다른 DBMS를 연결할 수 있도록 하는데 목적을 두고 있음으로 중재자로서 인터페이스를 제공해야 한다.

즉, JDBC가 자바와 DBMS 사이에서 중재역할(인터페이스 제공)을 하기 때문에 자바 입장에서는 어떤 DBMS를 사용하던지 상관하지 않고 JDBC가 정의한 인터페이스의 클래스만 사용하면 된다.

JDBC 특성

  • DBMS의 종류에 신경쓰지 않고 독립적인 자바 프로그래밍이 가능하다.
  • 데이터베이스가 달라지더라도 Driver 및 URL만 수정하면 동일한 API를 그대로 사용가능하다.
  • 자바가 가지는 플랫폼에 독립적이면서 DBMS에 독립적인 특성을 가진다.

JDBC 기능

  1. 데이터 베이스에 연결을 설정
  2. SQL문장을 DBMS에 전송
  3. SQL문장의 결과를 처리할 수 있게 해줌

JDBC Inteface

1. Driver

여기서 driver는 소프트웨어와와 소프트웨어간의 상호작용을 위해 기능을 제공하는 소프트웨어로,
Java Application과 DBMS간의 상호작용을 위한 기능을 제공하는 소프트웨어를 말한다.

Driver란❓
기존에 driver는 하드웨어와 운영체제 간의 상호작용을 위해 기능을 제공하는 소프트웨어를 말한다.

  • Driver은 DBMS 업체들이 구현해 놓은 인터페이스로 데이터베이스를 만든 업체에게 제공된다.

2. SQL pakage library

  • SQL package가 제공하는 라이브러리로 프로그래머가 DB 프로그램을 작성한다.

JDBC API : java.sql package

🟠Driver interface

  • 드라이버에 대한 정보를 가진다.
  • 모든 드라이버가 반드시 구현해야 하는 인터페이스이다.
  • 드라이버 버전 또는 연결에 대한 정보를 볼 수 있는 메소드가 있다.
    Driver 문서

🟠Connection interface

  • 데이터베이스에 대한 하나의 세션을 표현한다.
  • DriverManager 클래스의 getConnection()메소드를 사용해 세션을 얻어온다.
  • default로 setAutoCommit(true)로 설정된다.
  • 트랜젝션 관리를 직접하고 싶을 때는 setAutoCommit(false)로 설정하고 SQL문에 명시적으로 commit()을 호출해야 한다.

🟠Statement interface

  • SQL 문장을 실행하고 그 결과 값을 가져온다.

  • SQL 실행

  1. public ResultSet executeQuery(String sql) throws SQLException

    • Select문을 처리할 때 사용
    • 반환 값은 ResultSet 타입이다.
      • 결과를 처리하기 전에 ResultSet객체의 커서를 옮겨야 한다(next()메소드 사용)
  2. public int executeUpdate(String sql) throws SQLException

    • 주로 DML등의 SQL을 수행할 때 사용한다.
    • 반환 값은 쿼리가 적용된 행의 개수를 반환하며 쿼리가 적용된 행이 없다면 0을 반환한다.
  3. public boolean execute(String sql) throws SQLException

    • SQL문을 구분하지 않음
    • 결과가 ResultSet이면 true이고 그게 아니면 false를 return한다.

🟠PreparedStatement interface

  • 동일한 SQL문장이 여러번 반복적으로 수행될 때 사용하는 객체이다.
  • 대용량의 문자나 binary 타입의 데이터를 저장할 때 사용된다. (이미지 or 사운드 저장 하는 경우)
  • SQL문장이 미리 컴파일 되어 PreparedStatement 객체에 저장된다.
  • 여러번 반복 수행 시 clearParameters()메소드를 이요해 Statement에 남은 값을 초기화한다.
  • executeQuery(), executeUpdate()를 사용한다.

🟠CallableStatement interface

  • 실제 SQL문을 실행하는 것이 아니라
  • 연속되는 SQL문 데이터베이스에 저장하고 함수처럼 호출하는 Stored Procedures를 호출한다.
    • 데이터베이스에 Stored Procedures를 만들고 자바에서 호출한다.
  • 속도 향상을 기대할 수 있고, 자바 코드에 SQL문장이 들어가지 않아 자바코드가 SQL에 독립적이다.

🟠ResultSet interface

  • select 쿼리에 대한 결과값을 처리할 수 있다.
  • ResultSet 객체의 포인터는 첫번째 레코드의 이전을 가리킴으로 SQL 쿼리 결과를 처리하기 전에 반드시 next()메소드를 사용하여 레코드를 가리키게 해야한다.
  • 데이터 얻기
    • getString(column index or column name)
    • getInt(column index or column name)
    • getDouble(column index or column name)
    • getDate(column index or column name)

JDBC Programming

개발 순서
1. JDBC Driver Loading
2. DBMS와 연결 - DriverManager.Connection 생성
3. SQL 실행 준비 - Statement, PreparedStatement 생성
4. SQL Query 실행 - executeXXX()
5. SQL Query 결과 처리
6. DBMS 자원 반납

1. JDBC Driver Loading

  • 데이터베이스와 접속을 오픈하기 위해 애플리케이션의 JVM안으로 특정 드라이버 클래스를 적재한다.
  • Class.forName(Driver ClassName)
private static final String DRIVER = "com.mysql.cj.jdbc.Driver";  // MySQL Driver
Class.forName(DRIVER); // 드라이버 로딩

2. DBMS와 연결

  • DriverManager 클래스를 이용해 URL형태의 데이터베이스에 대한 접속을 요청
	private static final String URL = "jdbc:mysql://localhost:3306/whereismyhome?serverTimezone=UTC";
	private static final String DB_ID = "shinyeji";
	private static final String DB_PWD = "shinyeji";
    
    Connection conn = DriverManager.getConnection(URL, DB_ID, DB_PWD);

3. SQL 실행 준비

  • Statement 생성
    Statement stmt = conn.createStatement();
  • PreparedStatement 생성
    PreparedStatement pstmt = conn.prepareStatement(sql);

4. SQL Query 실행

  • Statement
    • DML
      int cnt = stmt.executeUpdate(sql);
    • Select
      ResultSet rs = stmt.executeQuery(sql);
  • PreparedStatement
    • sql문의 동적 값 설정
      pstmt.setXXX(index,value);
      String sql = "select * from user where id=? and name=?"
         // index : query문의 ?변수의 순서, value ?에 넣을 값
      pstmt.setInt(1,456); 
      pstmt.setString(2,'이정재');
    • DML
      int = pstmt.executeUpdate();
    • Select
      ResultSet rs = pstmt.executeQuery();

5. sql query 결과 처리

while(rs.next()){
	int id = rs.getInt(id);
    	// 데이터베이스의 컬럼이름 (or 컬럼 index)을 매개변수로 넣으면 해당하는 값을 반환받는다.
	String name = rs.getString(name);  
   }

6. DBMS 자원 반납

  • Connection은 상당한 overhead를 가져옴으로 최적화된 상태 유지를 위해 반드시 자원을 반납해야한다.
  • 생성한 순서의 역순으로 자원을 반납해야한다.
rs.close();
pstmt.close();
conn.close();

0개의 댓글