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

서린님의 프로필 이미지

작성한 질문수

스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술

스프링 데이터 JPA

application.properties 코드 질문(Failed to initialize JPA EntityManagerFactory)

작성

·

334

0

[질문]은 굵은 글씨로 표시해 두었습니다.

application.properties에 강의에서 나온 대로 입력하였는데, 아래와 같은 에러가 발생하였습니다.

j.LocalContainerEntityManagerFactoryBean : Failed to initialize JPA EntityManagerFactory: 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)

검색을 해보니, Hibernate가 H2 데이터베이스 Dialect을 자동으로 인식하지 못하기 때문이라 하여 아래와 같은 코드를 추가하여 문제를 해결하였습니다.

spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.H2Dialect

최종적으로 스프링부트어플리케이션도 잘 작동하고, 테스트코드도 통과하였습니다.

본 강의에서는 5줄 만으로도 코드가 잘 작동하는데, 왜 저는 H2 데이터베이스를 명시적으로 설정하는 코드를 추가로 작성해야 하는지 궁금합니다.

최종 application.properties 코드

spring.datasource.url=jdbc:h2:tcp://localhost/~/test
spring.datasource.driver-class-name=org.h2.Driver
spring.datasource.username=sa
spring.jpa.show-sql=true
spring.jpa.hibernate.ddl-auto=none
spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.H2Dialect

질문용 파일 : https://drive.google.com/file/d/1JpK0g8GjAL0quy9aOx-EMB8nF599Tk-U/view?usp=sharing


=========================================
[질문 템플릿]
1. 강의 내용과 관련된 질문인가요? (예)
2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예)
3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예)

답변 1

0

안녕하세요, 인프런 AI 인턴입니다.

서린님의 질문에 답변드리겠습니다.

일반적으로 Spring Boot는 연결하는 데이터베이스의 Dialect를 자동으로 감지합니다. 그러나 특정 상황에서 Hibernate가 자동으로 데이터베이스의 Dialect를 정확히 인식하지 못하는 경우가 있습니다. 이러한 상황에는 JDBC URL 정보가 충분하지 않거나, 복잡한 데이터베이스 구성, 다양한 버전의 hibernate 사용 등 다양한 원인이 있을 수 있습니다.

스프링부트에서 Hibernate와 H2 데이터베이스를 사용할 경우, 대부분의 기본 설정으로 문제없이 작동합니다. 하지만 환경에 따라 시스템이 정확한 Dialect를 자동으로 파악하지 못해 명시적으로 Dialect를 설정해주어야 할 때가 있습니다. 특히나, spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.H2Dialect 같은 설정을 추가함으로써 Spring Boot에게 사용할 데이터베이스와 그에 맞는 Hibernate Dialect를 명확히 알려주게 되면, 위에서 언급한 에러 없이 올바르게 EntityManagerFactory를 초기화할 수 있습니다.

이처럼 서린님의 경우에는 스프링부트 어플리케이션이 해당 Dialect를 자동으로 감지하지 못했기 때문에, spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.H2Dialect를 명시해서 문제를 해결하셨고, 이는 특정 개발 환경이나 Hibernate 버전에 따라 필요한 조치일 수 있습니다.

이러한 설정 필요성은 개발 환경의 세부적인 차이나 사용하는 스프링부트 및 Hibernate의 버전 차이에서 발생할 수 있습니다. 강의에서는 아마도 가장 흔한 설정과 환경을 기반으로 설명하고 있어, 모든 개발 환경에서 동일하게 적용되지 않을 수 있습니다.

별도의 설정 없이도 잘 작동하는 경우가 대부분이지만, 위와 같은 명시적 설정이 필요한 경우도 있음을 알아두시면 좋을 것 같습니다.

서린님의 프로필 이미지

작성한 질문수

질문하기