BackEnd/JPA

[JPA] SpringBoot 2.5 이후부터 data.sql 초기화 시점

샤아이인 2022. 6. 6.

이번 프로젝트를 진행하던 도중 data.sql 을 통한 초기화 데이터 삽입이 정상적으로 되지 않는 문제가 있었습니다.

이를 해결하기 위한 설정이 필요했는데, 왜 이런 문제가 발생했는지 알아보시죠!

 

소제목 입력

우선 SpringBoot 2.4 이하의 버전에서는 data.sql이 정상적으로 초기화 된다고 합니다.

Spring Boot 버전 2.4 -> 2.5 업데이트 사항중에 일부분 때문에 우리는 따로 추가설정을 해줘야 합니다.

 

원래 설정은 다음과 같았습니다.

spring:
  jpa:
    hibernate:
      ddl-auto: create
    properties:
      hibernate:
        format_sql: true
    database: mysql
    database-platform: org.hibernate.spatial.dialect.mysql.MySQL8SpatialDialect
  
  sql:
    init:
      mode: always
      schema-locations:
      data-locations: classpath:sql/data.sql

하지만 초기화가 정상적으로 작동하지 않았는데, 그 이유는

 

data.sql 로 초기화 데이터를 먼저 삽입 한 후, JPA의 schema를 생성하기 때문입니다.

 

따라서 해당 Table이 없는 상황에서 insert를 하려하니까, insert 구문에서 오류가 발생한 것 입니다.

 

Spring 공식 문서에는 다음과 같이 명시되어 있습니다.

Hibernate and data.sql
By default, data.sql scripts are now run before Hibernate is initialized. This aligns the behavior of basic script-based initialization with that of Flyway and Liquibase. If you want to use data.sql to populate a schema created by Hibernate, set spring.jpa.defer-datasource-initialization to true. While mixing database initialization technologies is not recommended, this will also allow you to use a schema.sql script to build upon a Hibernate-created schema before it’s populated via data.sql.

Spring Boot 2.5버전 부터 스크립트 기반 초기화의 동작과정을 Flyway, Liquibase와 일치시키기 위해서 data.sql 은 Hibernate 초기화되기 전에 실행된다는 내용인것 같다.

 

따라서 Hibernate 초기화를 통해 생성된 스키마에다가 데이터를 채우기를 위해서 data.sql가 실행되기를 원한다면 application.yml(또는 properties)에 spring.jpa.defer-datasource-initialization 옵션 값을 true로 추가해주어야 한다.

 

다음과 같이 말이다!

spring.jpa.defer-datasource-initialization=true

 

댓글