ddl-auto: validate를 Liquibase와 함께 쓰면 안 되는 이유
1. 두 개의 "진실의 원천"이 충돌
- Liquibase: changelog 파일이 데이터베이스 스키마의 유일한 Single Source of Truth.
- Hibernate
validate: JPA 엔티티(@Entity)가 Single Source of Truth라고 가정. - 결과적으로 기준이 2개가 되며, Liquibase로 정상 변경해도 Hibernate가 다르다고 판단하면 앱 시작이 차단될 수 있음.
2. 사소한 차이로 애플리케이션 시작 실패
Hibernate 검증 방식과 실제 DB 스키마가 100% 일치하지 않아 다음과 같은 경우 오류 발생 가능:
- 데이터 타입 불일치
예) 엔티티는String인데 Liquibase는VARCHAR(255)로 생성 - 제약조건 이름 불일치
Liquibase 생성 이름과 Hibernate 예상 이름이 다름 - 기본값(Default Value) 차이
Liquibase 설정 값과 Hibernate 인식 값이 다름 - DB 전용 기능 사용
Liquibase raw SQL changeset에서 사용한 특정 DB 전용 타입/함수를 Hibernate가 인식하지 못함
이런 차이로 인해 스키마는 멀쩡해도 validate 단계에서 오류가 발생하여 애플리케이션이 시작되지 않을 수 있음.
3. Liquibase가 이미 검증 역할 수행
- Liquibase는
DATABASECHANGELOG테이블로 모든 changeset 적용 내역을 추적. liquibase update가 성공했다면 changelog와 DB 상태가 일치함을 보증.- Hibernate의
validate는 불필요한 중복 검증이며, 오히려 충돌을 유발할 가능성이 큼.
결론
- Liquibase를 사용할 때는
spring.jpa.hibernate.ddl-auto=none으로 설정. - 스키마 변경/검증은 Liquibase에만 맡기고, Hibernate는 관여하지 않게 해야 함.
- 이렇게 하면 두 도구의 역할이 명확히 분리되어 충돌 없이 안정적인 운영 가능.
환경별 권장 설정
- 운영(Production):
ddl-auto=none - 개발(Development):
ddl-auto=none권장
(필요 시validate로 임시 검증 가능하나, 가급적 Liquibase만 사용)