[Database] JDBC - DriverManager, Connection (MySQL 접속)
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)를 사용함
- Connection.TRANSACTION_READ_UNCOMMITTED
- Connection.TRANSACTION_READ_COMMITTED
- Connection.TRANSACTION_REPEATABLE_READ
- Connection.TRANSACTION_SERIALIZABLE
close()
- 연결을 즉시 끊음.
- 실행중인 자원의 처리여부는 상관 없음
데이터엔지니어 조이(Joey) 강사님의 강의 요약