Spring Boot 애플리케이션을 처음 실행했을 때 이런 에러를 본 적 있나요?
Table 'mydb.users' doesn't exist
분명 Flyway 마이그레이션 스크립트에 CREATE TABLE users ... 구문을 작성했는데 왜 테이블이 없다고 할까요?
이 문제의 핵심은 초기화 순서에 있습니다. Hibernate가 Flyway보다 먼저 실행되면서 아직 생성되지 않은 테이블을 검증하려다 실패하는 것이죠.
spring:
jpa:
hibernate:
ddl-auto: validate # ⭐ 엔티티와 DB 스키마가 일치하는지만 검증
| 옵션 | 동작 | 프로덕션 사용 |
|---|---|---|
| validate | DB 스키마와 엔티티 일치 여부만 검증 (변경 없음) | ✅ 권장 |
| update | 엔티티에 맞춰 DB 스키마 자동 수정 | ⚠️ 위험 (컬럼 삭제 안됨) |
| create | 매번 테이블 DROP 후 재생성 | ❌ 절대 사용 금지 |
| create-drop | 애플리케이션 종료 시 테이블 삭제 | ❌ 테스트 용도만 |
| none | 아무것도 안 함 | ✅ Flyway 사용 시 |
1. 안전성
2. 명확한 책임 분리
3. 배포 안정성
개발자 A: User 엔티티에 email 컬럼 추가
개발자 B: Flyway 마이그레이션 스크립트 작성 (V2__add_email_column.sql)
❌ update 사용 시: 개발자 B가 마이그레이션 스크립트를 안 만들어도 동작함
→ 배포 시 스크립트 누락 → 프로덕션 장애
✅ validate 사용 시: 마이그레이션 스크립트 없으면 즉시 에러 발생
→ 배포 전에 문제 발견 가능
1️⃣ Hibernate 초기화 시작
→ "User 엔티티가 있네? DB에 users 테이블이 있는지 확인해야지!"
2️⃣ DB 확인
→ "어? users 테이블이 없는데요? 🚨"
💥 org.hibernate.tool.schema.spi.SchemaManagementException:
Schema-validation: missing table [users]
3️⃣ 애플리케이션 시작 실패
→ Flyway는 실행조차 못함
1️⃣ Flyway 마이그레이션 실행
→ V1__create_users_table.sql 실행
→ CREATE TABLE users (...) ✅
2️⃣ Hibernate 초기화
→ "User 엔티티가 있네? DB에 users 테이블이 있는지 확인해야지!"
→ "있네! 컬럼도 일치하고! ✅"
3️⃣ 애플리케이션 정상 시작 🎉


🤔 그럼 개발자가 직접 순서를 관리해야 하나?
아닙니다! Spring Boot는 이미 자동으로 순서를 보장합니다.
시각적 플로우
// EntityManagerFactory는 이 애노테이션이 붙어있음
@DependsOnDatabaseInitialization
public class LocalContainerEntityManagerFactoryBean { ... }
1. ddl-auto: validate를 사용하는 이유
다음 편에서는: