JDBC와 JDBC Driver Manager의 역할

Jay·2023년 8월 4일
0

애플리케이션 서버와 DB 서버가 통신하는 과정은 다음과 같다

① 데이터베이스 서버와 커넥션 연결 (주로 TCP/IP를 통해 연결한다)
② 데이터베이스 서버에 SQL 쿼리 전달
③ 데이터베이스 서버는 쿼리를 실행하고 애플리케이션 서버에 결과 전달

문제는 세상에 다양한 데이터베이스 서버가 있고, 데이터베이스마다 통신하는 방법이 다르다는 것이다. 그래서 데이터베이스를 변경하면 코드단까지 변경해야하고, 개발자는 새로운 데이터베이스 사용법을 학습해야한다. JDBC(Java Database Connectivity)는 이런 불편함을 해소해준다.

JDBC (Java Database Connectivity)

JDBC란 자바에서 데이터베이스에 접속할 수 있도록 하는 자바 API다. JDBC가 데이터베이스 접근 방법을 표준화해서 데이터베이스가 변경되더라도 코드단에는 영향을 주지 않는다. 개발자는 JDBC Interface에만 의존해서 코드를 작성하면 되기 때문이다. JDBC Interface의 구현체는 각 DB가 라이브러리로 제공하는데 이를 드라이버 라고 부른다. DB 드라이버 라이브러리를 추가하면 JDBC Driver Manager가 드라이버를 찾아 연결해준다. 따라서 개발자는 JDBC 표준 인터페이스에 의존해 코드를 작성하고, DB를 변경하려면 변경할 DB 드라이버만 추가하면 된다.

JDBC Drvier Manager

JDBC 드라이버 매니저는 라이브러리로 등록된 DB Driver를 관리하고, DB 커넥션을 획득하는 역할을 한다. DriverManager는 라이브러리에 등록된 드라이버 목록을 자동으로 인식하고, 이 드라이버들에게 순서대로 데이터베이스 접속 정보를 전달해 커넥션을 획득할 수 있는지 확인한다. 적잘한 드라이버를 찾아 커넥션 구현체를 클라이언트에 반환된다.

▪️ DriverManager에 커넥션 요청하는 코드
(현실에서 JDBC를 직접 사용하는건 복잡하기 때문에 JDBCTemplate, MyBatis, JPA 같은 쿼리를 편리하게 작성하기 위한 기술들을 주로 사용한다.)

Connection connection = DriverManager.getConnection(URL, USERNAME, PASSWORD);

▪️ Driver Manager에서 커넥션 반환하는 코드

// DriverManager.java

for (DriverInfo aDriver : registeredDrivers) {
    // If the caller does not have permission to load the driver then
    // skip it.
    if (isDriverAllowed(aDriver.driver, callerCL)) {
      try {
	      // 드라이버에 URL, DB 정보를 전달해 커넥션을 획득할 수 있는지 확인
          Connection con = aDriver.driver.connect(url, info);
          if (con != null) {
              // 드라이버가 connection을 리턴하면 connection 반환
              return (con);
          }
          // 드라이버가 connection을 리턴하지 않으면 다음 드라이버에 확인
       } catch (SQLException ex) {
          if (reason == null) {
              reason = ex;
          }
       }
  	} else {
      println("    skipping: " + aDriver.getClass().getName());
	}
}

▪️ H2 Driver객체

// h2.Driver.java

@Override
public Connection connect(String url, Properties info) throws SQLException {
	if (url == null) {
    	throw DbException.getJdbcSQLException(ErrorCode.URL_FORMAT_ERROR_2, null, Constants.URL_FORMAT, null);
	} else if (url.startsWith(Constants.START_URL)) {
    	return new JdbcConnection(url, info, null, null, false);
	} else if (url.equals(DEFAULT_URL)) {
    	return DEFAULT_CONNECTION.get();
	} else {
    	return null;
	}
}

드라이버 매니저가 관리하는 드라이버들인 registeredDrivers를 for문으로 하나씩 검증하는데, 드라이버에 DB URL을 파라미터로 전송해 문자열로 검증하는 방식이다. 드라이버에서 허용하는 URL방식이면 커넥션을 리턴하여 Driver Manager가 이를 바로 리턴하고, 드라이버에서 허용하지 않는 방식이면 다음 드라이버를 검증한다.

profile
You're not a computer, you're a tiny stone in a beautiful mosaic

0개의 댓글