Computer Science/Database

[Database] JDBC - DriverManager, Connection (MySQL 접속)

pilgyeong 2023. 1. 13. 07:10

1. Driver Manager 개념

User와 Driver 사이의 인터페이스를 담당. Driver의 이용가능 여부, Database와 Driver사이의 Connection을 관리한다. Driver의 등록/해제, Connection의 연결/해제를 관리한다. Driver의 Register가 반드시 성공해야 DB와 상호작용을 할 수 있다.

 

1.1 Driver Manager로 MySQL 접속

과거에는 클래스 로딩을 위하여 'Class.forName()'으로 해당 클래스를 클래스 패스에서 찾아서 클래스 로더가 로딩할 수 있도록 했다. 이런 방식으로 클래스 로딩이 되어야 Driver Manager가 표준 인터페이스로 메소드를 호출할 때, 해당 JDBC 드라이버의 구현체로 연결될 수 있었다.

최신 버전에서는 Java SPI를 이용해서 자동으로 MySQL Driver 클래스를 표준 Driver 인터페이스에 등록할 수 있게 되었다. Connection url에 mysql 정보가 있고, mysql connector library가 클래스 패스에 있다면 get connection 단계에서 자동으로 찾아주는 편리함을 갖췄다.

 

1.2 Driver Manager로 Connection 연결

Connection con = DriverManager.getConnection(
					"jdbc:mysql://localhost:3306/de-jdbc", "root", null);

DB와의 모든 동작은 getConnection을 통해 JDBC Driver 클래스를 찾고, 연결까지 성공한 뒤에 할 수 있다.

 


 

2. Connection

  • Connection 객체 하나는 DB와 Java Client 사이의 하나의 물리적인 연결을 의미한다.
  • 이런 연결은 DB입장에서는 하나의 Session은 변경사항의 묶음을 관리하는 하나의 단위라고 이해하면 된다.
  • 해당 연결에서 사용할 Statement, PreparedStatement, and DatabaseMetaData 객체들을 얻어올 수 있다.

Connection 주요 메소드

Statement createStatement()

  • Statement 객체를 생성

PreparedStatement prepareStatement(String sql)

  • Parameterized된 sql과 함께 PreparedStatement 객체를 생성

DatabaseMetaDate getMetaData()

  • DB의 여러 메타정보를 제공하는 DatabaseMetaData 객체를 제공
  • DatabaseMetaData 객체를 통해 DB vendor가 명시하는 DB의 스펙이나 설명을 프로그래밍으로 얻을 수 있다.

 

Session이기 때문에 Session 단위에서 이뤄지는 동작을 메소드로 제공한다.

setAutoCommit(boolean status)

  • autocommit을 사용할지 여부
  • 기본값은 true
  • Auto Commit을 사용하면, executeXXX 종류의 함수를 실행하면 바로 commit이 발생해서 변경사항이 최종 테이블에 반영됨

commit()

  • 지금까지 해당 Connection(Session)에서 수행한 변경사항들을 Database의 원본 테이블에 반영함
  • commit이 성공하면 해당 connection(session)을 갖지 않은 client들도 해당 commit에 의해 변경된 데이터를 볼 수 있음

rollback()

  • 지금까지 해당 Connection에서 수행한 변경사항들을 Database의 원본 테이블에 반영하지 않고, 해당 Connection(session)에서 바라보는 상태도 원래대로 돌림

void setTransactionIsolation(int level)

  • transaction isolation level을 직접 지정할 수 있음
  • papameter는 int로 받도록 되어 있으나, Connection에 미리 정의된 상수(constant)를 사용함
    1. Connection.TRANSACTION_READ_UNCOMMITTED
    2. Connection.TRANSACTION_READ_COMMITTED
    3. Connection.TRANSACTION_REPEATABLE_READ
    4. Connection.TRANSACTION_SERIALIZABLE

close()

  • 연결을 즉시 끊음.
  • 실행중인 자원의 처리여부는 상관 없음

 

 


데이터엔지니어 조이(Joey) 강사님의 강의 요약