문제 상황
도커를 이용해 스프링 서버와 DB를 각각 컨테이너에 띄워 관리하기 위해 도커 설정을 하고, 컨테이너로 띄웠다.
그런데, 실행 이후 서버 컨테이너가 다음과 같은 오류와 함께 종료되었다.
java.sql.SQLNonTransientConnectionException: Socket fail to connect to host:address=(host=docker-route-guide-db-1)(port=3306)(type=primary). Connection refused
내가 생각했던 원인
- 도커에서 DB 관련 설정이 잘못되었다.
- 스프링에서 DB 관련 설정이 잘못되었다.
- Dialect 호환이 잘못되었다.
- DB 컨테이너와 스프링 컨테이너간의 통신이 되지 않는다
1. 도커에서 DB 관련 설정이 잘못되었다?
Dockerfile, init.sql 등을 살펴보았지만 잘못된 점을 찾지 못했고, 도커 실행 시 원하던대로 초기 세팅이 되었다.
스프링에서 DB 관련 설정이 잘못되었다?
url, user, password, 포트 등을 모두 확인해봤지만, 문제가 없었다.
Dialect 호환이 잘못되었다?
혹시나 하는 마음으로 Dialect 설정 관련하여 찾아보고 설정해봤으나, 모두 해결에 도움을 주지 못했다.
DB 컨테이너와 스프링간의 통신이 되지 않는다?
서버 컨테이너에서 nc 명령어를 활용해 DB 컨테이너의 포트를 확인해봤으나, 잘 열려있었다.
그래서 원인이 뭐야?
문득 코드 도메인이 잘못되었을 수도 있다는 생각에 새롭게 작성했던 entity A 의 코드를 모두 주석처리하고 실행해봤다.
결과는 성공.. 혹시나해서 entity A를 다시 주석 해제한 후 다시 실행해보니
다시 오류가 발생했고, entity A가 문제였음을 알게됐다.
원인은 entity A와 entity B가 OneToOne 관계가 맺어져있었는데,
B entity에서 A에 대한 mapped by 설정을 해주지 않아서였다.
정리
Socket fail to connect 예외가 어떻게 SQL과 관련되어 있는 지에 대해서는 아직 정확한 이유를 알 수 없었다.
아마도 sql과 jdbc, jpa 등의 지식이 생기고 나면 자연스럽게 이해할 수 있을 것이라 생각이 된다.
따라서.. jpa와 jdbc에 대한 구조적인 이해를 해야겠다는 생각이 뼈저리게 들었다.
추가로 문제를 해결하며 알게된 점
- nc를 이용한 컨테이너간 연결 확인 방법
- Dockerfile의 ENTRYPOINT를 이용한 서버 시작 시 원하는 application profile 고르는 방법
'트러블 슈팅' 카테고리의 다른 글
hibernate가 기존 DB 테이블을 재생성하는 문제 (0) | 2024.08.05 |
---|---|
DB 연동을 위한 도커 경로 설정 문제 (1) | 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 |