JPA의 ddl-auto 옵션은 각각 어떤 동작을 하고 어떤 상황에 사용해야 하는가
ddl-auto가 무엇인가
ddl-auto란 hibernate.hbm2 ddl.auto의 줄임말이다.
스프링 부트 애플리케이션에서 Hibernate와 같은 JPA 구현체를 사용할 때 데이터베이스 스키마 관리를 제어를 해주는 설정이다.
ddl-auto는 애플리케이션을 실행하는 시점에서 DB의 스키마들을 설정 옵션대로 처리해 준다.
옵션들로는 다음과 같다.
1.create
기존 테이블을 삭제하고 애플리케이션을 실행할 때마다 삭제하고 새로 생성한다.
애플리케이션을 실행할 때 DROP과 CREATE가 실행된다.
기존 데이터가 계속해서 삭제되므로 테스트 환경에서만 사용된다고 생각하면 된다.
2.create-drop
create와 동일하지만, 애플리케이션이 종료되는 시점에서 drop 한다.
테스트 케이스 실행, 단위 테스트에서 주로 사용된다.
3.update
기존 스키마를 유지하고, 새로운 데이터만 추가한다.
이미 만들어진 테이블에는 영향이 없고 운영 DB에서는 칼럼 삭제가 반영되지 않아 조심해야 한다.
4.validate
엔티티와 테이블이 정상적으로 매핑이 되었는가만 검증해 준다.
검증이 실패된다면 애플리케이션이 실행이 되지 않는다.
프로덕션 환경에서 엔티티와 데이터베이스 스키마가 일치하는지 확인하고 싶을 때 사용한다.
5.none
DDL 자동생성 기능을 사용하지 않는다.
ddl-auto를 설정하지 않는 것과 동일한 결과이지만, 명시적으로 의도를 파악할 수 있다는 점에서 사용하면 좋을 것 같다.
이 옵션들은 application.yml 또는 application.properties파일에서 설정할 수 있다.
DDl-AUTO 사용의 장단
* 개발 생산성 향상
개발 초기에 DB를 미리 설정하여 연결하지 않고도 신속하게 DB스키마를 생성이 가능하여 개발 생산성이 향상될 수 있다.
코드의 엔티티 클래스를 수정하는 것만으로도 DB스키마가 자동으로 반영이 되어 매우 편리하다.
일반적으로 별도의 SQL스크립트 작성 없이 구현이 가능하다.
* 편리한 테스트 환경 구성
ddl-auto의 원하는 옵션을 설정함으로써 테스트마다 개발 환경을 원하는 대로 유지할 수 있다.
테스트 데이터, 쓰레기 값들을 초기화가 용이하다.
* 데이터베이스 독립성
JPA가 자동으로 각 DB에 맞는 DDL을 생성한다.
특정 DB에 종속되지 않는 테이블 생성이 가능하다.
하지만 인덱스나 제약조건 같은 세부적인 설정이 제한적이고, 복잡한 스키마 변경을 자동화하기 어렵다는 점에서 단점이 있다.
실수로 잘못된 옵션을 설정해서 데이터에 문제가 생길 수 있다는 단점도 있는데 이건 본인이 실수를 안 하면 되니 괜찮다.
운영 환경에서는 Flyway나 Liquibase 같은 전문 마이그레이션 도구를 사용하는 게 권장된다고 한다.
결론: ddl-auto 사용은 개발 단계나 테스트 환경에서 장점이 많아 유용하게 사용할 수 있다고 생각된다.
실제 프로젝트에서 활용할 때 개발 환경과 운영 환경을 명확히 구분하여 사용하는게 중요하다.