스프링부트에서 제공하는 SQL 로딩기능에 사용할 SQL 문을 저장하는 파일.
이는 Spring jdbc의 DataSource
를 초기화하는 것이다.
두 스크립트는 모두 애플리케이션 로딩 시 초기에 실행하고 싶은 sql 문을 작성하게 된다.
이렇게, 두 스크립트 파일명은 엄밀히 다른 목적의 스크립트를 작성하도록 고안되었지만, 사실 한 곳에 다 써도 무방하다고 하다. (하지만 우선순위는 존재하니 좀 더 읽어보자.)
spring boot 애플리케이션에서, /resource
디렉토리에 위치해놓으면 된다.
기본적으로, 스프링부트에서는 embedded in-memory database 를 사용하는 경우에만 스크립트를 통한 데이터베이스 초기화가 이루어진다고 한다. 이 옵션을 변경해서, 항상 데이터베이스 초기화를 실행하고 싶은 경우 application.properties에 다음을 명시해주면 된다.
spring.sql.init.mode=always
만약 embedded in-memory database 포함, 어떤 경우에도 데이터베이스 초기화가 이루어지지 않도록 하기 위해서는 다음과 같이 설정해주면 된다.
spring.sql.init.mode=never
두 스크립트를 모두 사용하는 경우, 실행 우선순위가 존재할 것이다.
원래 우리가 데이터베이스에 DDL을 작성한 후 DML을 실행하는 것과 동일하게
DDL을 위한 schema.sql 이 DML을 위한 data.sql 보다 우선적으로 실행된다.
data-${platform}.sql
과 schema-${platform}.sql
스프링부트는 application.properties 의 spring.datasource.platform
값이 설정되어있을 경우, schema-{platform}.sql 을 실행한다고 한다.
우리는 이 기능을 활용해 데이터베이스 벤더마다 다른 스크립트 파일들을 유지할 수 있다고한다.
// resource/ 디렉터리. mysql과 h2를 번갈아 가며 적용할 수 있다.
schema-mysql.sql
schema-h2.sql
data-mysql.sql
data-h2.sql
spring.dataSource.platform=mysql
스프링 부트는 기본적으로 스프링 JDBC 이니셜라이저의 fail-fast 기능을 활성화합니다.
이 말은, 만약 스크립트에서 예외가 발생한다면, 애플리케이션이 시작될 수 없다는 뜻입니다.
이 기본 설정을 변경하기 위해서는spring.datasource.continue-on-error
를 설정해주어야합니다.
기본적으로, JPA의 EneityManagerFactory
빈들이 생성되기 전에, 우리가 얘기하고 있던, 스크립트 베이스의 DataSource
초기화가 이루어진다고 한다.
그렇기 때문에 JPA가 관리하는 엔티티들의 스키마를 생성하는 데 schema.sql
스크립트를 사용하거나, 데이터를 만질 때 data.sql
을 사용할 수가 있다.
스프링 공식문서에서는 Datasource 초기화 기술을 여러가지 사용하는 것을 권장하지 않지만, 필요한 경우 스크립트 베이스 초기화(schema.sql/data.sql)을 Hibernate(JPA) 의 스키마 생성(Initialize a Database Using Hibernate)과 함께 활용할 수 있다고 한다.
그를 위해서는 application.properties를 다음과 같이 설정해주면 된다.
spring.data.defer-datasource-initilization=true
이 외에도 JPA/hibernate 기반 초기화, 마이그레이션 툴을 이용한 초기화들이 있다.
여러가지 기능이 덧대어지면 동작하는 순서에 더 유의해야한다고 말하고 있다. 궁금한 경우 좋은 글들을 읽어보자 ~
공식문서(글이 자세하진 않음): https://docs.spring.io/spring-boot/docs/current/reference/htmlsingle/#howto.data-initialization
JPA/hibernate: https://wildeveloperetrain.tistory.com/228
마이그레이션 툴(flyway/liquibase): https://devbksheen.tistory.com/entry/Spring-boot-Flyway%EB%A1%9C-%EB%8D%B0%EC%9D%B4%ED%84%B0%EB%B2%A0%EC%9D%B4%EC%8A%A4-%ED%98%95%EC%83%81%EA%B4%80%EB%A6%AC