우리가 JPA를 사용하다보면 application.yml에서 ddl-auto라는 옵션을 설정할 수 있는데 해당 옵션의 기능을 알아보자
해당 옵션은 Hibernate와 같은 JPA 구현테를 사용할 때 데이터베이스 스키마 관리를 제어하는 설정이다. 쉽게말하면 우리가 코드에서 사용하는 엔티티와 실제 데이터베이스 안에 있는 테이블의 연관관계에 대한 설정을 말한다. 해당 옵션에는 none, validate, update, create, create-drop 등이 존재하는데 아래에서 해당 옵션들에 대해 살펴보면 이해가 더 빠를 것이다.
해당 옵션으로 설정하면 데이터베이스 스키마 관련 어떠한 작업도 수행되지 않는다. 데이터베이스를 수동으로만 작업하고 싶을 경우 유용하며 주로 운영환경에서 사용된다.
애플리케이션이 시작될 때 엔티티 매핑이 데이터베이스 스키마와 일치하는지 검증하며 스키마 변경은 따로 수행되지 않는다. 해당 옵션또한 운영환경에서 엔티티와 데이터베이스 스키마가 일치하는지 확인하고 싶을 때 사용된다.
해당 옵션은 엔티티 매핑과 데이터베이스 스키마를 비교하며 필요한 경우에는 스키마를 업데이트한다. 기존 데이터는 유지되지만 새로운 엔티티나 변경된 엔티티 필드는 스키마에 반영이 된다. 해당 옵션은 엔티티에 변경이 발생할 때 자동으로 스키마에 업데이트 하고 싶을 때 유용하고 운영환경에서 사용할 경우 예기치 않는 스키마 변경을 방지하기 위해 주의가 필요하다.
애플리케이션이 시작 될 때 기존 스키마를 삭제하고 새로 생성한다. 데이터가 모두 삭제되며 엔티티 매핑을 기반으로 새로운 스키마가 생성, 개발 초기에 주로 스키마를 반복적으로 생성해야할 때 유용하다. 해당 옵션은 데이터가 애플리케이션이 시작될 때 마다 삭제되므로 운영에서는 사용되지 않는다.
create과 유사하지만 애플리케이션이 종료될 때 데이터가 삭제된다. 해당 옵션은 주로 테스트 환경에서 일시적인 데이터베이스 스키마가 필요할 떄 사용된다.
스키마 변경이 필요하다면 주로 실무에서는 데이터 마이그래이션 배치 작업 도구 사용하여 제어된 방식으로 스키마를 관리하거나 사용자가 적은 새벽에 수동 배치를 돌려 진행하는 경우가 많다.
현재 우리 회사에서도 스키마 변경이 필요할 경우 배치 작업으로 진행을 주로 하고 큰 변경이 일어날 경우 사용자가 새벽 4시경에 작업을 진행한다.