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

2개의 의견 from SLiPP

의견 추가하기

연관태그

← 목록으로