개발자
선배님들 안녕하십니까? 제목 그대로 스프링부트와 MySQL 배포 과정에서 HikariPool-1 - Exception during pool initialization. server-1 | server-1 | java.sql.SQLNonTransientConnectionException: Could not create connection to database server. Attempted reconnect 3 times. Giving up. 위와 같은 오류가 발생합니다. MySQL은 정상적으로 배포가 되어서 접근이 가능한 것을 확인했습니다. 하지만, SpringBoot의 경우, 계속 DB와 연결이 실패합니다. 아래는 SpringBoot의 application.properties 파일과 docker-compose.yml 파일입니다. 한 수 가르쳐주셨으면 합니다. 감사합니다. spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver spring.datasource.url=${SPRING_DATASOURCE_URL} spring.datasource.username=${SPRING_DATASOURCE_USERNAME} spring.datasource.password=${SPRING_DATASOURCE_PASSWORD} spring.jpa.show-sql=true spring.jpa.hibernate.ddl-auto=update spring.jpa.properties.hibernate.format_sql=true
1version: '3'
2
3services:
4 db:
5 image: mysql:8.0
6 ports:
7 - "33061:3306"
8 restart: always
9 environment:
10 MYSQL_ROOT_PASSWORD: 1234
11 MYSQL_DATABASE: spring
12 MYSQL_USER: user
13 MYSQL_PASSWORD: 1234
14 networks:
15 - springboot-mysql
16
17 server:
18 image: demo-test:0.0.1
19 ports:
20 - "8080:8080"
21 restart: always
22 depends_on:
23 - db
24 environment:
25 SPRING_DATASOURCE_URL: jdbc:mysql://db:33061/spring?autoReconnect=true&useSSL=false&allowPublicKeyRetrieval=true&serverTimezone=UTC&useLegacyDatetimeCode=false
26 SPRING_DATASOURCE_USERNAME: user
27 SPRING_DATASOURCE_PASSWORD: 1234
28 networks:
29 - springboot-mysql
30
31networks:
32 springboot-mysql:
답변 1
익명
작성자
2024년 05월 18일
감사합니다 ㅠㅠㅠ 덕분에 잘 돌아갑니다 ㅠㅠ 로컬에서 33061 포트로 DB 접근이 가능해서 계속 33061로 했었는데, 이게 원인이었네요 .... 정말 감사합니다. 그런데 혹시, MySQL을 33061:3306으로 열었다면, 왜 로컬에서는 33061 포트로 접근이 가능한지 여쭤봐도 괜찮을까요 ?
김인후
software engineer • 2024년 05월 18일
연결을 localhost로 하게 되면 외부에서의 접근이기에 33061 -> 3306이라 33061로 접근하는 거가 맞지만 컨테이너 이름으로 접속 시도 시의 내부 포트로 바로 접근하게 되기에 3306으로 해야합니다!
익명
작성자
2024년 05월 18일
너무나도 감사합니다. 선배님 !!! 덕분에 궁금증이 해결되었습니다 ! 좋은 주말 보내십쇼 !
지금 가입하면 모든 질문의 답변을 볼 수 있어요!
현직자들의 명쾌한 답변을 얻을 수 있어요.
이미 회원이신가요?
커리어리 AI 봇
GPT가 달아주는 답변입니다.
2024년 05월 18일
여기서 문제는 Spring boot가 MySQL에 연결하려고 할 때 데이터베이스 서버를 찾지 못하는 것으로 보입니다. 이는 주로 `SPRING_DATASOURCE_URL`에 설정된 URL이 올바르지 않거나, MySQL 서비스가 아직 준비되지 않았기 때문일 수 있습니다. 문제 해결을 위해 먼저 확인해야할 사항은 스프링 부트 응용 프로그램의 데이터 소스 URL입니다: ```yaml SPRING_DATASOURCE_URL: jdbc:mysql://db:33061/spring?autoReconnect=true&useSSL=false&allowPublicKeyRetrieval=true&serverTimezone=UTC&useLegacyDatetimeCode=false ``` 여기서 포트 번호는 Docker를 통해 외부에 노출되는 포트 번호인 33061로 설정되어있으나, Docker container 내에서 다른 컨테이너와의 통신에 사용되는 내부 포트 번호인 3306이어야 합니다. 따라서 데이터 소스 URL은 다음과 같이 변경해보세요: ```yaml SPRING_DATASOURCE_URL: jdbc:mysql://db:3306/spring?autoReconnect=true&useSSL=false&allowPublicKeyRetrieval=true&serverTimezone=UTC&useLegacyDatetimeCode=false ``` 두 번째로 확인할 사항은 서버 시작 시 모든 서비스가 완전히 준비될 때까지 기다린다면 도움이 될 수 있습니다. 'depends_on' 옵션은 서비스를 순서대로 시작하지만, 준비 완료될 때까지 기다리지는 않습니다. MySQL이 완전히 시작될 때까지 스프링 부트 앱이 시작되지 않게 하려면 헬스 체크(healthcheck) 설정을 이용하거나 컨테이너 내에서 스크립트를 작성하여 DB가 완전히 준비될 때까지 기다리도록 할 수 있습니다. 나무라도 복잡한 해결책을 적용하기 전에 수정된 데이터 소스 URL로 먼저 시도해보시기 바랍니다.
지금 가입하면 모든 질문의 답변을 볼 수 있어요!