spring boot (Gradle)에서 oracle을 연결하려고 하는데,
application.yml에서 설정한 오라클 드라이버를 인식할 수 없다는 오류가(Cannot resolve class 'OracleDrive') 발생하였다.
datasource:
driver-class-name: oracle.jdbc.OracleDrive
url: ****
username: ****
password: ****
단순히 project structure에서 ojdbc.jar를 별도로 추가해주었는데도 의존성 문제가 발생하였는데, project를 시작하는데 가장 기본이 되는 라이브러리와 Module Dependency에 대해 세부적으로 알 수 있었던 계기가 되어 해결내역을 기록한다.
또한 외부에서 의존성을 생각없이 주입받았던 과정들이 세부적으로 어떻게 영속화되는지, 이것을 프로젝트 관리하는데 어떠한 관점으로 바라보아야할 지 고민이 들었던 이슈이기도 하여 공부내용을 정리해보았다.
기본적으로 루트 프로젝트(MyProject) 하위 디렉토리들은 서브 모듈로 인식을 하는데, 이 경우 각 모듈이 의존해야 하는 Dependency를 수동으로 각각 추가해주어야 한다.
MyProject/
├── build.gradle (루트)
├── settings.gradle
├── core/ (모듈 A) -> 추가 필요
├── api/ (모듈 B) -> 추가 필요
├── batch/ (모듈 C) -> 추가 필요
특히 JARs/Directory로 의존성을 추가한다면 외부 라이브러리를 공급받는 조치이기에, 프로젝트나 해당 라이브러리 파일 경로가 변경되면 경로 설정을 다시 해주어야 하는 등 관리가 매우 힘들어진다.
따라서 이러한 의존성 관리를 편리하고 간편하게 할 수 있는 방안이 라이브러리와 Module Dependency이다.
라이브러리는 "책꽂이"로 생각하면 된다.
나중에 필요할때 책꽂이에서 해당 "책"을 꺼내보겠다는 의미로 일단 jar파일을 라이브러리에 등록해두는 것이다.
이 경우 루트 프로젝트 전역적으로 해당 jar 파일 관리가 가능해지기에, 파일경로가 변경되는 걱정없이 필요한 모듈에 해당 의존성을 "라이브러리"라는 책꽂이에서 가져와 적용할 수 있게 된다.
즉, 외부 jar파일을 일일이 모듈마다 추가해주고 경로가 변경되면 이를 반영해주던 작업을, 중앙관리를 통해 라이브러리에 해당 파일을 등록하여 필요할때마다 의존성을 가져올 수 있게 된다. 이에 따라 프로젝트 의존성 구성을 효율적으로 할 수 있고 그만큼 관리 측면에서도 효율성을 확보할 수 있게 된다.
하지만 실질적으로 프로젝트를 빌드할 때, 프로젝트가 필요한 의존성은 클래스 로더의 클래스패스를 참고하면서 주입을 받게 된다.
이때 라이브러리에만 jar파일이 존재하면 클래스패스에 해당 jar파일이 없기 때문에 빌드 실패 혹은 컴파일 오류가 발생하게 된다.
일단 위 오류 모두 Module Dependency까지 의존성을 주입하였다면 해결할 수 있는데, 세부적으로 그 원리를 먼저 살펴보자.
컴파일 오류의 경우 프로젝트에 라이브러리가 등록되어 있어도,
위 상황으로 인해 컴파일 오류가 발생할 수 있다.
빌드 오류의 경우 루트 프로젝트에 라이브러리가 등록되어 있어도,
이 경우 위와 같이 의존성 주입을 위한 경로를 따로 지정해주고
//jdbc
implementation files('libs/ojdbc8-19.3.0.0.jar')
application.yml에서 해당 의존성을 명기해준다면, Module Dependency를 프로젝트 전역에 적용할 수 있게 된다.
이에 따라 최종적으로, 라이브러리에 의존성을 등록하고, 최종적으로 Module Dependency에 등록하는 과정까지 온전히 해야 프로젝트 전역적인 관리와 의존성 주입을 완료할 수 있다는 것을 알 수 있었다.
참고로 Gradle은 build.gradle만을 진짜로 믿는다.
이 내용만 가지고 클래스패스를 참고하므로, 의존성 주입이 여기서 이루어지지 않는다면 빌드가 일어날때마다 의존성 주입을 해주어야 한다는 점 유의하자.
그리고, maven이든 gradle이든 저 의존성을 외부에서 주입받을때 항상 라이브러리와 모듈 Dependency에 의존성을 등록하는 것을 볼 수 있었는데, 이 이유가 프로젝트 관리를 할 때 한 곳에만 등록하면 결국 다른 한 쪽에 반드시 등록해주어야 하기 때문에 "온전히" 의존성을 적용하기 위해 라이브러리와 Module Dependency에 해당 의존성을 등록해주는 과정인 것을 알 수 있었다.
이렇게 되면 의존성 주입 온전히 가능해지고, 별도의 작업없이 편리하게 의존성을 주입받아 프로젝트를 관리할 수 있게 된다!
이 원리를 기억하면서 프로젝트 의존성을 어떻게 관리하는 것이 좋을지도 생각해보면 좋겠다.