이 글에서는 스프링부트에서 JPA를 사용할 때 apllication.yml을 어떻게 설정해야 하는지에 대해 알아보도록 하겠습니다.

DB는 h2가 아닌 MySQL을 기준으로 다룬다는 점을 참고해주세요.


시작하기에 앞서 MySQL 연동이 되어 있어야 하므로, 연동 방법은 이글을 참고해주세요.



build.gradle

dependencies {
implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
implementation 'org.springframework.boot:spring-boot-starter-web'
runtimeOnly 'mysql:mysql-connector-java'
testImplementation 'org.springframework.boot:spring-boot-starter-test'
}



apllication.yml

spring:
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://localhost:3306/example?serverTimezone=UTC&characterEncoding=UTF-8
username: root
password: 1234

jpa:
database-platform: org.hibernate.dialect.MySQL5InnoDBDialect
open-in-view: false
show-sql: true
hibernate:
format_sql: true
ddl-auto: create

logging:
level:
org:
hibernate:
SQL: DEBUG
type:
descriptor:
sql:
BasicBinder: TRACE
  • spring.datasource
    • datasouce는 MySQL 설정과 관련된 것이므로 여기를 참고해주세요.
  • spring.jpa.database-platform
    • JPA 데이터베이스 플랫폼을 지정합니다.
    • 예제에서는 MySQL InnoDB를 사용하도록 설정했습니다.
  • spring.jpa.open-in-view
    • OSIV(Open Session In View)는 웹 요청이 완료될 때까지 동일한 EntityManager를 갖도록 해줍니다.
    • 스프링부트에서 OSIV가 기본값으로 true인데, 성능과 확장상 면에서 안좋다고 해서 false로 설정을 껏습니다. ( 참고 )
  • spring.jpa.show-sql
    • 콘솔에 JPA 실행 쿼리를 출력합니다.
  • spring.jpa.hibernate.format_sql
    • 콘솔에 출력되는 JPA 실행 쿼리를 가독성있게 표현합니다.
  • spring.jpa.hibernate.ddl_auto
    • 데이터베이스 초기화 전략을 설정합니다.
      • none
        • 아무것도 실행하지 않습니다.
      • create
        • SessionFactory가 시작될 때 기존테이블을 삭제 후 다시 생성합니다.
      • create-drop
        • create와 같으나 SessionFactory가 종료될 때 drop을 실행합니다.
      • update
        • 변경된 스키마만 반영합니다.
      • validate
        • 엔티티와 테이블이 정상적으로 매핑되었는지만 확인합니다.
  • logging.level.org.hibernate.type.descriptor.sql
    • SQL에서 물음표로 표기된 부분( bind parameter )을 로그로 출력해서 확인할 수 있습니다.

제가 주로 사용하는 설정은 위와 같습니다.
이 외에도 다양한 설정등이 있는데요, 개인적으로는 어노테이션으로 해결 가능한 것들은 어노테이션으로 처리하는 것을 좋아하기 때문에 설정을 잡지 않았습니다.
  • spring.jpa.hibernate.naming
    • 엔티티와 테이블에 대한 네이밍 전략
  • spring.jpa.hibernate.use-new-id-generator-mappings
    • auto increment에 대한 설정



이상으로 SpringBoot application.yml 파일에서 JPA를 설정하는 방법에 대해 알아보았습니다.

Hibernate, SpringBoot 버전마다 설정명, 기본값 등이 약간씩 차이가 있는 것 같네요.


[참고 자료]

https://jistol.github.io/java/2017/07/12/springboot-hibernate-sql-options/

https://www.popit.kr/스프링-부트-auto-configuration과-jpa하이버네이트-sql문-로깅


댓글 펼치기 👇
  1. 돌튀김 2020.01.03 15:28

    혹시 저처럼 그냥 application.properties를 사용하시는 분들을 위해 코드 공유합니다.
    오류가 걸려서 보니, 자동 테이블생성이 안되어있어서 자꾸 테이블을 못찾았거든요... 혹시 저처럼 초보님들께 도움이 될까 하여 코드 올립니다.
    빅토리님, 괜찮으시죠?

    >>
    spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
    spring.datasource.url=jdbc:mysql://localhost:3306/springboot
    spring.datasource.username=root
    spring.datasource.password=Flower83

    spring.jpa.hibernate.ddl-auto=create
    spring.jpa.properties.hibernate.jdbc.lob.non_contextual_creation=true

    • Favicon of https://victorydntmd.tistory.com victolee 우르르응 2020.01.03 15:43 신고

      그럼요~ 문제해결 내용을 공유해주시는건 언제든 환영합니다 ㅎㅎ

      lob.non_contextual_creation 설정을 해줘야하나 보네요.
      공유 해주셔서 감사드립니다

  2. victor 2020.08.13 16:18

    잘 보고있습니다
    다름이아니라 인텔리j 쓰고있는데 build.gradle 에서 jpa 추가했을때 오류가 나는데 어떤 문제때문에 그러는지 궁금합니다.
    implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
    이것만 빼면 제대로 실행되는데
    추가하고 실행하면

    Error starting ApplicationContext. To display the conditions report re-run your application with 'debug' enabled.
    2020-08-13 16:18:27.637 ERROR 3979 --- [ restartedMain] o.s.b.d.LoggingFailureAnalysisReporter :

    ***************************
    APPLICATION FAILED TO START
    ***************************

    Description:

    Failed to configure a DataSource: 'url' attribute is not specified and no embedded datasource could be configured.

    Reason: Failed to determine a suitable driver class


    Action:

    Consider the following:
    If you want an embedded database (H2, HSQL or Derby), please put it on the classpath.
    If you have database settings to be loaded from a particular profile you may need to activate it (no profiles are currently active).


    Process finished with exit code 0

    오류가 뜹니다..

    • Favicon of https://victorydntmd.tistory.com victolee 우르르응 2020.08.17 13:11 신고

      application.yml에 datasource를 작성해주셔야 할것 같습니다.
      url이 올바르게 작성되었는지 확인해보시고, 작성법은 https://victorydntmd.tistory.com/321 글을 참고해보세요~