Failed to obtain JDBC Connection
NCBT 프로젝트를 배포하는 과정에서 만난 에러… 스프링 부트 애플리케이션을 Docker 컨테이너로 실행시키는 과정에서 자꾸만 컨테이너가 종료되었는데, 컨테이너 로그를 확인해보니 Failed to obtain JDBC Connection
라는 에러가 출력되어서 MySQL 과의 연결 과정에서 문제가 발생하고 있는 것을 인지했다.
✏️ 접근방식
스프링 컨테이너와 MySQL 의 네트워크가 동일한지 확인
우선 NCBT 프로젝트는 MySQL 은 로컬에 설치하고 스프링은 Docker 로 실행하는 구조로 배포했다. 아키텍처 참조

처음에는 몰랐는데… Docker 는 일반적인 프로세스와 다르게 독립적인 네트워크를 가진다고 한다. 즉 내가 컨테이너로 실행시킨 스프링 컨테이너는 로컬호스트에서 구동중인 MySQL 과 다른 네트워크에서 동작하고 있다는 것이다. 도커를 실행할 때 네트워크와 관련해서 별다른 옵션을 주지 않으면 컨테이너는 bridge 모드로 실행이 되고, 가상 IP 가 컨테이너에 할당된다. 이런 이유로 컨테이너와 로컬호스트는 분리된 망을 가지게 되고, 더욱 놀라운 점은 컨테이너끼리도 서로 분리된 망을 가지게 된다고 한다. 그렇지만 host 서버와 네트워크를 분리하지 않는 옵션도 있다. 아래와 같이 컨테이너를 실행하면 컨테이너는 host 네트워크에서 동작한다.
docker run -d \
--network host \ # 컨테이너를 host 네트워크에서 실행시킨다.
-e SPRING_DATASOURCE_URL=jdbc:mysql://내부IP:3306/ncbt \
-e SPRING_DATASOURCE_USERNAME=아이디 \
-e SPRING_DATASOURCE_PASSWORD=비밀번호 \
-e SPRING_DATASOURCE_DRIVER-CLASS-NAME=com.mysql.cj.jdbc.Driver \
backend:ver5
이렇게 MySQL 과 같은 host 네트워크에서 실행되게 만들고 jdbc driver 경로를 내부 IP 로 설정해 로컬에서 구동중인 MySQL 을 찾도록 만들었지만, 실패했다.
MySQL 사용자 권한 확인
MySQL 사용자의 접근 권한에 문제가 있을까 싶어 확인해 보았다. 사용자의 권한이 ‘%’ 인 경우 모든 IP, 즉 외부에서도 접근이 가능하지만, ‘localhost’ 인 경우 내부에서만 접근이 가능하다. 내가 생각하기에 스프링과 MySQL 은 같은 네트워크에 있기 때문에 ‘localhost’ 권한으로 충분히 접근 가능하다고 생각했지만, 도커의 구조를 정확히 몰라서… 혹시 몰라 아래와 같이 접근 권한을 변경했지만, 여전히 실패했다.
계정 | 권한 |
---|---|
root | localhost |
아이디 스프링 컨테이너에 환경변수로 설정한 아이디 | % 외부에서도 접근 가능하도록 변경 |
MySQL 에러 로그 확인
계속되는 실패로 며칠동안 고생하다가 현직에 있는 선배 개발자분들에게 물어보는 것이 빠르겠다 싶어 하코 커뮤니티에 도움을 요청했다. 그 중 MySQL 로그를 보여달라는 댓글이 있어 에러 로그를 확인해 보았다. (사실 이때까지 스프링 컨테이너 쪽 에러만 확인하고 있었던… 왜 MySQL 쪽 로그를 볼 생각을 못했을까😭) 그랬더니 MySQL 의 도메인 네임은 이것인데 ‘@#$^@!@#’ 스프링에서 접근을 시도한 내부 IP 는 ‘XX.XX.XX.XX’ 라서 찾을 수 없다는 에러가 발생한 것을 확인했다. (정확한 로그는 아쉽게도 캡쳐를 못했다) 이제 해결의 실마리가 보인다 !
✅ 해결방법
MySQL 애플리케이션의 도메인 네임과 IP 매핑
MySQL 자체적으로 도메인 이름과 IP 주소를 매핑하는 방법은 없지만 시스템 차원에서 매핑해줄 수 있다.
# 시스템 파일 열기
vi /etc/hosts
# 아래 한 줄을 추가 (예시)
192.168.1.100 mysqldomain
🤓 느낀점
- 기반 지식의 중요성
국비 지원으로 6개월이라는 짧은 코스로 교육 이수를 마치고 사회로 나온 취준생으로서 전공생들보다 기반 지식이 많이 약하다. 요즘은 AI 로 생산성을 높이는 것이 당연(?)하다보니 기반 지식을 소홀히 하는 경우가 많은데, 코드를 짜는 것도 그렇지만 디버깅이나 리팩토링같은 작업에 있어서 보다 효율적이고 보다 빠른 길은 기반지식을 얼마나 쌓았는가에 달려 있는 것 같다.
- 로그를 통한 문제 확인
우리의 시스템은 늘 친절하다. 문제가 있다면 로그에 기록을 해 준다. 로그를 확인하는 것을 습관화한다면 더욱 빠른 문제 해결이 가능할 것이다.
🔖 참고자료