문제 상황
작성된 스프링 프로젝트를 도커를 이용해 배포하려던 상황이었다.
로컬에서는 간편한 테스트를 위해 H2 DB를 사용하고 있었고, 배포 환경에서는 따로 DB 컨테이너를 띄워 MariaDB와 연동하려고 했다.
H2와 MariaDB는 application.yml 파일 설정이 다르므로 상황마다 매 번 yml 파일을 수정해야하는 점이 불편하여
두 개의 설정 파일을 두고, 실행 시 상황에 따라 바꿀 수 있도록 시도했다.
이후 도커를 이용하여 서버와 DB 컨테이너를 띄우고 나니, 서버 컨테이너에서 다음과 같은 오류가 발생했다.
java.lang.ArrayIndexOutOfBoundsException: Index 1 out of bounds for length 1
at org.mariadb.jdbc.HostAddress.parseSimpleHostAddress(HostAddress.java:107) ~[mariadb-java-client-3.3.3.jar:na]
at org.mariadb.jdbc.HostAddress.parse(HostAddress.java:84) ~[mariadb-java-client-3.3.3.jar:na]
내가 생각했던 해결책
mariadb의 jdbc에서 parsing 과정에서 ArrayOutOfBoundsException이 발생했다.
당시 내가 생각했던 원인은, Dockerfile과 개발용과 배포용으로 yml파일을 나누었던 두 과정중에서 문제가 발생했다고 생각했다.
(문제를 해결한 지금에서는 HostAddress parsing 과정에서 문제가 발생했으므로, url 형식이 잘못되었겠구나 라고 바로 알 수 있지 않았을까? 라는 생각이 든다)
Dockerfile이 문제였어. 근데.. yml도 문제였어
Dockerfile을 살펴보니, 파일 내 경로 설정이 잘못되어있었다.
경로를 수정하고, 다시 실행해봤으나 또 같은 오류가 발생했다.
그래서 배포용으로 설정된 yml 파일을 살펴보았고, 다음과 같은 어이없는 실수를 했음을 알아버렸다
// 잘못된 코드
url: jdbc:mariadb://docker-route-guide-db-1:/3306/route_guide
// 정상 코드
url: jdbc:mariadb://docker-route-guide-db-1:3306/route_guide
원인 분석
정해진 형식이 아닌 URL을 파싱하는 과정에서 토큰이 잘못잘려서 ArrayIndexOutOfBoundsException이 발생했다고 생각된다.
해결 과정에서 느꼈던 점
- 도커 설정과 yml 파일 분리의 두 가지 종류의 작업을 거의 동시에 진행하다보니, 문제 발생 시 어느쪽에서 발생한 오류인지 확실하게 알 수 없었다. 앞으로는 되도록 한 가지 종류의 작업을 진행할 때는 확실하게 한 가지만 진행할 수 있도록 해야겠다.
- 오류 코드를 곰곰이 살펴봤으면 원인을 직관적이고 확실하게 알 수 있었을텐데, 조금 더 잘 살펴봐야겠다는 생각이 든다.
'트러블 슈팅' 카테고리의 다른 글
hibernate가 기존 DB 테이블을 재생성하는 문제 (0) | 2024.08.05 |
---|---|
JPA Entity 매핑 관련 오류(java.sql.SQLNonTransientConnectionException) (0) | 2024.05.27 |
Docker build context와 파일 인식 (0) | 2024.05.13 |
[Spring webFlux] Unable to load io.netty.resolver.dns.macos ... 오류 (0) | 2024.03.28 |
파일 경로 설정과 URL 객체 인코딩 트러블슈팅 (0) | 2024.02.25 |