Class.forName()
의 용도는 컴파일 타임에 직접적인 참조 없이 런타임에 동적으로 클래스를 로드하기 위함이다. 프로그래밍 언어가 클래스 정의를 필요로 할 때 클래스 로더를 이용해 클래스 정의를 로드하는 것과 동일하게 사용하는 것이다.
Class.forName()
을 사용하는 이유는 DI(Dependency Injection)를 사용하기 위한 경우가 많다. 많은 프레임워크들이 프레임워크가 필요로 하는 구현을 가지는 클래스를 정의하는 것을 허락한다. 이러한 참조가 설정 파일에서 끝나면, 클래스를 미리 알지 못해도 클래스를 실시간으로 로드할 수 있다.
DI 프레임워크들은 작성한 추상 클래스 혹은 인터페이스에 특정한 구현을 주입하려고 이러한 행위를 한다. DI를 사용하는 코드도 실제로 메소드를 통해 해당 클래스가 로드되고 인스턴스화되고 사용될 때까지는 어떤 클래스를 사용할지 알 수 없다.
프레임워크 작성자에게 동적 클래스 로딩은 매우 강력한 기술이고, 관심사의 분리를 런타임에 수행하기 위해 사용할 수 있다. 그래서 만일 동작을 변경할 필요가 있을 때, 간단하게 동작을 변경할 수 있는데 코드가 동작하는 시점에 이전에 쓰던 클래스 대신 새로운 클래스를 사용하게 하면서 코드를 다시 컴파일하지 않고도 시스템을 변경할 수 있도록 해준다.
위와 같이 Driver
인터페이스 타입과 같은 비교적 유연한 타입을 가져다놓고 런타임에 DI 하기 위해 Class.forName()
으로 특정 클래스를 로드한다고 보면 될 것 같다. 이로 인해 JDBC 내부에 있는 Driver
객체를 DB 밴더마다 직접 바꿔주거나 설정하지 않아도 된다.
JDBC 4.0 이상부터는 자동적으로 classpath에 있는 클래스를 로드해서
Class.forName()
을 작성할 필요가 없다고 한다.
https://www.quora.com/What-is-the-use-of-class-Forname
https://stackoverflow.com/questions/8053095/what-is-the-actual-use-of-class-fornameoracle-jdbc-driver-oracledriver-while
https://stackoverflow.com/questions/5484227/jdbc-class-forname-vs-drivermanager-registerdriver