-> TransactionDriverControlImpl (물리적인 트랜잭션을 제어하기 위한 로컬 트랜잭션 드라이버 구현 객체) 를 얻은 후 구현 메서드인 commit()을 다시 호출한다.
-> TransactionDriverControlImpl 에서 JDBC Connection의 액세스 방법을 제공하는 JdbcResourceTransaction의 구현객체인 AbstractLogicalConnectionImplementor 의 commit()을 호출한다. (여기까지가 Hibernate ORM에서의 영역)
-> 물리적인 JDBC Connection을 통해 데이터베이스와 인터랙션하기 위해서 JDBC API의 구현체인 JdbcConnection 영역으로 이동한다.
-> (여기부터 JDBC API의 구현체인 H2의 영역) 데이터베이스에 commit 명령을 준비(prepareCommand)한 후, 명령을 실행(executeUpdate)한다.
-> Command 클래스에서 메서드 실행된다.
데이터베이스에 commit 명령을 전달하기 위해 commitIfNonTransactional 메서드 호출한다.
commitIfNonTransactional() 메서드 내부에서 auto commit 여부를 체크한 후
데이터베이스 세션에 해당하는 Session 객체를 통해 commit 명령을 수행한다.
만약에 commitIfNonTransactional() 수행 과정에서 예외가 발생하면 rollback을 수행한다.
다양한 벤더(Oracle, MS SQL, MySQL 등)의 데이터베이스와 연동할 수 있다.
etc..
Java 기반의 애플리케이션에서 사용하는 데이터 액세스 기술의 기본이 되는 저수준(low level) API 이다.
Spring에서는 JDBC API를 직접 사용하기 보다는 Spring Data JDBC, Spring Data JPA 같은 기술이 편리해서 더 많이 사용한다. (Spring Data JDBC나 Spring Data JPA가 더 편리해서 현업에서는 JDBC를 많이 쓰지 않지만 예전 기술로 만든 애플리케이션을 그대로 사용할 경우 Spring JDBC를 사용할 수도 있다.)
Spring Data JDBC나 Spring Data JPA 같은 기술도 내부적으로 JDBC를 이용하기 때문에 JDBC의 흐름정도는 알면 데이터 액세스 기술을 구현하는데 도움이 된다.
➤ JDBC의 동작 흐름
JDBC의 동작 흐름
▶️ JDBC 드라이버(JDBC Driver)
JDBC 드라이버는 Database와의 통신을 담당하는 인터페이스이다.
Oracle, MS SQL, MySQL 등에서 해당 벤더에 맞는 JDBC 드라이버를 구현해서 제공을 한다.
JDBC 드라이버 구현체를 이용해서 특정 벤더의 Database에 액세스 할 수 있다.
➤ JDBC API 사용 흐름
JDBC API 사용 흐름
1. JDBC 드라이버 로딩
사용하고자 하는 JDBC 드라이버를 로딩한다.
JDBC 드라이버는 DriverManager라는 클래스를 통해서 로딩된다.
2. Connection 객체 생성
JDBC 드라이버가 정상적으로 로딩되면 DriverManager를 통해 데이터베이스와 연결되는 세션(Session)인 Connection 객체를 생성한다.
3. Statement 객체 생성
Statement 객체는 작성된 SQL 쿼리문을 실행하기 위한 객체이다.
객체 생성 후에 정적인 SQL 쿼리 문자열을 입력으로 가진다.
4. Query 실행
생성된 Statement 객체를 이용하여 입력한 SQL 쿼리를 실행한다.
5. ResultSet 객체로부터 데이터 조회
실행된 SQL 쿼리문에 대한 결과 데이터 Set으로 부터 데이터를 조회한다.
6. ResultSet 객체 Close, Statement 객체 Close, Connection 객체 Close
JDBC API 를 통해 사용된 객체들은 사용이 끝나면 실행한 역순으로 차례대로 Close 해준다.
➤ Connection Pool 이란?
Connection Pool
데이터베이스와의 연결을 위한 Connection 객체를 생성하는 작업은 비용이 많이 드는 작업이다.