Jwt인증을 공부하려고 프로젝트를 실습하던 과정에서 겪었던 이슈와 Spring Boot 버전 2.4 -> 2.5 업데이트 사항중에 일부를 관련하여 정리하려고합니다.
JPA 관련 설정은 위와 같이 셋팅하고 넘어갔다.
먼저 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 초기화 기술을 혼합하여 사용하는 것은 권장하지 않는 방법이라고한다.
친절한 설명 감사드려요 :)