인프런 커뮤니티 질문&답변

전인호님의 프로필 이미지

작성한 질문수

토비의 스프링 부트 - 이해와 원리

JdbcTemplate과 트랜잭션 매니저 구성

Hikari 라이브러리가 없으면 오류가 나는거 아닌가요

작성

·

85

0

제가 이번 강의까지 보다가 한달만에 다시봐서 헷갈리는걸수도 있는데 갑자기 궁금하여 질문드립니다..

Hikari 라이브러리를 gradle에서 가져오지 못하는 이슈 때문에 이번 강의의 커뮤니티 게시판에 다른 분이 작성한 글을 참고하여 토비님과 다르게 gradle에 implementation('com.zaxxer:HikariCP:4.0.3')를 추가해줘서 강의를 보고 있는데요.

강의에서 DataSourceConfig 클래스 안에서 Hikari 관련된 빈을 등록하여 사용하려고 하는데, 이게 어떻게보면 Hikari 관련된 라이브러리가 있으면 사용하고, 아니면 기본 DataSource를 사용하게끔 하는 의도가 있는 자동구성등록하는 방법 이잖아요..

근데 Hikari 라이브러리를 gradle에 추가 후, 토비님 처럼 테스트를 하면 Hikari가 DataSource로 사용되어 정상 동작하는데, 만약에 반대로 Hikari를 gradle에서 빼면 기본적인 SimpleDriverDataSource 객체가 사용되는게 예상을 하였는데, 당연하게도? gradle에서 Hikari 관련된 implement를 제거해버리면, SimpleDriverDataSource 객체를 사용하기 전에 DataSourceConfig 클래스 안에서 Hikari 관련된 로직들이, Hikari 라이브러리가 없기 떄문에 오류가 나지 않나요?

즉, Hikari라는 라이브러리가 없도록, gradle에서 Hikari와 관련된 implements를 빼버리면 SimpleDriverDataSource 가 사용되는게 아니라, 애초에 소스에서 오류가 나는게 맞는건데.. 제가 어디부터 혼란이 온지 모르겠네요.

답변 2

1

토비님의 프로필 이미지
토비
지식공유자

자바의 코드가 다른 클래스를 사용하도록 만들어졌다면 그 다른 클래스는 컴파일 타임에는 꼭 필요합니다. 그러지 않으면 컴파일할 때 오류가 납니다.

하지만 런타임에는 다릅니다. 코드에서 사용하는 다른 클래스가 있더라도 실제로 그 클래스를 쓰는 코드가 실행되지 않으면 실행 시점에는 에러가 나지 않습니다.

이건 클래스가 실제로 사용되는 코드가 수행될 때 해당 클래스를 로딩해서 메모리로 가져오는 작업을 수행하기 때문입니다. 만약 그때 gradle 등에서 설정하지 않아서 라이브러리 클래스가 없으면 클래스가 없다고 에러가 나겠죠.

그렇다면 DataSourceConfig에서 Hikari 관련 클래스가 존재하는지 체크하고, 그리고 없다면 SimpleDriverDataSource를 사용하도록 만들었다고 했을 때 Hikari 클래스가 있는지 체크하는 시점에도 Hikari 클래스를 가진 Hikari 라이브러리가 포함되어 있어야하지 않을까하는 의문이 들 수 있겠죠.

이건 클래스가 현재 실행중인 애플리케이션의 클래스패스(classpath)에 존재하는지 확인하는 방법을 사용하는데, 이 때는 클래스를 직접 로딩하지 않습니다. 로딩해서 기능을 사용하지 않기 때문에 클래스가 없어도 에러가 나지 않죠.

따라서 Hikari를 포함시키지 않은 경우에도 내부에 Hikari를 사용하는 코드가 있는 DataSourceConfig도 문제없이 실행이 됩니다.

 

0

전인호님의 프로필 이미지
전인호
질문자

감사합니다!!