개발자

SpringBoot와 MySQL 도커 배포 과정에서 계속 오류가 발생합니다.

2024년 05월 18일조회 336

선배님들 안녕하십니까? 제목 그대로 스프링부트와 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:
이 질문이 도움이 되었나요?
'추천해요' 버튼을 누르면 좋은 질문이 더 많은 사람에게 노출될 수 있어요. '보충이 필요해요' 버튼을 누르면 질문자에게 질문 내용 보충을 요청하는 알림이 가요.
profile picture
익명님의 질문

답변 1

김인후님의 프로필 사진

컴포즈에서 스프링 부트에 환경변수 넣는 부분에서 db 포트를 3306으로 넣어보시겠어요?? 아마 컨테이너 이름으로 접근하면 내부 포트를 적어야할 겁니다.

profile picture

익명

작성자

2024년 05월 18일

감사합니다 ㅠㅠㅠ 덕분에 잘 돌아갑니다 ㅠㅠ 로컬에서 33061 포트로 DB 접근이 가능해서 계속 33061로 했었는데, 이게 원인이었네요 .... 정말 감사합니다. 그런데 혹시, MySQL을 33061:3306으로 열었다면, 왜 로컬에서는 33061 포트로 접근이 가능한지 여쭤봐도 괜찮을까요 ?

김인후님의 프로필 사진

김인후

software engineer2024년 05월 18일

연결을 localhost로 하게 되면 외부에서의 접근이기에 33061 -> 3306이라 33061로 접근하는 거가 맞지만 컨테이너 이름으로 접속 시도 시의 내부 포트로 바로 접근하게 되기에 3306으로 해야합니다!

profile picture

익명

작성자

2024년 05월 18일

너무나도 감사합니다. 선배님 !!! 덕분에 궁금증이 해결되었습니다 ! 좋은 주말 보내십쇼 !

지금 가입하면 모든 질문의 답변을 볼 수 있어요!

현직자들의 명쾌한 답변을 얻을 수 있어요.

또는

이미 회원이신가요?

AI 답변
커리어리 AI 봇 프로필 이미지

커리어리 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로 먼저 시도해보시기 바랍니다.

목록으로

지금 가입하면 모든 질문의 답변을 볼 수 있어요!