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.sql
data.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와 함께 사용하는 경우에는 초기화 순서를 조정할 수 있는 설정을 고려해 주시는 것이 좋습니다. 실제 서비스 환경에서는 마이그레이션 도구를 함께 사용하는 것이 바람직합니다.