Docker compose tomcap WebApp Java MySQL 연동 문제 Develop Tip

Docker compose 로 개발을 하다보니 PolyGlot 처럼 여러 개발 언어를 접하게 됩니다.
이번에는 Java 입니다.

간단히 이야기 하면 Tomcat WAS의 WebApp WAR 파일이 있어,
docker-compose.yaml 에 다음과 같이 WAS와 MySQL 을 구성해 놓았습니다.

version: '3.4'
services:
  trbn_mysql:
    image: mysql:latest
    command: --default-authentication-plugin=mysql_native_password
    restart: always
    container_name: trbn_mysql
    volumes:
      - mysql-storage:/var/lib/mysql
    environment:
      MYSQL_ROOT_PASSWORD: myroot-password-123!@#
    ports:
      - 3306:3306
  trbn_was:
    image: trbn-was
    restart: always
    container_name: trbn_was
    expose:
      - 8080
    ports:
      - 8080:8080

WAS의 WebApp 에서 해당 mysql 로 접속이 안된다고 하여 다음과 같은
Test Java 파일을 만들어 (ConnTest.java),

import java.sql.*;
 
public class ConnTest {
    public static void main(String[] args) {
        if (args.length != 5) {
          System.err.println("ConnTest host port db user pass");
          System.exit(1);
        }
        System.out.println();
        //for (int i = 0; i < args.length; i++)
        //  System.out.format("args[%d] : %s%n", i, args[i]);
      
        Connection conn = null;
        try {
            Class.forName("com.mysql.jdbc.Driver");
            String driver = String.format("jdbc:mysql://%s:%s/%s", args[0], args[1], args[2]); 
            String user = args[3];
            String pass = args[4];
System.out.format("driver=\"%s\" with user=\"%s\", pass=\"%s\"\n", driver, user, pass);
            conn = DriverManager.getConnection(driver, user, pass);
            System.out.println("Success connecting Mysql!");
        } catch (SQLException se) {
            System.out.println("Fail connecting: " + se);
se.printStackTrace();
        } catch (Exception e) {
            System.out.println("Exception1: " + e);
        } finally {
            if (conn != null) {
                try {
                    conn.close();
                    System.out.println("Stop connecting MySQL!");
                } catch (SQLException se) {
                    System.out.println("Exception2: " + se);
                }
            }
        }
    }
}

docker cp ConnTest.java trbn_was: /usr/local/tomcat/webapps/ROOT/WEB-INF/lib

라고 복사한 다음,

docker exec -it trbn_was bash

로 해당 WAS 컨테이너로 들어가서,

cd /usr/local/tomcat/webapps/ROOT/WEB-INF/lib
jar 라이브러리가 있는 곳으로 들어가
확인해 보니,
mysql-connector-java-5.1.30.jar 
라는 mysql JDBC 4 드라이버가 있더군요.

그 다음,
javac ConnTest.java
해당 샘플을 컴파일하고,

java -cp ".:./*" ConnTest trbn_mysql 3306 mysql root r
실행시켜보니,

com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException: Could not create connection to database server.] with root cause
...
java.lang.NullPointerException

라고 오류가 발생하는 것이었습니다.

한 두시간 고생한 끝에 확인한 결과는,

위에 docker-compose.yaml 파일에 기술된
mysql:latest 는 mysql:8 버전이었고,
이 버전은 com.mysql.cj.jdbc.Driver 를 사용한다 합니다.

이전 버전은 com.mysql.jdbc.Driver 를 사용해 왔었지요.

따라서, 이 경우는, 8 이전 버전이 5.7을 적용하면 되는 것이었고,

docker-compose.yaml 에서
mysql:latest 대신 mysql:5.7 
버전으로 가져오면
잘 동작하는 것을 확인하게 되었습니다.


어느 분께는 도움이 되셨기를 ..




덧글

댓글 입력 영역

구글애드텍스트