달력

3

« 2024/3 »

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31

오라클 드라이버 등록시 의문이 하나 생겼다.


일반적으로 오라클 드라이버를 프레임워크를 사용하지 않고 등록하려면 다음과 같이 한다.

Class.forName("oracle.jdbc.driver.OracleDriver");

Connectiion con = DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:XE", "id", "pw");


위 두 문구는 두가지 일을 한다.

1) OracleDriver를 DriverManager가 인식하도록 함.

2) Oracle의 IP주소 및 id, pw를 이용해 접속.


근데 여기서 Class.forName은 일반적인 형태가 아니라서 좀 헷갈렸다.

가만 생각해 보면 뭔가 내가 하지도 않은 일이 자동으로 되어버린 것 같다는 느낌이 들었다.

Class.forName은 클래스 이름을 이용해서 동적으로 클래스를 메모리에 올리는 것 뿐인데, 그러면 OracleDriver라는 클래스를 이용할 수 있게 된 것까지는 이해가 간다. 근데 DriverManager랑 OracleDriver가 왜 바인딩이 된 거지???


===============

DriverManager에서 OracleDriver를 바인딩할 수 있었던 이유는 OracleDriver클래스가 static영역을 가지고 있기 때문이다.

그 static영역에서 자동으로 다음 문구를 실행한다.

java.sql.DriverManager.registerDriver(new Driver());


그렇기 때문에 메모리에 클래스를 최초로 로드할 때 드라이버매니저가 오라클드라이버를 인식 가능하게 된 것이다.


실제로 저 문구(Class.forName(...))를 빼먹으면

뒤에서 con.createStatement()를 실행할 때 에러가 난다.



:
Posted by 클레잇