들어가며
스프링 부트 프로젝트를 시작할 때, application.yml 파일을 생성하여 설정하다보면, 항상 맞이하게 되는 spring.jpa.hibernate.ddl-auto 옵션이 있습니다. 처음에는 create와 update로만 설정하곤 했지만, 더 다양한 옵션이 존재합니다. 해당 포스팅에서는 JPA의 ddl-auto의 각 옵션들은 어떻게 동작하는지와 어떤 환경에서 사용해야 하는걸까에 대해 정리해보았습니다.
❏ ddl-auto란?
ddl-auto란 JPA 구현체인 Hibernate가 엔티티 클래스 기반으로 데이터베이스 스키마를 어떻게 생성하거나 검증할지 결정하는 설정값입니다.
spring:
jpa:
hibernate:
ddl-auto: update
application.yml 파일에 위처럼 설정하여 사용하여, 애플리케이션의 실행에 따라 어떤 방식으로 데이터베이스 스키마를 관리할지 제어할 수 있습니다.
❍ create
create는 기존 테이블을 모두 삭제하고, 엔티티 클래스를 기반으로 매핑되는 테이블을 자동으로 새로 생성합니다. DROP + CREATE
따라서, 기존 테이블에서의 데이터는 모두 삭제되며, 개발 초기에 구조를 자주 변경하는 경우에 유용하게 사용됩니다. 운영 환경에서는 아무래도 적합하지 않습니다. ☹️
❍ create-drop
create-drop은 create에서 추가적으로 애플리케이션 종료 시에 테이블을 모두 삭제한다는 특징이 있습니다. 매 테스트마다 초기화된 데이터베이스가 필요하다면 해당 옵션을 유용하게 사용할 수 있습니다. 👍
❍ update
update는 엔티티 클래스와 매핑되는 테이블에 변경 사항을 반영하여 자동으로 수정합니다. 기존 데이터가 삭제되지 않고 유지되며, 새로운 컬럼이 추가되는 등의 변동 사항이 반영됩니다.
하지만 모든 변경 사항에 대해 반영하는 것이 아닙니다. 예를 들어 String 타입이 int 타입으로 변경된 컬럼이 존재할 때, 이러한 변경은 반영되지 않습니다.
엔티티의 변경이 발생할 때 자동으로 업데이트만 하고 싶다면 편리하지만, 이 역시 운영 환경에서는 적합하진 않다고 생각합니다.
❍ validate
validate는 애플리케이션이 실행될 때, 엔티티 클래스와 매핑하며 일치하는지 확인하며 스키마를 변경하지 않습니다. 따라서 운영 배포 전에 확인하는 용이나 운영 도중 엔티티와 일치하는지 검증하는 용도로 사용합니다.
❍ none
none은 그 어떠한 작업도 하지 않습니다. 스키마에 대한 생성이나 변경 작업을 수동으로 관리하고 싶을 때 해당 옵션을 사용하며, 운영 환경에서 주로 사용되는 옵션입니다.
❏ 마무리
개발 환경일 땐, create나 update
테스트 환경일 땐, create-drop
운영 환경일 땐, none이나 validate
를 사용해봅시다!