schema.sql data.sql

가영·2023년 5월 1일
0

목적

스프링부트에서 제공하는 SQL 로딩기능에 사용할 SQL 문을 저장하는 파일.
이는 Spring jdbc의 DataSource 를 초기화하는 것이다.

두 스크립트는 모두 애플리케이션 로딩 시 초기에 실행하고 싶은 sql 문을 작성하게 된다.

  • schema.sql: DDL(Data Definition Language) 를 작성하는 파일
  • data.sql: DML(Data Manipulation Language) 를 작성하는 파일

이렇게, 두 스크립트 파일명은 엄밀히 다른 목적의 스크립트를 작성하도록 고안되었지만, 사실 한 곳에 다 써도 무방하다고 하다. (하지만 우선순위는 존재하니 좀 더 읽어보자.)

사용방법

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}.sqlschema-${platform}.sql

스프링부트는 application.propertiesspring.datasource.platform 값이 설정되어있을 경우, schema-platform.sql또는data{platform}.sql 또는 data-{platform}.sql 을 실행한다고 한다.

우리는 이 기능을 활용해 데이터베이스 벤더마다 다른 스크립트 파일들을 유지할 수 있다고한다.

// resource/ 디렉터리. mysql과 h2를 번갈아 가며 적용할 수 있다.
schema-mysql.sql
schema-h2.sql
data-mysql.sql
data-h2.sql
spring.dataSource.platform=mysql

Spring JDBC의 Fail-fast 기능

스프링 부트는 기본적으로 스프링 JDBC 이니셜라이저의 fail-fast 기능을 활성화합니다.
이 말은, 만약 스크립트에서 예외가 발생한다면, 애플리케이션이 시작될 수 없다는 뜻입니다.
이 기본 설정을 변경하기 위해서는 spring.datasource.continue-on-error 를 설정해주어야합니다.

JPA와 함께 사용하는 경우

기본적으로, 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

0개의 댓글