eclipse

Java 런타임 예외 : JDBC 드라이버 문제 해결에 대한 단계별 가이드

wooyit 2023. 7. 20. 13:00

오류

 

일반적인 디버깅 중 Java 오류인 java.lang.RuntimeException: Driver com.tmax.tibero.jdbc.TbDriver claim to not accept jdbcUrl, jdbc:log4jdbc:tibero:thin:@localhost:8629:tibero가 발생했습니다.

 

이러한 오류는 일반적으로 JDBC 드라이버와 제공된 JDBC URL 간에 호환성 문제가 있을 때 발생합니다.


Step 1: Updating Dependencies

해결 방법의 첫 번째 단계는 종속성을 업데이트하는 것이었습니다. 프로젝트의 pom.xml 파일에서 종속성이 업데이트되었습니다.

log4jdbc-log4j2 종속성뿐만 아니라 'egovframework'에서 제공하는 로깅 및 XML 처리와 관련된 종속성을 추가했습니다. 이러한 종속성을 추가하는 동안 충돌을 피하기 위해 'egovframework'의 기존 log4j, log4jdbc3 및 slf4j-log4j12 종속성이 제외되었는지 확인했습니다.

 

<dependency>
    <groupId>egovframework.rte</groupId>
    <artifactId>egovframework.rte.fdl.logging</artifactId>
    <version>${egovframework.rte.version}</version>
    <exclusions>
        <exclusion>
            <groupId>log4j</groupId>
            <artifactId>log4j</artifactId>
        </exclusion>
        <exclusion>
            <groupId>net.sf</groupId>
            <artifactId>log4jdbc3</artifactId>
        </exclusion>
        <exclusion>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-log4j12</artifactId>
        </exclusion>
    </exclusions>
</dependency>

<dependency>
    <groupId>egovframework.rte</groupId>
    <artifactId>egovframework.rte.fdl.xml</artifactId>
    <version>${egovframework.rte.version}</version>
    <exclusions>
        <exclusion>
            <groupId>net.sf.ehcache</groupId>
            <artifactId>ehcache-terracotta</artifactId>
        </exclusion>
        <exclusion>
            <groupId>log4j</groupId>
            <artifactId>log4j</artifactId>
        </exclusion>
        <exclusion>
            <groupId>net.sf</groupId>
            <artifactId>log4jdbc3</artifactId>
        </exclusion>
        <exclusion>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-log4j12</artifactId>
        </exclusion>
    </exclusions>
</dependency>



<dependency>
    <groupId>org.bgee.log4jdbc-log4j2</groupId>
    <artifactId>log4jdbc-log4j2-jdbc4.1</artifactId>
    <version>1.16</version>
</dependency>

 

 

Step 2: log4jdbc.log4j2.properties 추가


다음으로 resources 디렉터리 아래에 log4jdbc.log4j2.properties라는 새 파일을 만들었습니다. 이 파일은 스파이 로그 위임자를 설정하고 SQL 쿼리 덤프를 위한 최대 줄 길이를 구성하는 데 필요했습니다.

log4jdbc.log4j2.properties
0.00MB

 

Step 3: Updating VM arguments


다음 단계는 VM 인수를 업데이트하는 것이었습니다. 이는 서버의 시작 구성 설정으로 이동하여 -Dlog4jdbc.drivers=com.tmax.tibero.jdbc.TbDriver 인수를 추가하여 수행되었습니다. 이를 통해 JDBC 작업 로깅에 사용할 드라이버를 지정합니다.

 

Step 4: log4j2.xml 수정


마지막 단계는 log4j2.xml 파일을 일부 변경하는 것입니다. 특정 JDBC 작업에 대해 수준이 "OFF"로 설정된 여러 로거 구성을 추가했습니다. 이는 로그의 노이즈를 줄이고 로깅 프로세스를 간소화하는 데 도움이 되었습니다.

 

<Logger name="jdbc" level="OFF"/>
<Logger name="jdbc.sqlonly" level="OFF"/>
<Logger name="jdbc.audit" level="OFF"/>
<Logger name="jdbc.resultset" level="OFF"/>
<Logger name="jdbc.resultsettable" level="OFF"/>
<Logger name="jdbc.connection" level="OFF"/>

 

이러한 각 줄은 JDBC 로깅의 다른 측면을 비활성화합니다. 분석해 보겠습니다.

  • <Logger name="jdbc" level="OFF"/>는 일반 JDBC 로그를 끕니다. 이들은 일반적으로 저수준이며 대부분의 개발자에게 그다지 유익하지 않습니다.
  • <Logger name="jdbc.sqlonly" level="OFF"/>는 SQL 쿼리 로깅을 비활성화합니다. 때로는 유용하지만 로그에 정보가 넘치게 되어 실제 문제를 파악하기가 더 어려워질 수 있습니다.
  • <Logger name="jdbc.audit" level="OFF"/> 및 <Logger name="jdbc.resultset" level="OFF"/>는 감사 정보 및 쿼리 결과에 대한 로깅을 끕니다. 이들은 종종 일반 작동에 필요하지 않으며 안전하게 끌 수 있습니다.
  • <Logger name="jdbc.resultsettable" level="OFF"/>는 SQL 쿼리 실행으로 인한 테이블 로깅을 비활성화합니다.
  • 마지막으로 <Logger name="jdbc.connection" level="OFF"/>는 JDBC 연결 수명 주기 이벤트의 로깅을 끕니다.

 

이러한 다양한 로거에 대해 로그 수준을 '끄기'로 설정하면 로그의 '노이즈'를 크게 줄여 실제 문제를 더 쉽게 식별하고 해결할 수 있습니다. 로깅에 대한 이 세분화된 제어는 Log4J2 시스템의 강점 중 하나이며, 로깅되는 항목과 시기를 정확하게 사용자 정의할 수 있습니다.

이러한 조정 후에 우리는 더 깨끗하고 능률적인 로깅 프로세스를 갖게 되어 중요한 문제에 더 쉽게 집중할 수 있게 되었습니다. 그리고 중요한 것은 이 여정에서 우리를 시작한 java.lang.RuntimeException이 더 이상 표시되지 않는다는 것입니다.

 

결과

 

변경 후 처음에 직면했던 런타임 예외를 성공적으로 처리할 수 있었습니다. JDBC 드라이버는 이제 JDBC URL을 접근할 수 있었고 런타임 오류를 성공적으로 해결했습니다.