티스토리 뷰
[Spring] schema.sql, data.sql이 적용 안될 때와 그에 맞는 JPA ddl-auto 설정
zi존코딩맨 2025. 12. 29. 10:15
프로젝트 내부의 schema.sql을 사용하려는 이유
application-yml에 spring:jpa:hibernate:ddl-auto를 validate, none을 두고,
직접 DB에 쿼리문을 계속 실행하고 있었다.
개발하면서 수정할게 있으면 ERD, 노션(문서), 쿼리문 수정을 해야하니 여간 귀찮은게 아니였다.
DDL문 수정하고, DML문으로 데이터 넣고...
그래서 프로젝트 내에서 쿼리문만 수정하고 바로 기동하면 적용되도록 schema.sql, data.sql을 이용하여 편하게 개발을 하려고 한다.
schema.sql, data.sql 만으로 쿼리가 실행되지 않는다.
파일만 생성해두고, 기동해보았지만 뭐 달라지는게 없었다.
삽질 1) ddl-auto: create로 변경하고, 로컬 서버 기동 (실패)
내가 의도하는 schema.sql로 실행되게 아니라 엔티티 기준으로 테이블이 생성되 었다.
그리고 엔티티 기준으로 생성되어서 그런지 원하지 않는 UNIQUE 제약조건까지 생겼다.

삽질 2) ddl-auto: create를 그대로 두고, spring:sql:init:mode 옵션을 추가 (실패)
스프링 공식문서에 보면 https://github.com/spring-projects/spring-boot/wiki/Spring-Boot-2.7-Configuration-Changelog
Spring Boot 2.7 Configuration Changelog
Spring Boot helps you to create Spring-powered, production-grade applications and services with absolute minimum fuss. - spring-projects/spring-boot
github.com

이것과 같이 옵션명이 변경되었고, sql을 사용할 수 있도록 always 라는 옵션으로 설정해 주었다.
spring:
sql:
init:
mode: always # 스크립트 실행 활성화
jpa:
hibernate:
ddl-auto: create
show-sql: true
properties:
hibernate:
format_sql: true
database: postgresql
우선 내가 의도 하려는 schema.sql, data.sql문은 실행이 안될 뿐더러
create 할 때, 엔티티 기준으로 생성되어서 그런지 원하지 않는 UNIQUE 제약조건까지 생겼다.
삽질3) 실행할 쿼리.sql 지정과 ddl-auto 옵션 valudate, none으로 설정 (성공)
기동할 때 마다 create로 하는건 validate로 꺼주고,
내가 의도한 schema.sql, data.sql을 실행하도록 해당 위치에 실행하도록 설정해주었다.

spring:
sql:
init:
mode: always # 스크립트 실행 활성화
schema-locations: classpath:sql/schema.sql
data-locations: classpath:sql/data.sql
jpa:
hibernate:
ddl-auto: validate
show-sql: true
properties:
hibernate:
format_sql: true
defer-datasource-initialization: false
database: postgresql

defer-datasource-initialization: false 옵션 설명
이 옵션은 쉽게 말해 "JPA야, 나대지 말고(?) 잠깐 기다려. 내가 SQL 스크립트 먼저 돌리고 올게" 라고 순서를 정해주는 옵션이다.
- false : "데이터소스 초기화(SQL 스크립트)를 미루지마!" (defer = False). 즉, 지금 당장, JPA 보다 먼저 실행해!
- true : "SQL 스크립트 실행을 나중으로 미뤄 (defer = True)" 즉, JPA가 테이블 다 만들고 나면 그 다음에 실행해!
나는 ddl-auto를 validate로 두었기 때문에 SQL 스크립트를 먼저 실행했어야 했다.
그래야 JPA가 테이블을 유효성 검사를 하기 때문이다.
뭐 ddl-auto: none으로 두면 굳이 이 옵션을 둘 필요는 없을 것 같다. ^_^

감사합니다.
'백엔드 > 🌸Spring' 카테고리의 다른 글
| [Spring] 실무에서 쓰는 JPA 페이징 전략: Pageable, DTO, MyBatis 비교까지 (0) | 2025.09.08 |
|---|---|
| [Spring] 여러 개 기동하는 멀티 모듈 기초 세팅 (1) | 2025.09.04 |
| [Spring] API 서버에서 카카오 로그인 구현 (2/2) : 토큰 받고 사용자 정보 조회 (1) | 2025.06.15 |
| [Spring] API 서버에서 카카오 로그인 구현 (1/2) : 인가 코드 받기 (1) | 2025.05.19 |
| [Spring] 멀티 모듈 설계 : 도메인, API, 테스트 환경 세팅 전략까지 (1) | 2025.05.13 |
- Total
- Today
- Yesterday
- 개발환경
- Front
- 프로세스
- java
- 트랜잭션
- 디자인패턴
- BFS
- 개발자
- 깃허브 액션
- 알고리즘
- Cors
- 계단 오르기
- 네트워크
- 코딩테스트
- 그리디
- 멀티모듈
- 개발블로그
- 데이터 베이스
- JPA 페이징
- 소셜로그인
- JavaScript
- DART
- Flutter
- 시간 객체
- DBeaver
- 카카오 로그인
- Fetch
- spring
- aws
- 실시간 채팅
| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 1 | 2 | 3 | 4 | 5 | 6 | |
| 7 | 8 | 9 | 10 | 11 | 12 | 13 |
| 14 | 15 | 16 | 17 | 18 | 19 | 20 |
| 21 | 22 | 23 | 24 | 25 | 26 | 27 |
| 28 | 29 | 30 | 31 |
