Spring Boot에서 schema.sql 및 data.sql의 역할과 사용 방법
Spring Boot는 애플리케이션 실행 시 데이터베이스를 자동으로 초기화할 수 있는 기능을 제공합니다. 이때 src/main/resources 경로에 위치한 schema.sql과 data.sql 파일은 특별한 의미를 가지며, Spring Boot에서 공식적으로 지원하는 초기화 스크립트로 동작합니다.
1. 파일의 역할
다음 표는 각 파일의 역할을 정리한 내용입니다.
| 파일명 | 설명 |
|---|---|
schema.sql |
데이터베이스 스키마 정의 (테이블, 시퀀스 등 DDL) |
data.sql |
초기 데이터 삽입 (INSERT 문 등 DML) |
이 두 파일은 classpath의 루트 경로에 존재하면, Spring Boot가 자동으로 인식하여 실행하게 됩니다.
2. 실행 순서
Spring Boot는 애플리케이션 시작 시 다음과 같은 순서로 SQL 스크립트를 실행합니다.
schema.sqldata.sql
먼저 테이블 등의 스키마를 생성하고, 이후 해당 스키마에 데이터를 삽입하는 방식으로 동작합니다.
3. 적용 조건
schema.sql과 data.sql은 JDBC 기반의 DataSource가 사용될 경우 기본적으로 적용됩니다. Spring Data JPA와 함께 사용하는 경우에는 추가적인 설정이 필요할 수 있습니다.
4. 관련 설정
Spring Boot 2.5 이상 버전에서는 SQL 초기화 동작을 보다 명확하게 제어할 수 있도록 아래와 같은 프로퍼티를 제공합니다.
spring.sql.init.mode=always
| 값 | 설명 |
|---|---|
always |
항상 SQL 스크립트를 실행합니다. |
embedded |
내장형 데이터베이스(H2, HSQL, Derby 등)에 대해서만 실행됩니다. |
never |
SQL 스크립트를 실행하지 않습니다. |
또한, JPA를 함께 사용하는 경우에는 data.sql이 테이블 생성보다 먼저 실행되어 오류가 발생할 수 있습니다. 이러한 경우에는 다음과 같은 설정을 추가하시면 도움이 됩니다.
spring.jpa.defer-datasource-initialization=true
이 설정은 JPA가 먼저 테이블을 생성한 이후에 data.sql이 실행되도록 순서를 조정해 줍니다.
5. 사용 예시
다음은 schema.sql과 data.sql의 간단한 예시입니다.
schema.sql
CREATE TABLE users (
id BIGINT PRIMARY KEY,
username VARCHAR(100),
password VARCHAR(100)
);
data.sql
INSERT INTO users (id, username, password) VALUES (1, 'admin', '1234');
6. 유의사항
- 운영 환경에서는
schema.sql과data.sql보다는 Flyway 또는 Liquibase와 같은 데이터베이스 마이그레이션 도구를 사용하는 것이 더욱 안정적입니다. data.sql은 주로 테스트나 데모용으로 사용되며, 복잡한 초기화 로직에는 적합하지 않을 수 있습니다.- 가급적이면 DDL과 DML을 분리하여 각각의 파일에 명확히 작성하시는 것을 권장드립니다.
7. 결론
schema.sql과 data.sql은 Spring Boot에서 데이터베이스 초기화를 간단하게 처리할 수 있는 공식적인 방법입니다. 테스트나 간단한 환경에서는 매우 유용하게 활용될 수 있으며, JPA와 함께 사용하는 경우에는 초기화 순서를 조정할 수 있는 설정을 고려해 주시는 것이 좋습니다. 실제 서비스 환경에서는 마이그레이션 도구를 함께 사용하는 것이 바람직합니다.