JPA의 ddl-auto
옵션은 애플리케이션이 실행될 때 JPA가 데이터베이스 테이블 및 스키마를 어떻게 생성하거나 수정할지를 정의하는 Hibernate의 설정입니다. 이 옵션은 spring.jpa.hibernate.ddl-auto
로 설정할 수 있으며, 다음과 같은 동작을 제공합니다.
1. none
- 동작:
- DDL(Data Definition Language)을 사용하지 않음. JPA가 데이터베이스 스키마를 생성하거나 수정하지 않습니다.
- 사용 상황:
- 이미 데이터베이스 스키마가 완전히 설정되어 있고, JPA가 스키마를 건드리면 안 되는 경우.
- 외부에서 관리되는 데이터베이스(예: DBA가 설계한 데이터베이스)에 연결할 때 적합.
2. validate
- 동작:
- 엔티티와 데이터베이스 테이블 간의 매핑을 검증합니다.
- 스키마를 변경하지 않고, 엔티티 정의와 데이터베이스 테이블의 구조가 일치하는지 확인만 합니다.
- 불일치 시 애플리케이션 실행이 실패합니다.
- 사용 상황:
- 데이터베이스 스키마를 이미 생성했으며, 애플리케이션이 해당 스키마와 정확히 일치하는지 확인하고 싶은 경우.
- 테스트나 배포 환경에서 안전성을 검증할 때 유용.
3. update
- 동작:
- 기존 데이터베이스 스키마를 수정합니다.
- 엔티티 변경 사항(예: 새로운 필드 추가)이 있으면 해당 내용을 반영하여 데이터베이스를 업데이트합니다.
- 기존 데이터는 유지되지만, 일부 구조적인 변경(제약 조건 수정 등)은 반영되지 않을 수 있습니다.
- 사용 상황:
- 로컬 개발 환경에서 엔티티 변경 사항을 데이터베이스에 반영하면서 기존 데이터를 유지해야 할 때.
- 빠른 개발 속도를 위해 사용되지만, 배포 환경에서는 추천되지 않음.
4. create
- 동작:
- 애플리케이션 실행 시 기존 데이터베이스 테이블을 삭제한 후, 엔티티 정의에 따라 새로운 스키마를 생성합니다.
- 모든 기존 데이터가 삭제됩니다.
- 사용 상황:
- 초기 개발 단계에서 사용.
- 데이터 무결성이 중요하지 않은 테스트 환경에서 스키마를 자주 초기화해야 할 때.
5. create-drop
- 동작:
create
와 동일하게 애플리케이션 실행 시 테이블을 생성하지만, 애플리케이션 종료 시 테이블을 삭제(drop) 합니다.
- 사용 상황:
- 단위 테스트 환경에서 사용.
- 애플리케이션 실행 종료 후 데이터를 보존할 필요가 없을 때.
6. none
vs 기본 설정 생략
- 설정을 생략하면 기본적으로
none
으로 작동하지 않고, 특정 환경(로컬 개발, 테스트, 프로덕션)에 따라 Spring Boot가 자동으로 적절한 동작을 설정합니다.
- 로컬 환경:
update
- 프로덕션 환경:
validate
DDL-AUTO 옵션 선택 기준
옵션 | 사용 환경 | 설명 |
---|
none | 프로덕션 | 외부에서 스키마를 관리하며 변경이 필요 없을 때. |
validate | 프로덕션 또는 테스트 | 엔티티와 스키마의 일관성을 검증하고 싶은 경우. |
update | 로컬 개발 | 엔티티 변경 사항을 자동 반영하며, 데이터는 유지. |
create | 초기 개발, 테스트 | 데이터베이스 초기화를 자주 수행해야 할 때. |
create-drop | 단위 테스트 | 테스트 실행 후 데이터베이스가 필요 없는 경우. |
프로덕션 환경에서 스키마 변경
스키마 변경이 필요할 때는 적절한 데이터베이스 마이그레이션 도구(Flyway, Liquibase 등)를 사용하여 제어된 방식으로 스키마를 관리하거나, 사용자가 없는 새벽에 스키마 변경 작업을 수동으로 진행하는 것이 더욱 안전할 수 있습니다.
주의사항
update
와 create
는 프로덕션 환경에서 사용 금지
- 프로덕션 데이터가 손상되거나 무결성이 깨질 위험이 있습니다.
- 스키마 관리 전략 설정
- 실무에서는 DDL 자동 생성을 사용하지 않고, DB 스키마를 수동 관리하거나 마이그레이션 도구(예: Flyway, Liquibase)를 사용하는 것이 일반적입니다.
- validate 추천
- 프로덕션 환경에서는
validate
를 사용하여 예상치 못한 스키마 불일치를 방지할 수 있습니다.
요약
- 로컬 개발:
update
또는 create
.
- 테스트 환경:
create
또는 create-drop
.
- 프로덕션 환경:
validate
또는 none
.
스키마 관리와 데이터 무결성을 위해 프로덕션에서는 데이터베이스 변경을 철저히 통제하는 것이 중요합니다.