레이블이 Spring Boot인 게시물을 표시합니다. 모든 게시물 표시
레이블이 Spring Boot인 게시물을 표시합니다. 모든 게시물 표시

2023. 2. 10.

스프링 부트 데이터베이스 초기화

2.5 버전부터 Hibernate 초기화 방식 변경사항으로 인한 오류와 설명을 보고 문서로 정리해 남기면 좋겠다는 생각이 들어 작성 (검색어는 'Hibernate and data.sql')

- 이제 기본적으로 data.sql 스크립트는 Hibernate 초기화 전에 실행
- 'Flyway'와 'Liquibase'라는 데이터베이스 마이그레이션 툴 동작과 일치시키기 위함
- 'data.sql'을 사용하기 위해서는 'spring.jpa.defer-datasource-initialization=true' 설정
- 'schema.sql' 스트립트 또한 사용할 수 있게 해준다.
- 데이터베이스 초기화 기술을 혼합해 사용하는 걸 권장하지 않는다.

출처: https://github.com/spring-projects/spring-boot/wiki/Spring-Boot-2.5-Release-Notes#hibernate-and-datasql


스프링 부트 공식 문서 "How-to" 설명

9.3. SQL 스크립트를 사용해 데이터베이스 초기화
- 스크립트 기반 DataSource 초기화는 기본적으로 'JPA EntityManagerFactory Bean'이 생성되기 전에 수행
- 'schema.sql'을 사용해 JPA-관리 엔티티에 대한 스키마를 생성하고 'data.sql'을 사용해 데이터를 채울 수 있다.
- 여러 데이터 소스 초기화 기술을 사용하는 것을 권장하지 않지만
- 만약 Hibernate로 생성된 스키마를 스크립트 기반 데이터소스 초기화를 원한다면 'spring.jpa.defer-datasource-initialization=true' 설정
- 이렇게 하면 'EntityManagerFactory Bean'이 생성되고 초기화될 때까지 데이터 소스 초기화 지연

출처: https://docs.spring.io/spring-boot/docs/current/reference/html/howto.html#howto.data-initialization.using-basic-sql-scripts


참고용 스프링 부트 공식 예제 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;