이번 프로젝트를 진행하던 도중 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
'BackEnd > JPA' 카테고리의 다른 글
[JPA] JPA metamodel must not be empty! (0) | 2022.07.28 |
---|---|
[JPA] 일급 컬렉션 (0) | 2022.07.17 |
[JPA] JSON 직렬화 순환 참조 해결하기 (0) | 2022.06.05 |
[JPA] Spring Data JPA가 제공하는 QueryDsl 기능 (0) | 2022.05.16 |
[JPA] 실무 활용 - Spring Data JPA와 Querydsl (0) | 2022.05.15 |
댓글