스프링 부트를 사용하던 중, src/main/resources/data.sql
파일에 작성된 CREATE TABLE 문 그대로 DB가 초기화된 것을 확인했습니다.
application.properties
를 봐도 별다른 설정이 되어 있지 않은데, 이게 어떻게 가능한지 궁금했습니다.
스프링 공식문서를 참고하면, 다음과 같이 설명합니다.
86.3 Initialize a Database
Spring Boot can automatically create the schema (DDL scripts) of yourDataSource
and initialize it (DML scripts).
It loads SQL from the standard root classpath locations:schema.sql
anddata.sql
스프링 부트는 기본적으로 classpath 내에 있는 scehma.sql
과 data.sql
파일에 작성된 DDL, DML을 읽습니다.
그리고 해당 스크립트를 통해 데이터베이스를 초기화할 수 있습니다.
이어서, 아래와 같이 설명합니다.
Spring Boot processes the
schema-${platform}.sql
anddata-${platform}.sql
files (if present), whereplatform
is the value ofspring.datasource.platform
.
This allows you to switch to database-specific scripts if necessary
…
스프링 부트는 schema-${platform}.sql
또는 data-${platform}.sql
파일 또한 처리할 수 있습니다.
이때 ${platform}
값은 application.properties
를 통해 각 데이터베이스 벤더사(h2, oracle, mysql)로 설정할 수 있습니다.
이를 통해 사용하는 DB 시스템이 바뀌어도 다른 sql 파일로 갈아끼워줄 수 있습니다.
data-oracle.sql
CREATE TABLE user (
id NUMBER CONSTRAINT pk_user PRIMARY KEY,
name VARCHAR2(50) NOT NULL,
age NUMBER
);
data-mysql.sql
CREATE TABLE your_table_name (
id INT PRIMARY KEY,
name VARCHAR(50) NOT NULL,
age INT
);
같은 내용의 쿼리문을 각각 oracle과 mysql 문법에 맞게 작성한 파일입니다.
application.properties
#spring.datasource.platform=mysql -> deprecated
spring.sql.init.platform=mysql
공식문서에서는
spring.datasource.platform
에 platform을 명시해주면 된다고 하지만, 이는 deprecate됐기 때문에spring.sql.init.platform
을 사용하면 됩니다. (IntelliJ가 추천해줌)
application.properties
파일에서 spring.sql.init.platform
값을 통해 어떤 파일을 읽을지 선택할 수 있습니다.
현재는 값을 mysql로 설정했기 때문에 data-mysql.sql
파일의 내용을 읽고 데이터베이스를 초기화합니다.
DB를 오라클로 바꾸게 되었다면 해당 설정값만 바꿈으로써 그에 맞는 DDL을 실행할 수 있습니다.
참고로, 설정해주는 값은 실제로 존재하는 벤더사가 아니어도 됩니다.
spring.sql.init.platform=yujamint
로 설정 시, data-yujamint.sql
파일 load+) spring.sql.init.platform=mysql
로 설정되어 있을 때, data.sql
파일도 존재하고 data-mysql.sql
파일도 존재한다면 두 파일 모두 적용됩니다.
application.properties
#spring.datasource.initialization-mode=always -> deprecated
spring.sql.init.mode=always
마찬가지로, 공식문서에서 설명하는
spring.datasource.initialization-mode
는 deprecate됐기 때문에spring.sql.init.mode
를 사용하면 됩니다.
spring.sql.init.mode
설정을 통해 초기화 모드를 설정할 수 있습니다.
always
: 말 그대로 서버를 킬 때마다 작성한 sql 파일을 통해 초기화합니다.never
: 초기화를 하지 않습니다.테스트를 위한 In-Memory DB가 아닌, 실제 프로덕션에 쓰일 DB라면 always
로 설정을 하여 테이블과 데이터를 세팅하고, 그 뒤로는 never
로 설정을 하여 초기화되지 않도록 하는 방법도 고려할 수 있을 것 같습니다.