스프링 부트 2.5 업데이트 : hibernate, data.sql 관련 변동사항

hwanse·2021년 5월 26일
8

Spring

목록 보기
4/4

Jwt인증을 공부하려고 프로젝트를 실습하던 과정에서 겪었던 이슈와 Spring Boot 버전 2.4 -> 2.5 업데이트 사항중에 일부를 관련하여 정리하려고합니다.

사용 스택

  • Spring Boot: version 2.5
  • Spring MVC
  • Spring JPA
  • Spring Security
  • H2 DB: In-Memory

application.yml 셋팅

JPA 관련 설정은 위와 같이 셋팅하고 넘어갔다.



hibernate 초기화 과정 변동

먼저 User엔티티와 Authority엔티티를 정의하고 Spring Boot Application 구동하면서 User, Authority 데이터를 초기화 시키려는 목적으로 resources 디렉토리 하위에 data.sql스크립트를 추가했다.

그런데 Spring Boot Application 구동하는 과정 중에 data.sql을 초기화하는 과정 중간에 User 테이블을 찾을 수 없어 Insert 구문에서 오류가 발생하는 것이다.

초기 설정을 잘 못 잡았나 생각하여 다시 확인해봐도 설정에 문제는 없는듯했다. 계속 원인을 추적하다가 문득 머리에서 혹시 버전의 변동사항 때문인건가? 라는 생각이 스쳐 지나갔다. 현재 내가 생성한 프로젝트의 Boot 버전은 2.5.0 버전이었는데 해당 프로젝트 Boot 버전을 2.4 버전대로 낮추고 서버를 다시 실행해보니 정상적으로 초기화가 완료되었다.

그래서 버전이 2.5로 바뀌면서 무엇이 달라진건지 궁금하여 Spring Boot 공식문서에서 Release Note 변동사항을 찾아보게되었다. 해당 문서 상단에 바로 내가 궁금했던 내용이 있었다.

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로 추가해주어야 한다.
또는 schema.sql을 추가해서 hibernate 가 스키마를 생성하는 과정보다 먼저 실행되도록하여 해당 스키마에 data.sql을 채우도록하는 방법도 있다고 한다. 그러나 DB 초기화 기술을 혼합하여 사용하는 것은 권장하지 않는 방법이라고한다.









참고
Spring Boot 2.5 Release Notes - hibernate and data.sql

profile
만사가 귀찮은 ISFP가 쓰는 학습 블로그

4개의 댓글

comment-user-thumbnail
2021년 9월 10일

친절한 설명 감사드려요 :)

1개의 답글
comment-user-thumbnail
2021년 9월 11일

왜 안되는 건지 답답해하다가 제가 딱 궁금했던 부분을 해소시켜주셨습니다. 감사합니다.. 앞으로 막히게 되면 릴리즈 버전 공식문서를 꼭 찾아봐야겠네요

1개의 답글