인프런 영문 브랜드 로고
인프런 영문 브랜드 로고

인프런 커뮤니티 질문&답변

limjs730님의 프로필 이미지

작성한 질문수

비전공자도 이해할 수 있는 Docker 입문/실전

컨테이너로 실행시킨 Spring Boot가 MySQL에 연결이 안 되는 이유

docker compose 2개(mysql, spring boot)를 띄울시 동작을 안합니다.

작성

·

70

0

도커 파일은 아래입니다.

FROM openjdk:17-jdk

COPY build/libs/*.jar /app.jar

ENTRYPOINT ["java","-jar","/app.jar"]

도커 컴포즈 파일 입니다.

services:
  my-server:
    build: .
    ports:
      - 8080:8080
    depends_on:
      my-db:
        condition: service_healthy
  my-db:
    image: mysql
    environment:
      MYSQL_ROOT_PASSWORD: 1234
      MYSQL_DATABASE: mydb
    volumes:
      - /Users/shchoi/Downloads/docker/mysql:/var/lib/mysql
    ports:
      - 3306:3306
    healthcheck:
      test: [ "CMD", "mysqladmin", "ping" ]
      interval: 5s
      retries: 10

yml파일 입니다.

spring:
  datasource:
    url: jdbc:mysql://my-db:3306/mydb
    username: root
    password: 1234
    driver-class-name: com.mysql.cj.jdbc.Driver

 

이렇게 하고 실행시 db는 up이 되는데 spring은 다운 됩니다. 로그는 좀 길긴한데 아래와 같습니다.

왜 안뜨는걸까요....;

my-server-1 | org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'entityManagerFactory' defined in class path resource [org/springframework/boot/autoconfigure/orm/jpa/HibernateJpaConfiguration.class]: Unable to create requested service [org.hibernate.engine.jdbc.env.spi.JdbcEnvironment] due to: Unable to determine Dialect without JDBC metadata (please set 'jakarta.persistence.jdbc.url' for common cases or 'hibernate.dialect' when a custom Dialect implementation must be provided)

my-server-1 | at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1812) ~[spring-beans-6.2.3.jar!/:6.2.3]

my-server-1 | at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:601) ~[spring-beans-6.2.3.jar!/:6.2.3]

my-server-1 | at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:523) ~[spring-beans-6.2.3.jar!/:6.2.3]

my-server-1 | at org.springframework.beans.factory.support.AbstractBeanFactory.lambdadoGetBeandoGetBean0(AbstractBeanFactory.java:339) ~[spring-beans-6.2.3.jar!/:6.2.3]

my-server-1 | at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:346) ~[spring-beans-6.2.3.jar!/:6.2.3]

my-server-1 | at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:337) ~[spring-beans-6.2.3.jar!/:6.2.3]

my-server-1 | at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:207) ~[spring-beans-6.2.3.jar!/:6.2.3]

my-server-1 | at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:970) ~[spring-context-6.2.3.jar!/:6.2.3]

my-server-1 | at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:627) ~[spring-context-6.2.3.jar!/:6.2.3]

my-server-1 | at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.refresh(ServletWebServerApplicationContext.java:146) ~[spring-boot-3.4.3.jar!/:3.4.3]

my-server-1 | at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:752) ~[spring-boot-3.4.3.jar!/:3.4.3]

my-server-1 | at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:439) ~[spring-boot-3.4.3.jar!/:3.4.3]

my-server-1 | at org.springframework.boot.SpringApplication.run(SpringApplication.java:318) ~[spring-boot-3.4.3.jar!/:3.4.3]

my-server-1 | at org.springframework.boot.SpringApplication.run(SpringApplication.java:1361) ~[spring-boot-3.4.3.jar!/:3.4.3]

my-server-1 | at org.springframework.boot.SpringApplication.run(SpringApplication.java:1350) ~[spring-boot-3.4.3.jar!/:3.4.3]

my-server-1 | at com.csh.springdemo.SpringDemoApplication.main(SpringDemoApplication.java:10) ~[!/:0.0.1-SNAPSHOT]

my-server-1 | at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:na]

my-server-1 | at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) ~[na:na]

my-server-1 | at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:na]

my-server-1 | at java.base/java.lang.reflect.Method.invoke(Method.java:568) ~[na:na]

my-server-1 | at org.springframework.boot.loader.launch.Launcher.launch(Launcher.java:102) ~[app.jar:0.0.1-SNAPSHOT]

my-server-1 | at org.springframework.boot.loader.launch.Launcher.launch(Launcher.java:64) ~[app.jar:0.0.1-SNAPSHOT]

my-server-1 | at org.springframework.boot.loader.launch.JarLauncher.main(JarLauncher.java:40) ~[app.jar:0.0.1-SNAPSHOT]

my-server-1 | Caused by: org.hibernate.service.spi.ServiceException: Unable to create requested service [org.hibernate.engine.jdbc.env.spi.JdbcEnvironment] due to: Unable to determine Dialect without JDBC metadata (please set 'jakarta.persistence.jdbc.url' for common cases or 'hibernate.dialect' when a custom Dialect implementation must be provided)

my-server-1 | at org.hibernate.service.internal.AbstractServiceRegistryImpl.createService(AbstractServiceRegistryImpl.java:276) ~[hibernate-core-6.6.8.Final.jar!/:6.6.8.Final]

my-server-1 | at org.hibernate.service.internal.AbstractServiceRegistryImpl.initializeService(AbstractServiceRegistryImpl.java:238) ~[hibernate-core-6.6.8.Final.jar!/:6.6.8.Final]

my-server-1 | at org.hibernate.service.internal.AbstractServiceRegistryImpl.getService(AbstractServiceRegistryImpl.java:215) ~[hibernate-core-6.6.8.Final.jar!/:6.6.8.Final]

my-server-1 | at org.hibernate.boot.model.relational.Database.<init>(Database.java:45) ~[hibernate-core-6.6.8.Final.jar!/:6.6.8.Final]

my-server-1 | at org.hibernate.boot.internal.InFlightMetadataCollectorImpl.getDatabase(InFlightMetadataCollectorImpl.java:226) ~[hibernate-core-6.6.8.Final.jar!/:6.6.8.Final]

my-server-1 | at org.hibernate.boot.internal.InFlightMetadataCollectorImpl.<init>(InFlightMetadataCollectorImpl.java:194) ~[hibernate-core-6.6.8.Final.jar!/:6.6.8.Final]

my-server-1 | at org.hibernate.boot.model.process.spi.MetadataBuildingProcess.complete(MetadataBuildingProcess.java:171) ~[hibernate-core-6.6.8.Final.jar!/:6.6.8.Final]

my-server-1 | at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.metadata(EntityManagerFactoryBuilderImpl.java:1442) ~[hibernate-core-6.6.8.Final.jar!/:6.6.8.Final]

my-server-1 | at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.build(EntityManagerFactoryBuilderImpl.java:1513) ~[hibernate-core-6.6.8.Final.jar!/:6.6.8.Final]

my-server-1 | at org.springframework.orm.jpa.vendor.SpringHibernateJpaPersistenceProvider.createContainerEntityManagerFactory(SpringHibernateJpaPersistenceProvider.java:66) ~[spring-orm-6.2.3.jar!/:6.2.3]

my-server-1 | at org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean.createNativeEntityManagerFactory(LocalContainerEntityManagerFactoryBean.java:390) ~[spring-orm-6.2.3.jar!/:6.2.3]

my-server-1 | at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.buildNativeEntityManagerFactory(AbstractEntityManagerFactoryBean.java:419) ~[spring-orm-6.2.3.jar!/:6.2.3]

my-server-1 | at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.afterPropertiesSet(AbstractEntityManagerFactoryBean.java:400) ~[spring-orm-6.2.3.jar!/:6.2.3]

my-server-1 | at org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean.afterPropertiesSet(LocalContainerEntityManagerFactoryBean.java:366) ~[spring-orm-6.2.3.jar!/:6.2.3]

my-server-1 | at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1859) ~[spring-beans-6.2.3.jar!/:6.2.3]

my-server-1 | at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1808) ~[spring-beans-6.2.3.jar!/:6.2.3]

my-server-1 | ... 22 common frames omitted

my-server-1 | Caused by: org.hibernate.HibernateException: Unable to determine Dialect without JDBC metadata (please set 'jakarta.persistence.jdbc.url' for common cases or 'hibernate.dialect' when a custom Dialect implementation must be provided)

my-server-1 | at org.hibernate.engine.jdbc.dialect.internal.DialectFactoryImpl.determineDialect(DialectFactoryImpl.java:191) ~[hibernate-core-6.6.8.Final.jar!/:6.6.8.Final]

my-server-1 | at org.hibernate.engine.jdbc.dialect.internal.DialectFactoryImpl.buildDialect(DialectFactoryImpl.java:87) ~[hibernate-core-6.6.8.Final.jar!/:6.6.8.Final]

my-server-1 | at org.hibernate.engine.jdbc.env.internal.JdbcEnvironmentInitiator.getJdbcEnvironmentWithDefaults(JdbcEnvironmentInitiator.java:181) ~[hibernate-core-6.6.8.Final.jar!/:6.6.8.Final]

my-server-1 | at org.hibernate.engine.jdbc.env.internal.JdbcEnvironmentInitiator.getJdbcEnvironmentUsingJdbcMetadata(JdbcEnvironmentInitiator.java:392) ~[hibernate-core-6.6.8.Final.jar!/:6.6.8.Final]

my-server-1 | at org.hibernate.engine.jdbc.env.internal.JdbcEnvironmentInitiator.initiateService(JdbcEnvironmentInitiator.java:129) ~[hibernate-core-6.6.8.Final.jar!/:6.6.8.Final]

my-server-1 | at org.hibernate.engine.jdbc.env.internal.JdbcEnvironmentInitiator.initiateService(JdbcEnvironmentInitiator.java:81) ~[hibernate-core-6.6.8.Final.jar!/:6.6.8.Final]

my-server-1 | at org.hibernate.boot.registry.internal.StandardServiceRegistryImpl.initiateService(StandardServiceRegistryImpl.java:130) ~[hibernate-core-6.6.8.Final.jar!/:6.6.8.Final]

my-server-1 | at org.hibernate.service.internal.AbstractServiceRegistryImpl.createService(AbstractServiceRegistryImpl.java:263) ~[hibernate-core-6.6.8.Final.jar!/:6.6.8.Final]

my-server-1 | ... 37 common frames omitted

my-server-1 |

 

답변 3

0

JSCODE 박재성님의 프로필 이미지
JSCODE 박재성
지식공유자

안녕하세요 limjs730님! 해결하셨다니 다행이네요:)

또 공부하시다가 막히시는 점 생기시면 질문 남겨주세요~~

0

limjs730님의 프로필 이미지
limjs730
질문자

clean

build하니까 해결이 되었네요! 자꾸 소스코드 고치고 빌드하고 했는데 클린을 빼먹어서 이런 것 같습니다.

0

인프런 AI 인턴님의 프로필 이미지

안녕하세요, 인프런 AI 인턴입니다. limjs730님. 질문 주신 내용을 보면 Spring Boot 애플리케이션이 Hibernate 설정 중에 데이터베이스 다이얼렉트를 찾지 못해 애플리케이션이 실행되지 않는 문제가 발생하고 있는 것 같습니다. 이 문제는 보통 JDBC 연결 정보가 완전히 제공되지 않았을 때 발생합니다.

문제의 원인

스프링 부트가 Hibernate의 SQL Dialect를 자동으로 결정하지 못할 경우 발생할 수 있는 문제입니다. 이 경우 hibernate.dialect를 직접 설정하거나 데이터베이스와의 연결이 실제로 이루어지는지 다시 확인할 필요가 있습니다.

해결 방법

다음과 같은 방법을 고려해 보실 수 있습니다.

  1. application.yml 파일의 수정:
    application.yml에 명시적으로 hibernate.dialect 설정을 추가해보세요.
   spring:
     datasource:
       url: jdbc:mysql://my-db:3306/mydb
       username: root
       password: 1234
       driver-class-name: com.mysql.cj.jdbc.Driver
     jpa:
       properties:
         hibernate:
           dialect: org.hibernate.dialect.MySQLDialect
  1. Docker Compose 수정 확인:
    depends_on 설정이 제대로 되어있는지 확인해보세요. 이 설정에 의해 mysql 컨테이너가 준비되었을 때 spring boot 컨테이너가 실행됩니다. 정상적으로 설정되어 있다면 이미 설정 그대로 두고 아래 추가 사항을 확인하세요.

  2. MySQL 데이터베이스 연결 확인:

    • MySQL 컨테이너가 정상적으로 작동하는지 확인해보세요. 컨테이너의 로그 확인 및 mysql에 직접 접속이 되는지 점검하는 것이 필요합니다.
    • mysqladmin 명령어로 컨테이너 내에서 직접 ping을 실행하여 mysql 서버의 상태를 확인합니다.

아래 링크들은 유사한 문제를 다룬 문제에 대한 유용한 참고를 제공해 드립니다:
- DB 연결 정보 설정 및 hibernate.dialect에 관한 문제 해결
- Spring Boot의 Hibernate 설정 에러에 대한 해결 방안

저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.

limjs730님의 프로필 이미지

작성한 질문수

질문하기