2.5 버전부터 Hibernate 초기화 방식 변경사항으로 인한 오류와 설명을 보고 문서로 정리해 남기면 좋겠다는 생각이 들어 작성 (검색어는 'Hibernate and data.sql')
- 이제 기본적으로 data.sql 스크립트는 Hibernate 초기화 전에 실행
- 'Flyway'와 'Liquibase'라는 데이터베이스 마이그레이션 툴 동작과 일치시키기 위함
- 'data.sql'을 사용하기 위해서는 'spring.jpa.defer-datasource-initialization=true' 설정
- 'schema.sql' 스트립트 또한 사용할 수 있게 해준다.
- 데이터베이스 초기화 기술을 혼합해 사용하는 걸 권장하지 않는다.
스프링 부트 공식 문서 "How-to" 설명
9.3. SQL 스크립트를 사용해 데이터베이스 초기화
- 스크립트 기반 DataSource 초기화는 기본적으로 'JPA EntityManagerFactory Bean'이 생성되기 전에 수행
- 'schema.sql'을 사용해 JPA-관리 엔티티에 대한 스키마를 생성하고 'data.sql'을 사용해 데이터를 채울 수 있다.
- 여러 데이터 소스 초기화 기술을 사용하는 것을 권장하지 않지만
- 만약 Hibernate로 생성된 스키마를 스크립트 기반 데이터소스 초기화를 원한다면 'spring.jpa.defer-datasource-initialization=true' 설정
- 이렇게 하면 'EntityManagerFactory Bean'이 생성되고 초기화될 때까지 데이터 소스 초기화 지연
참고용 스프링 부트 공식 예제 PetClinic 'application.properties'
# database init, supports mysql too
database=h2
spring.sql.init.schema-locations=classpath*:db/${database}/schema.sql
spring.sql.init.data-locations=classpath*:db/${database}/data.sql
# JPA
spring.jpa.hibernate.ddl-auto=none
spring.jpa.open-in-view=true
'data.sql' 예시
INSERT INTO vets VALUES (default, 'James', 'Carter');
INSERT INTO vets VALUES (default, 'Helen', 'Leary');
INSERT INTO vets VALUES (default, 'Linda', 'Douglas');
'schema.sql' 예시
DROP TABLE vet_specialties IF EXISTS;
DROP TABLE vets IF EXISTS;
DROP TABLE specialties IF EXISTS;
댓글 없음:
댓글 쓰기