data.sql 파일은 어떻게 자동으로 DB를 초기화하는 것일까?

yujamint·2023년 4월 13일
0

SpringBoot

목록 보기
1/1
post-custom-banner

스프링 부트를 사용하던 중, 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 your DataSource and initialize it (DML scripts).
It loads SQL from the standard root classpath locations: schema.sql and data.sql

스프링 부트는 기본적으로 classpath 내에 있는 scehma.sqldata.sql 파일에 작성된 DDL, DML을 읽습니다.
그리고 해당 스크립트를 통해 데이터베이스를 초기화할 수 있습니다.

이어서, 아래와 같이 설명합니다.

Spring Boot processes the schema-${platform}.sql and data-${platform}.sql files (if present), where platform is the value of spring.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 파일로 갈아끼워줄 수 있습니다.

load할 파일 설정

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을 실행할 수 있습니다.

참고로, 설정해주는 값은 실제로 존재하는 벤더사가 아니어도 됩니다.

  • ex) 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로 설정을 하여 초기화되지 않도록 하는 방법도 고려할 수 있을 것 같습니다.

profile
개발 기록
post-custom-banner

0개의 댓글