본문 바로가기

트러블슈팅

JOOQ에서 코드 생성할 때, JDBC 드라이버 문제. 로케일을 인식할 수 없습니다.

문제

JOOQ는 Java Object Oriented Querying의 약자로 자바 개발자들이 JAVA로 SQL Query를 쉽게 작성할 수 있도록 도와주는 라이브러리이다. JOOQ를 이용하면 DB의 정보를 기반으로 JAVA 소스 파일을 생성해준다.

 

Oracle Database를 사용하고 있고, 아래 Script를 이용해 JOOQ로 Oracle Database 정보를 기반으로 한 JAVA 소스를 생성하려고 했다. 

#!/bin/sh

JOOQ_HOME=${HOME}/.m2/repository/org/jooq/pro
JOOQ_VERSION=3.11.5
JDBC_DRIVER_HOME=${HOME}/.m2/repository/com/oracle/jdbc/ojdbc8
JDBC_DRIVER_VERSION=12.2.0.1
CONFIG_FILE=db2code-oracle-config.xml

echo ":: Using libraries"
echo ":: - ${JOOQ_HOME}/jooq/${JOOQ_VERSION}/jooq-${JOOQ_VERSION}.jar"
echo ":: - ${JOOQ_HOME}/jooq-meta/${JOOQ_VERSION}/jooq-meta-${JOOQ_VERSION}.jar"
echo ":: - ${JOOQ_HOME}/jooq-meta-extensions/${JOOQ_VERSION}/jooq-meta-extensions-${JOOQ_VERSION}.jar"
echo ":: - ${JOOQ_HOME}/jooq-codegen/${JOOQ_VERSION}/jooq-codegen-${JOOQ_VERSION}.jar"
echo ":: - ${JDBC_DRIVER_HOME}/${JDBC_DRIVER_VERSION}/ojdbc8-${JDBC_DRIVER_VERSION}.jar"
echo ":: Using config file"
echo ":: - ${CONFIG_FILE}"

java -cp \
${JOOQ_HOME}/jooq/${JOOQ_VERSION}/jooq-${JOOQ_VERSION}.jar\
:${JOOQ_HOME}/jooq-meta/${JOOQ_VERSION}/jooq-meta-${JOOQ_VERSION}.jar\
:${JOOQ_HOME}/jooq-codegen/${JOOQ_VERSION}/jooq-codegen-${JOOQ_VERSION}.jar\
:${JDBC_DRIVER_HOME}/${JDBC_DRIVER_VERSION}/ojdbc8-${JDBC_DRIVER_VERSION}.jar:. \
org.jooq.codegen.GenerationTool /${CONFIG_FILE}

 

그러자, 아래와 같이 '로케일을 인식할 수 없습니다.'라는 에러가 나왔다.

해결

Mac OS에서 주로 발생하는 에러라고 한다.

주요 해결 방법은 3가지가 있다.

 

1. Mac 시스템 환경에서 국가 변경 후, 다시 원복

2. Shell Script에서 JVM의 유저 로케일 정보 설정

3. OJDBC 버전 업그레이드

 

1. Mac 시스템 환경에서 국가 변경 후, 다시 원복

아래 블로그 글 따라 Mac 시스템 환경에서 국가를 다른 국가로 변경 후, 다시 되돌리면 해결된다고 한다.

하지만 내 컴퓨터는 이 방법으로 해결되지 않았다.

 

https://kims0hee.tistory.com/16

 

JDBC 연결 + 로케일을 인식할 수 없습니다.

📩에러메시지 📩 로케일을 인식할 수 없습니다. JDBC 연결테스트 중에 JUnit의 failure Trace에 '로케일을 인식할 수 없습니다' 라는 에러메시지 확인! 구글링 해보니 MacOS에서 왕왕 발생하는 에러였

kims0hee.tistory.com

 

2. Shell Script에서 JVM의 유저 로케일 정보 설정

Shell Script에 아래 부분을 추가해 JVM의 로케일을 설정해줄 수 있다.

java -Duser.language=ko

 

추가한 Shell Script는 아래와 같다.

#!/bin/sh

JOOQ_HOME=${HOME}/.m2/repository/org/jooq/pro
JOOQ_VERSION=3.11.5
JDBC_DRIVER_HOME=${HOME}/.m2/repository/com/oracle/jdbc/ojdbc8
JDBC_DRIVER_VERSION=12.2.0.1
CONFIG_FILE=db2code-oracle-config.xml

echo ":: Using libraries"
echo ":: - ${JOOQ_HOME}/jooq/${JOOQ_VERSION}/jooq-${JOOQ_VERSION}.jar"
echo ":: - ${JOOQ_HOME}/jooq-meta/${JOOQ_VERSION}/jooq-meta-${JOOQ_VERSION}.jar"
echo ":: - ${JOOQ_HOME}/jooq-meta-extensions/${JOOQ_VERSION}/jooq-meta-extensions-${JOOQ_VERSION}.jar"
echo ":: - ${JOOQ_HOME}/jooq-codegen/${JOOQ_VERSION}/jooq-codegen-${JOOQ_VERSION}.jar"
echo ":: - ${JDBC_DRIVER_HOME}/${JDBC_DRIVER_VERSION}/ojdbc8-${JDBC_DRIVER_VERSION}.jar"
echo ":: Using config file"
echo ":: - ${CONFIG_FILE}"

java -Duser.language=ko -cp \
${JOOQ_HOME}/jooq/${JOOQ_VERSION}/jooq-${JOOQ_VERSION}.jar\
:${JOOQ_HOME}/jooq-meta/${JOOQ_VERSION}/jooq-meta-${JOOQ_VERSION}.jar\
:${JOOQ_HOME}/jooq-codegen/${JOOQ_VERSION}/jooq-codegen-${JOOQ_VERSION}.jar\
:${JDBC_DRIVER_HOME}/${JDBC_DRIVER_VERSION}/ojdbc8-${JDBC_DRIVER_VERSION}.jar:. \
org.jooq.codegen.GenerationTool /${CONFIG_FILE}

 

Script를 실행하면 문제없이 JOOQ를 이용해 Code가 생성된다.

 

3. OJDBC 버전 업그레이드

OJDBC 버전을 업그레이드 하면 로케일 인식 문제가 해결된다.

OJDBC 버전을 12.0.0.1에서 21.5.0.0으로 업그레이드 해줬다.

 

pom.xml

pom.xml의 dependency에 OJDBC 버전을 변경한다.

        <dependency>
            <groupId>com.oracle.database.jdbc</groupId>
            <artifactId>ojdbc8</artifactId>
            <version>21.5.0.0</version>
            <scope>compile</scope>
        </dependency>

 

Maven Sync를 하면, maven repositroy 경로인 .m2/repository 밑에 라이브러리가 다운받아진다.

gorupId에 해당하는 com/oracle/database/jdbc 경로에 ojdbc8의 21.5.0.0 버전이 다운받아진 것을 확인할 수 있다.

즉, .m2/repository/com/oracle/database/jdbc/ojdbc8 경로에 다운받아진다.

 

db2code-oracle.sh

Shell Script의 JDBC의 경로가 맞는 지 확인하고 버전을 변경해준다.

 

db2code-oracle-config.xml

Shell Script에 있는 CONFIG_FILE인 db2code-oracle-confgi.xml에도 Driver 클래스 경로 관련 된 설정이 있다.

 

External Libraries에서 ojdbc8:21.5.0.0을 찾는다.

 

<driver> 경로에 있는 oracle.jdbc.driver로 들어가 OracleDriver 클래스가 있는지 확인한다.

 

 

Shell Script에 있는 ojdbc8 드라이버 경로, db2code-oracle-confgi.xml의 OracleDriver 클래스 경로를 제대로 설정해주지 않으면 아래와 같이 ClassNotFoundException이 나온다.

 

ojdbc8의 버전을 변경하면 JVM의 로케일을 JAVA -Duser.langue로 설정해주지 않아도, Shell Script 실행 시 로케일 문제가 발생하지 않는다. 물론 확실하게 JVM의 로케일을 설정해줘도 된다. 

#!/bin/sh

JOOQ_HOME=${HOME}/.m2/repository/org/jooq/pro
JOOQ_VERSION=3.11.5
JDBC_DRIVER_HOME=${HOME}/.m2/repository/com/oracle/database/jdbc/ojdbc8
JDBC_DRIVER_VERSION=21.5.0.0
CONFIG_FILE=db2code-oracle-config.xml

echo ":: Using libraries"
echo ":: - ${JOOQ_HOME}/jooq/${JOOQ_VERSION}/jooq-${JOOQ_VERSION}.jar"
echo ":: - ${JOOQ_HOME}/jooq-meta/${JOOQ_VERSION}/jooq-meta-${JOOQ_VERSION}.jar"
echo ":: - ${JOOQ_HOME}/jooq-meta-extensions/${JOOQ_VERSION}/jooq-meta-extensions-${JOOQ_VERSION}.jar"
echo ":: - ${JOOQ_HOME}/jooq-codegen/${JOOQ_VERSION}/jooq-codegen-${JOOQ_VERSION}.jar"
echo ":: - ${JDBC_DRIVER_HOME}/${JDBC_DRIVER_VERSION}/ojdbc8-${JDBC_DRIVER_VERSION}.jar"
echo ":: Using config file"
echo ":: - ${CONFIG_FILE}"

java -cp \
${JOOQ_HOME}/jooq/${JOOQ_VERSION}/jooq-${JOOQ_VERSION}.jar\
:${JOOQ_HOME}/jooq-meta/${JOOQ_VERSION}/jooq-meta-${JOOQ_VERSION}.jar\
:${JOOQ_HOME}/jooq-codegen/${JOOQ_VERSION}/jooq-codegen-${JOOQ_VERSION}.jar\
:${JDBC_DRIVER_HOME}/${JDBC_DRIVER_VERSION}/ojdbc8-${JDBC_DRIVER_VERSION}.jar:. \
org.jooq.codegen.GenerationTool /${CONFIG_FILE}

 

참고 자료

https://kims0hee.tistory.com/16

 

JDBC 연결 + 로케일을 인식할 수 없습니다.

📩에러메시지 📩 로케일을 인식할 수 없습니다. JDBC 연결테스트 중에 JUnit의 failure Trace에 '로케일을 인식할 수 없습니다' 라는 에러메시지 확인! 구글링 해보니 MacOS에서 왕왕 발생하는 에러였

kims0hee.tistory.com

https://beagle-dev.tistory.com/275

 

SQLDeveloper 오류: Locale not recoginized

오라클의 SQL 툴인 SQLDeveloper를 맥에서 사용할 때, Locale을 인식하지 못하는 에러가 발생할 수 있습니다. 이런 오류는 데이터베이스 커넥션 테스트 과정에서 주로 발생합니다. 특히 OSX를 버전 업그

beagle-dev.tistory.com

https://stackoverflow.com/questions/51431497/cant-connect-to-oracle-database-with-intellij-locale-not-recognized

 

Can't connect to oracle database with IntelliJ, Locale not recognized

I have Oracle Database 11g Express Edition installed, and can normally connect to my local database with PLSQL Developer, but I can't connect with IntelliJ. It says Locale not recognized. After

stackoverflow.com