Class.forName을 활용해 jdbc driver를 등록하는 과정

2014-05-21 15:43

http://www.slipp.net/questions/275 글에서 Class.forName과 관련된 내용을 찾다가 jdbc driver가 등록되는 과정이 궁금해 졌다. 그래서 찾아본 내용을 간단하게 정리한다.

Class.forName("package.ClassName")를 실행하는 경우 문자열로 전달되는 클래스가 존재하는 클래스를 메모리에 로드하는 역할을 한다. http://stackoverflow.com/questions/4202252/how-does-class-forname-work 글을 보면 대략적으로 이해할 수 있다.

Class.forName("com.mysql.jdbc.Driver");

위와 같이 구현할 경우 "com.mysql.jdbc.Driver" 클래스가 메모리에 로드된다. 메모리에 로드되면서 static 절이 실행된다. 그렇다면 "com.mysql.jdbc.Driver" 클래스 내부 소스를 보면 다음과 같다.

public class Driver extends NonRegisteringDriver implements java.sql.Driver {
    static {
        try {
           java.sql.DriverManager.registerDriver(new Driver());
        } catch (SQLException E) {
            throw new RuntimeException("Can't register driver!");
        }
    }


    [...]
}

Mysql JDBC Driver 소스코드는 http://www.docjar.com/html/api/com/mysql/jdbc/Driver.java.html 에서 확인할 수 있다.

이와 같이 DriverManager.registerDriver() 메소드를 통해 자기 자신을 등록하는 과정을 거친다.

Class.forName("com.mysql.jdbc.Driver")만 실행할 경우 특별히 다른 과정을 거치지 않았음에도 불구하고 JDBC Driver가 자동으로 등록되는 이유이다.

이와 같이 등록한 JDBC Driver는 Connection conn = DriverManager.getConnection(url + dbName,userName, password);에서 데이터베이스 Connection을 생성하는 시점에 사용되게 된다.

http://stackoverflow.com/questions/5484227/jdbc-class-forname-vs-drivermanager-registerdriver 이 문서도 읽어보면 좋겠다.

지금까지 아무 생각없이 그냥 그려려니 하면서 사용했는데 호기심에 찾아봤는데 나름 재미있네.

그럼 다음은 Class.forName("com.mysql.jdbc.Driver")와 Class.forName("com.mysql.jdbc.Driver").newInstance()의 무슨 차이가 있는지도 함 찾아보면 재미있겠다.

0개의 의견 from FB

3개의 의견 from SLiPP

2020-11-27 12:39

좋은 정보 감사합니다~

Java6에서 지정된 인터페이스와 일치하는 구현을 검색하고 로드하는 일을 하는 SPI(Service Provider Interface)가 도입됨.

SPI는 제 3자가 구현하거나 확장하기 위한 API.

JDBC Driver의 경우 SPI에 정의된 인터페이스를 보고 DB 벤더들이 구현해서 제공.

ServiceLoader 클래스는 SPI의 핵심 클래스로서 서비스 구현을 로드함.

Java Service Provider Interface
의견 추가하기

연관태그

← 목록으로