Spring Boot에서 JPA와 Hibernate를 사용할 때, `spring.jpa.hibernate.ddl-auto` 설정은 애플리케이션이 실행될 때 데이터베이스 스키마를 어떻게 관리할지 결정하는 역할을 한다.
1. spring.jpa.hibernate.ddl-auto=create
- 애플리케이션이 시작될 때 기존 테이블을 삭제하고(DROP), 다시 생성(CREATE)함
- 애플리케이션 실행 시마다 모든 데이터가 초기화됨
- 실무에서는 사용하면 안 됨 (테스트 환경에서만 유용)
📌 실행 과정
- 기존 테이블을 DROP TABLE로 삭제
- CREATE TABLE로 새롭게 테이블을 생성
- 애플리케이션이 종료될 때까지 새로운 데이터를 저장할 수 있음
- 애플리케이션을 다시 실행하면 모든 데이터가 삭제됨
2. ddl-auto의 옵션
옵션 | 설명 | 사용 환경 |
`none` | DDL 실행 X | 운영 환경 |
`create` | 기존 테이블 삭제(DROP) 후 새로 생성(CREATE) | 개발 & 테스트 환경 |
`create-drop` | `create`와 동일하지만, 애플리케이션 종료 시 테이블 삭제 | 일시적인 테스트 환경 |
`update` | 변경된 엔티티에 맞춰 스키마 업데이트 (데이터 유지) | 개발 환경 |
`validate` | 현재 DB와 엔티티가 일치하는지 확인 (불일치 시 오류 발생) | 운영 환경 |
3. 각 옵션 상세 설명
`none` (기본값, DDL 실행 안 함)
spring.jpa.hibernate.ddl-auto=none
- Hibernate가 DDL을 실행하지 않음
- 운영 환경에서 사용해야 함 (DB 스키마 변경 없이 유지)
🎯 사용 사례
- 운영 환경 (데이터베이스는 DBA가 직접 관리)
- 기존 테이블을 그대로 유지하고 Hibernate가 자동으로 건드리지 않도록 해야 할 때
`create` (테이블 삭제 후 새로 생성)
spring.jpa.hibernate.ddl-auto=create
- 기존 테이블을 삭제하고 새로 생성 (DROP & CREATE)
- 애플리케이션 실행 시 모든 데이터가 초기화됨
- 테스트 환경에서만 사용 (실무에서는 사용 금지!)
🎯 사용 사례
- 초기 개발 단계에서 빠르게 테이블 구조를 바꿔가며 테스트할 때
- 마이그레이션이 필요 없는 간단한 프로젝트
`create-drop` (애플리케이션 종료 시 테이블 삭제)
spring.jpa.hibernate.ddl-auto=create-drop
- create와 동일하지만, 애플리케이션 종료 시 테이블을 삭제함
- 단기 테스트 환경에서 유용
🎯 사용 사례
- 단기 테스트 환경에서 애플리케이션 실행 중에만 데이터 유지
- 종료 후 자동으로 초기화되기 때문에 일회성 테스트에 적합
`update` (기존 데이터 유지하면서 스키마 변경)
spring.jpa.hibernate.ddl-auto=update
- 기존 테이블을 유지하면서 엔티티 변경 사항을 반영함
- 데이터는 삭제되지 않음
- 제약 조건 추가/삭제, 기존 컬럼 타입 변경 등은 반영되지 않음
🎯 사용 사례
- 로컬 개발 환경에서 데이터를 유지하면서 변경 사항만 반영할 때
- 주의할 점: 완벽한 마이그레이션을 보장하지 않으므로, 운영 환경에서는 사용 금지
`validate` (엔티티와 DB 일치 여부만 검사)
spring.jpa.hibernate.ddl-auto=validate
- DB 스키마를 변경하지 않음
- 애플리케이션 시작 시 엔티티와 DB 테이블이 일치하는지 확인
- 불일치하면 애플리케이션이 실행되지 않음
🎯 사용 사례
- 운영 환경에서 추천 (DDL 자동 변경을 방지하면서 스키마 검증 가능)
- 스키마가 올바르게 유지되는지 확인하는 용도로 사용
4. 정리
옵션 | 데이터 유지 여부 | 스키마 변경 여부 | 사용 환경 |
`none` | ✅ 유지됨 | ❌ 변경 없음 | 운영 환경 (DB 직접 관리) |
`create` | ❌ 초기화됨 | ✅ 변경됨 | 개발/테스트 |
`create-drop` | ❌ 종료 시 삭제 | ✅ 변경됨 | 일시적인 테스트 |
`update` | ✅ 유지됨 | ⚠️ 일부 변경됨 | 개발 환경 |
`validate` | ✅ 유지됨 | ❌ 변경 없 | 운영 환경 |
'Java Study > Frameworks' 카테고리의 다른 글
[Spring] JPA 연관관계 매핑 확실하게 알아보기❗ (0) | 2025.02.14 |
---|---|
[Spring] @Transactional을 어디에 붙여야 할까🤔❔ (0) | 2025.02.12 |
[Spring] JPA 영속성 컨텍스트와 JOIN 활용 (0) | 2025.02.12 |
[Spring] JPA에서 꼭 알아야 할 개념: 영속성 (0) | 2025.02.10 |
[Spring] Spring Data JPA에서 @Repository를 사용하지 않는 이유 (1) | 2025.02.09 |